使用数据表从 MySQL 中获取特定行

Fetch specific rows from MySQL with datatables

我正在尝试使用特定的“basket_id”获取 MySQL table 中的特定行,并将它们显示在 jQuery DataTables 插件中。

在 DataTables AJAX 请求的 PHP 服务器端脚本中,我在 MySQL..[=14= 的 WHERE 子句中指定了 $user->basketId() ]

让我来引导您完成它..

  1. 用户登录。
  2. USER class 存储用户会话数据。 (使用 public 方法检索数据)
  3. 在仪表板中,用户单击 ITEMS 并看到数据table。

问题是所有用户都看到了所有购物篮中的所有商品。

我已验证 $user->basketId() 方法 return 是用户的正确购物车 ID。

<?php

require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.php";

header('Content-Type: application/json; charset=utf-8');

$con = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);

$output= array();
$sql = "SELECT * FROM items WHERE basket = ".$user->basketId()."";

$totalQuery = mysqli_query($con,$sql);
$total_all_rows = mysqli_num_rows($totalQuery);

$columns = array(
    0 => 'id',
    1 => 'name',
    2 => 'photo',
    3 => 'quality',
    4 => 'locations',
    4 => 'suppliers',
);

if(isset($_GET['search']['value']))
{
    $search_value = $_GET['search']['value'];
    $sql .= " OR name like '%".$search_value."%'";
    $sql .= " OR quality like '%".$search_value."%'";
    $sql .= " OR locations like '%".$search_value."%'";
    $sql .= " OR suppliers like '%".$search_value."%'";
}

if(isset($_GET['order']))
{
    $column_name = $_GET['order'][0]['column'];
    $order = $_GET['order'][0]['dir'];
    $sql .= " ORDER BY ".$columns[$column_name]." ".$order."";
}
else
{
    $sql .= " ORDER BY name desc";
}

if($_GET['length'] != -1)
{
    $start = $_GET['start'];
    $length = $_GET['length'];
    $sql .= " LIMIT  ".$start.", ".$length;
}   

$query = mysqli_query($con,$sql);
$count_rows = mysqli_num_rows($query);
$data = array();
while($row = mysqli_fetch_assoc($query))
{
    $sub_array = array();
    $sub_array[] = $row['name'];
    $sub_array[] = '<img src="'.$config['app_url'].'includes/assets/img/item_photos/'.substr($row['photo'], strrpos($row['photo'], '/') + 1).'" class="img-fluid rounded-circle dt-img" alt="Item Photo">';
    $sub_array[] = $row['quality'];
    $sub_array[] = $row['locations'];
    $sub_array[] = $row['suppliers'];
    $sub_array[] = '<button class="btn btn-outline-info btn-sm update-class-modal" data-toggle="modal" data-target="#update-class-modal" id="'.$row['id'].'" type="button"><span><i class="fad fa-pencil"></i></span></button> <button class="btn btn-outline-danger btn-sm" data-toggle="modal" data-target="#confirm-delete-class" id="'.$row['id'].'" type="button"><span><i class="fad fa-trash"></i></span></button>';
    $data[] = $sub_array;
}

$output = array(
    'draw'=> intval($_GET['draw']),
    'recordsTotal' =>$count_rows ,
    'recordsFiltered'=>   $total_all_rows,
    'data'=>$data,
);

echo json_encode($output, JSON_PRETTY_PRINT);

我不确定为什么,但无论我登录哪个用户以及使用哪个购物车 ID returned,datatables 总是获取项目 table.

因此,在使用我能想到的所有关键字进行一些研究后,我得出了一个答案。

DataTables 已经提供了一个 SSP.php 库,它是 PHP 的服务器端处理 Class。

使用 SSP::complex() 方法我们可以定义两个额外的条件:

SSP::complex( $request, $conn, $table, $primaryKey, $columns, $whereResult=null, $whereAll=null )
  1. $whereResult=null

这是数据 AFTERWHERE 子句,它已从数据库 table 中获取,因此这将过滤 [= 之后的结果48=] 结果是 returned.

  1. $whereAll=null

这是数据 BEFORE 从数据库中获取数据的 WHERE 子句,因此这将在 [= 之前​​添加一个 WHERE 条件48=] 查询并且只会 return 匹配的结果。

完成所有操作后,我的最终 get_items.php AJAX 文件看起来像

<?php

require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/init.php";
header('Content-Type: application/json; charset=utf-8');

// Database connection info 
$dbDetails = array( 
    'host' => 'redacted', 
    'user' => 'redacted', 
    'pass' => 'redacted', 
    'db'   => 'redacted' 
); 
 
// DB table to use 
$table = 'items'; 
 
// Table's primary key 
$primaryKey = 'id'; 
 
// Array of database columns which should be read and sent back to DataTables. 
// The `db` parameter represents the column name in the database.  
// The `dt` parameter represents the DataTables column identifier. 
$columns = array( 
    array( 'db' => 'id',  'dt' => 0 ), 
    array( 'db' => 'name',      'dt' => 1 ), 
    array( 'db' => 'photo',     'dt' => 2 ), 
    array( 'db' => 'quality',    'dt' => 3 ), 
    array( 'db' => 'locations',    'dt' => 4 ),
    array( 'db' => 'suppliers', 'dt' => 5 )
);
 
// Output data as json format 
echo json_encode( 
    SSP::complex( $_GET, $dbDetails, $table, $primaryKey, $columns, null, "school = {$user->basketId()}" )
);