ขอคำแนะนำหน่อยครับ เกี่ยวกับ datatable และการดึงข้อมูลมาแสดงเฉพาะ ID ที่กำหนด
ผมใช้ Datatable ตามโค้ดด้านล่าง
Code (PHP)
<?php
function SheetStatus($Type)
{
if($Type == "ACTIVE")
{
$Icons = "<div class='btn btn-lg btn-eable btn-circle'></div>";
return $Icons;
}
else
{
$Icons = "<div class='btn btn-lg btn-disable btn-circle'></div>";
return $Icons;
}
}
/* ทำการย้าย สลับ นิดหน่อย เอา id มาต่อท้าย */
$aColumns = array('Sheet_Name', 'Sheet_Detail', 'Sheet_Date', 'Sheet_Status', 'Sheet_Count', 'Sheet_Author', 'SheetID');
/* กำหนด primary key ให้กับคอลัมน์ */
$sIndexColumn = "SheetID";
/* ชื่อตาราง */
$sTable = "tb_sheet";
/* ส่วนของการเชื่อมต่อฐานข้อมูล */
$gaSql['user'] = "root";
$gaSql['password'] = "12345678";
$gaSql['db'] = "edoc";
$gaSql['server'] = "localhost";
/* ถ้าเกิดต้องการนำเข้าแบบไฟล์ ก็ต้อง ปิดตรงส่วนการเชื่อมต่อด้านบน แล้วใช้ โค้ดด้านล่างนี้แทน */
//include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" );
/* * MySQL connection*/
$gaSql['link'] = mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password'] ) or
die( 'Could not open connection to server' );
mysql_select_db( $gaSql['db'], $gaSql['link'] ) or
die( 'Could not select database '. $gaSql['db'] );
mysql_query("SET NAMES UTF8");
/* * แบ่งหน้า */
$sLimit = "";
if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
{
$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
mysql_real_escape_string( $_GET['iDisplayLength'] );
}
/* * จัดเรียงลำดับ */
$sOrder = "";
if ( isset( $_GET['iSortCol_0'] ) )
{
$sOrder = "ORDER BY ";
for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ )
{
if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" )
{
$sOrder .= $aColumns[ intval( $_GET['iSortCol_'.$i] ) ]."
".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
}
}
$sOrder = substr_replace( $sOrder, "", -2 );
if ( $sOrder == "ORDER BY" )
{
$sOrder = "";
}
}
$sWhere = "";
if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" )
{
$sWhere = "WHERE (";
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
}
$sWhere = substr_replace( $sWhere, "", -3 );
$sWhere .= ')';
}
/* เวลาค้นหาในคอลัมน์ */
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
{
if ( $sWhere == "" )
{
$sWhere = "WHERE ";
}
else
{
$sWhere .= " AND ";
}
$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' ";
}
}
/**คำสั่ง SQL ดึงข้อมูลออกมาโชว์* */
$sQuery = "
SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
FROM $sTable
$sWhere
$sOrder
$sLimit
";
$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
/* จำนวนข้อมูลหลังจากค้นหา */
$sQuery = "
SELECT FOUND_ROWS()
";
$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
$iFilteredTotal = $aResultFilterTotal[0];
/* จำนวนทั้งหมด */
$sQuery = "
SELECT COUNT(".$sIndexColumn.")
FROM $sTable
";
$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$aResultTotal = mysql_fetch_array($rResultTotal);
$iTotal = $aResultTotal[0];
/* * ส่วนการแสดงผล*/
$output = array(
"sEcho" => intval($_GET['sEcho']),
"iTotalRecords" => $iTotal,
"iTotalDisplayRecords" => $iFilteredTotal,
"aaData" => array()
);
while ( $aRow = mysql_fetch_array( $rResult ) )
{
$row = array();
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( $aColumns[$i] == "SheetID" ) // ถ้าเจอ collumns ที่มีชื่อว่า id ก็ ให้ แทนที่ ค่าที่จะส่งกลับไปให้ id ด้วย link ข้างล่าง
{
$SheetID = $aRow['SheetID'];
/* เมื่อมาถึงส่วนนี้ก็สามารถ ดึง เอา id ที่เป็น primary key ไปใช้ด้วยแล้ว ส่งไปค่าไปอีกหน้า หรือเขียน javascript function มารับค่าไปทำอะไรต่อ ก็ตามสบายเลยครับ*/
$row[] = "
<a class='view' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetview' ><div class='btn btn-sm btn-outline-secondary'><strong>view</strong></div></a>
<a class='edit' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetedit' ><div class='btn btn-sm btn-outline-info'><strong>edit</strong></div></a>
<a class='status' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetstatus' ><div class='btn btn-sm btn-outline-warning'><strong>status</strong></div></a>
<a class='del' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetdel' ><div class='btn btn-sm btn-outline-danger'><strong>delete</strong></div></a>" ;
}
else if ($aColumns[$i] == "Sheet_Status")
{
$SheetStatusIcon = SheetStatus($aRow["Sheet_Status"]);
$row[] = $SheetStatusIcon;
}
else if ( $aColumns[$i] != ' ' )
{
/* General output */
$row[] = $aRow[ $aColumns[$i] ];
}
}
$output['aaData'][] = $row;
}
echo json_encode( $output );
?>
โดยพื้นฐาน ก็ทำงานได้ปกติครับ แต่ติดที่ว่า datatable ดึงข้อมูลของตาราง tb_sheet มาแสดงทั้งหมด ซึ่งตารางนี่ จะคล้าย ๆ กับการเก็บรายการฟอร์รั่มของเว็บบอร์ด คือเก็บขอมูลของหลาย ๆ user ไว้
แต่ที่ต้องการคือ ให้แสดงเฉพาะข้อมูลของตัวเองที่บันทึกไว้เท่านั้น โดยมี ID ของ user กำกับไว้แล้ว
แต่ไม่รุ้จะปรับคำสั่ง select ของ datable อย่างไรครับ เพื่อให้แสดงแต่ของ user นั้น ๆ
Code (SQL)
CREATE TABLE `tb_sheet` (
`SheetID` int(5) UNSIGNED ZEROFILL NOT NULL,
`Sheet_Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Sheet_Detail` longtext COLLATE utf8_unicode_ci NOT NULL,
`Sheet_Date` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`Sheet_Status` enum('ACTIVE','INACTIVE') COLLATE utf8_unicode_ci NOT NULL,
`Sheet_UserID` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
`Sheet_Count` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Tag : PHP, MySQL, JavaScript, Ajax
ประวัติการแก้ไข 2020-04-28 15:48:24 2020-04-28 19:07:18
Date :
2020-04-28 15:46:13
By :
akkaneetha
View :
835
Reply :
8
ลองดูครับ ใส่ค่า ID ของ User ตรง ????? ครับ
Code
<?php
function SheetStatus($Type)
{
if($Type == "ACTIVE")
{
$Icons = "<div class='btn btn-lg btn-eable btn-circle'></div>";
return $Icons;
}
else
{
$Icons = "<div class='btn btn-lg btn-disable btn-circle'></div>";
return $Icons;
}
}
/* ทำการย้าย สลับ นิดหน่อย เอา id มาต่อท้าย */
$aColumns = array('Sheet_Name', 'Sheet_Detail', 'Sheet_Date', 'Sheet_Status', 'Sheet_Count', 'Sheet_Author', 'SheetID');
/* กำหนด primary key ให้กับคอลัมน์ */
$sIndexColumn = "SheetID";
/* ชื่อตาราง */
$sTable = "tb_sheet";
/* ส่วนของการเชื่อมต่อฐานข้อมูล */
$gaSql['user'] = "root";
$gaSql['password'] = "12345678";
$gaSql['db'] = "edoc";
$gaSql['server'] = "localhost";
/* ถ้าเกิดต้องการนำเข้าแบบไฟล์ ก็ต้อง ปิดตรงส่วนการเชื่อมต่อด้านบน แล้วใช้ โค้ดด้านล่างนี้แทน */
//include( $_SERVER['DOCUMENT_ROOT']."/datatables/mysql.php" );
/* * MySQL connection*/
$gaSql['link'] = mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password'] ) or
die( 'Could not open connection to server' );
mysql_select_db( $gaSql['db'], $gaSql['link'] ) or
die( 'Could not select database '. $gaSql['db'] );
mysql_query("SET NAMES UTF8");
/* * แบ่งหน้า */
$sLimit = "";
if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1' )
{
$sLimit = "LIMIT ".mysql_real_escape_string( $_GET['iDisplayStart'] ).", ".
mysql_real_escape_string( $_GET['iDisplayLength'] );
}
/* * จัดเรียงลำดับ */
$sOrder = "";
if ( isset( $_GET['iSortCol_0'] ) )
{
$sOrder = " ORDER BY ";
for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ )
{
if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" )
{
$sOrder .= $aColumns[ intval( $_GET['iSortCol_'.$i] ) ]."
".mysql_real_escape_string( $_GET['sSortDir_'.$i] ) .", ";
}
}
$sOrder = substr_replace( $sOrder, "", -2 );
if ( $sOrder == "ORDER BY" )
{
$sOrder = "";
}
}
$sWhere = "";
if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" )
{
$sWhere = "WHERE (";
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string( $_GET['sSearch'] )."%' OR ";
}
$sWhere = substr_replace( $sWhere, "", -3 );
$sWhere .= ')';
}
/* เวลาค้นหาในคอลัมน์ */
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
{
if ( $sWhere == "" )
{
$sWhere = "WHERE ";
}
else
{
$sWhere .= " AND ";
}
$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' ";
}
}
$sWhere .= " AND Sheet_UserID = ???????? ";
/**คำสั่ง SQL ดึงข้อมูลออกมาโชว์* */
$sQuery = "
SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
FROM $sTable
$sWhere
$sOrder
$sLimit
";
$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
/* จำนวนข้อมูลหลังจากค้นหา */
$sQuery = "
SELECT FOUND_ROWS()
";
$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
$iFilteredTotal = $aResultFilterTotal[0];
/* จำนวนทั้งหมด */
$sQuery = "
SELECT COUNT(".$sIndexColumn.")
FROM $sTable
";
$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
$aResultTotal = mysql_fetch_array($rResultTotal);
$iTotal = $aResultTotal[0];
/* * ส่วนการแสดงผล*/
$output = array(
"sEcho" => intval($_GET['sEcho']),
"iTotalRecords" => $iTotal,
"iTotalDisplayRecords" => $iFilteredTotal,
"aaData" => array()
);
while ( $aRow = mysql_fetch_array( $rResult ) )
{
$row = array();
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( $aColumns[$i] == "SheetID" ) // ถ้าเจอ collumns ที่มีชื่อว่า id ก็ ให้ แทนที่ ค่าที่จะส่งกลับไปให้ id ด้วย link ข้างล่าง
{
$SheetID = $aRow['SheetID'];
/* เมื่อมาถึงส่วนนี้ก็สามารถ ดึง เอา id ที่เป็น primary key ไปใช้ด้วยแล้ว ส่งไปค่าไปอีกหน้า หรือเขียน javascript function มารับค่าไปทำอะไรต่อ ก็ตามสบายเลยครับ*/
$row[] = "
<a class='view' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetview' ><div class='btn btn-sm btn-outline-secondary'><strong>view</strong></div></a>
<a class='edit' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetedit' ><div class='btn btn-sm btn-outline-info'><strong>edit</strong></div></a>
<a class='status' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetstatus' ><div class='btn btn-sm btn-outline-warning'><strong>status</strong></div></a>
<a class='del' data-fancybox-type='iframe' href='teacher/sheet_change.php?UserID=".$SheetID."&do=sheetdel' ><div class='btn btn-sm btn-outline-danger'><strong>delete</strong></div></a>" ;
}
else if ($aColumns[$i] == "Sheet_Status")
{
$SheetStatusIcon = SheetStatus($aRow["Sheet_Status"]);
$row[] = $SheetStatusIcon;
}
else if ( $aColumns[$i] != ' ' )
{
/* General output */
$row[] = $aRow[ $aColumns[$i] ];
}
}
$output['aaData'][] = $row;
}
echo json_encode( $output );
?>
ประวัติการแก้ไข 2020-04-28 16:25:04
Date :
2020-04-28 16:24:24
By :
arm8957
บางอย่างของ datatable มันยุ่งยากนะครับ สู้ ทำเป็น request ไปคิวรี่ ใหม่จาก server ไม่ได้
Date :
2020-04-28 16:44:11
By :
Chaidhanan
คนสอนลงโค๊ดมาให้ดู แต่คนเรียนตอบแค่
ก็ยังไม่ได้
ความคิดโคตรบรมห่วยเลย อย่าเป็นเลยโปรแกรมเมอร์
รู้จักไหมครับ Input/Output/Error/ Code Responding
Date :
2020-04-29 06:09:04
By :
Chaidhanan
ตอบความคิดเห็นที่ : 4 เขียนโดย : arm8957 เมื่อวันที่ 2020-04-28 21:39:07
รายละเอียดของการตอบ ::
ส่วนของ echo $sQuery;
SELECT SQL_CALC_FOUND_ROWS Sheet_Name, Sheet_Detail, Sheet_Date, Sheet_Status, Sheet_Count, Sheet_UserID, SheetID FROM tb_sheet AND Sheet_UserID = '0022' You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND Sheet_UserID = '0022'' at line 3
ในหน้าแสดงผลฟ้อง
DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.
ผมเลยลองเปลี่ยน
$sWhere .= " AND Sheet_UserID = ???????? ";
เป็น
$sWhere .= "WHERE Sheet_UserID = ???????? ";
ได้
SELECT SQL_CALC_FOUND_ROWS Sheet_Name, Sheet_Detail, Sheet_Date, Sheet_Status, Sheet_Count, Sheet_UserID, SheetID FROM tb_sheet WHERE Sheet_UserID = '0022' {"sEcho":0,"iTotalRecords":"2","iTotalDisplayRecords":"1","aaData":[["\u0e43\u0e1a\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48 1","\u0e43\u0e1a\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48 1","22-04-2020","
<\/div>","0","0022","\r\n\t\t\t\t\r\n\t\t\t\t
view<\/strong><\/div><\/a>\r\n\t\t\t\t
edit<\/strong><\/div><\/a>\r\n\t\t\t\t
status<\/strong><\/div><\/a>\r\n\t\t\t\t
delete<\/strong><\/div><\/a>"]]}
แต่ในหน้าแสดงผลก็ยังฟ้อง
DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.
Date :
2020-04-29 11:05:22
By :
akkaneetha
$sWhere .= "WHERE Sheet_UserID = ???????? ";
แบบข้างบน ถ้า $sWhere มีความยาว ก็จะ error อีก แก้เป็น
$sWhere .= ( strlen($sWhere) '? ' and' : ' where' ). ' Sheet_UserID = ???????? ';
ส่วน error
DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.
เอาส่วนที่นำ json แสดงใน html มาดูด้วยครับ
หมายะเหตุ ที่ผมทำจะมีแค่ข้อมูลเท่านั้น ส่วนรูปแบบ จะใช้ เครื่องมือของ datatable นำ ข้อมูลมาจัดการการแสดงผล
คำค้น datatable columns rows create
ประวัติการแก้ไข 2020-04-29 11:47:26
Date :
2020-04-29 11:45:52
By :
Chaidhanan
แนะนำรูปแบบอีกวิธีละกันครับ ในกรณีที่ใช้ query แบบต่อสตริง แบบนี้โค้ดจะสั้นกว่า และไล่ง่ายกว่า
Code (PHP)
$searchQuery = " SELECT * FROM ".$tbl."_product WHERE product_status IN('1','2') AND product_allow_web = '1' ";
$searchQuery .= ! empty($searchCategory) ? " AND product_type = ".$searchCategory : '';
$searchQuery .= ( $searchBrand != "" ) ? " AND product_brand = '".$searchBrand."' " : '';
$searchQuery .= ( $searchColor != "" ) ? " AND product_color = '".$searchColor."' " : '';
$searchQuery .= ( $searchTypeFuel != "" ) ? " AND product_type_fuel = '".$searchTypeFuel."' " : '';
$searchQuery .= ( $searchMileage[1] != '' ) ? " AND (product_mileage BETWEEN ".$searchMileage[0]." AND ".$searchMileage[1].") " : '';
$searchQuery .= ( $searchGears != "" ) ? " AND product_gears = '".$searchGears."' " : '';
$searchQuery .= ! empty($searchSeat) ? " AND product_seat = '".$searchSeat."' " : "";
$searchQuery .= ( $searchModel != '' ) ? " AND product_series LIKE '%".$searchModel."%' " : "";
$searchQuery .= ( $searchEngine != '' ) ? " AND product_engine = '".$searchEngine."' " : "";
$searchQuery .= " AND (product_price_3 BETWEEN ".$searchStartPrice." AND ".$searchEndtPrice.") ";
$searchQuery .= " AND (product_year BETWEEN ".$searchStartYear." AND ".$searchEndYear.") ";
Date :
2020-04-29 13:33:42
By :
arm8957
Load balance : Server 03