I’m trying to fetch specific rows in a MySQL table with specific “basket_id”s and display them in the jQuery DataTables plugin.
In the PHP server-side script for the DataTables AJAX request, I specify the $user->basketId()
in a WHERE clause for MySQL..
Let me walk you through it..
- User signs in.
- USER class stores user session data. (use public methods to retrieve data)
- In dashboard user clicks ITEMS and sees a datatable.
The problem is that all users are seeing all items from all baskets.
I have verified that the $user->basketId()
method return the correct basket ID for the user.
<?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);
I’m not sure why, but it doesn’t matter which user I am logged into and which basket ID is returned, datatables always fetches all the items in the items table.
Advertisement
Answer
So, after doing some researching using all the keywords I could think of I came up with an answer.
DataTables already provides an SSP.php
library which is a Server-side Processing Class for PHP.
Using the SSP::complex() method we can define two extra conditions:
SSP::complex( $request, $conn, $table, $primaryKey, $columns, $whereResult=null, $whereAll=null )
$whereResult=null
This is a WHERE
clause for data AFTER it has been fetched from the DB table, so this will filter through results after the SQL results are returned.
$whereAll=null
This is a WHERE
clause for data BEFORE it has been fetched from the DB, so this will add a WHERE
condition before the SQL query and will only return results that match.
After everything my final get_items.php
AJAX file looks like
<?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()}" ) );