我正在服务器端使用数据表,并且一切正常。现在,我试图搜索以获取从代码中的函数attrib()获得的数据。这会为每行添加更多信息,但问题是-无法搜索其数据。
这是可以理解的,因为它在用于搜索数据库的主要 $ sql查询中不存在。有办法解决吗?
我知道这可能很难理解,所以我正在尝试尽可能清楚。请提供更多说明,如果您可以提供帮助。谢谢。
$sql = "SELECT mat_code,mat_descp,short_code_details,approverComment,date_created,
mt.mat_type, mt.mat_desc,
vc.val_class,vc.val_class_desc,
vc.val_cat_code,vc.val_cat_desc,
n.noun_name,n.qualifier,n.shorttext_item,
u.uombs,
mg.mtgp_id,mg.mtgp_desc,
pt.plant_name,
sl.sl_id,sl.sto_loc_name,
pg.pur_id,pg.purchs_gp_name,
us.fname,us.lname,mat_status
FROM mat_master_head mmh
INNER JOIN material_type mt ON mmh.mat_type = mt.mat_type
LEFT OUTER JOIN valuation_class vc ON mmh.val_class_id = vc.id
INNER JOIN noun n ON mmh.noun_id = n.noun_id
INNER JOIN uom_bs u ON mmh.uombs_id = u.uombs_id
INNER JOIN material_group mg ON mmh.mg_id = mg.id
INNER JOIN plant pt ON mmh.plant_id = pt.plant_id
INNER JOIN storage_location sl ON mmh.sl_id = sl.id
INNER JOIN purchase_gp pg ON mmh.pur_id = pg.pur_id
INNER JOIN users us ON mmh.user_id = us.id
WHERE (1=1)";
// AND mat_status = 4 AND (download_status = 0 OR download_status = 1)
if( !empty($requestData['search']['value']) ) { // if there is a search parameter, $requestData['search']['value'] contains search parameter
$sql.=" AND ( mat_code LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR plant_name LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR sto_loc_name LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR noun_name LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR qualifier LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR shorttext_item LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR short_code_details LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR uombs LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR mat_descp LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR fname LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR lname LIKE '%".$requestData['search']['value']."%' ";
$sql.=" OR date_created LIKE '%".$requestData['search']['value']."%' )";
}
$query = $conn->query($sql);
$totalFiltered = $query->rowCount(); // when there is a search parameter then we have to modify total number filtered rows as per search result.
if( !empty($requestData['order'][0]['column']) || !empty($requestData['order'][0]['dir']) || !empty($requestData['start']) || !empty($requestData['length'])) {
$sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]."
".$requestData['order'][0]['dir']." ";
$sql.=" LIMIT ".$requestData['start']." , ".$requestData['length']." ";
/* $requestData['order'][0]['column'] contains colmun index, $requestData['order'][0]['dir'] contains order such as asc/desc */
}
$query = $conn->query($sql);
///Attribute Function//////////////////////////////////
function attrib($mat_code)
{
global $conn;
$mat_query = "SELECT a.attributes, mmd.attr_value, u.uombs FROM mat_master_details mmd
INNER JOIN attribute a ON mmd.attr_id = a.attr_id
INNER JOIN uom u ON a.uombs_id = u.uombs_id
WHERE mat_code = '$mat_code' AND mmd.attr_value >= '0'";
$mat = $conn->query($mat_query);
$attribs = '';
foreach($mat as $mats){
$attribs .= removeSlash($mats['attributes'].' - '.$mats['attr_value'].''.$mats['uombs'].' ');
}
return '<span class="colortxt3">'.$attribs.'</span>';
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
$data = array();
foreach ($query as $row) { // preparing an array
$nestedData=array(); //new array to display list
$nestedData[0] = $row['mat_code'];
$nestedData[1] = MatStatus($row['mat_status']);
$nestedData[2] = '<span class="lgtxt">'.'PLANT:'.' '.'</span>'.'<span class="colortxt">'.$row['plant_name'].'</span>'.' '.
'<span class="lgtxt">'.'STORAGE LOCATION:'.' '.'</span>'.'<span class="colortxt">'.$row['sto_loc_name'].'</span>'.' '.'<br>'.
'<span class="lgtxt">'.'NOUN:'.' '.'</span>'.'<span class="colortxt">'.$row['noun_name'].'</span>'.' '.
'<span class="lgtxt">'.'QUALIFIER:'.' '.'</span>'.'<span class="colortxt">'.$row['qualifier'].'</span>'.' '.
'<span class="lgtxt">'.'SHORT TEXT:'.' '.'</span>'.'<span class="colortxt">'.$row['shorttext_item'].''.removeSlash($row['short_code_details']).'</span>'.' '.
'<span class="lgtxt">'.'BASE UOM:'.' '.'</span>'.'<span class="colortxt">'.$row['uombs'].'</span>'.' '.'<br>'.
'<span class="lgtxt">'.''.'</span>'.'<span class="colortxt4">'.$row['mat_descp'].'</span>'.' '.
'<span class="colortxt3">'.attrib($nestedData[0]).'</span>'.' '.'<br>'.
'<span class="lgtxt">'.'CREATED BY:'.' '.'</span>'.'<span class="colortxt2">'.$row['fname']." ". $row['lname'].'</span>'.' '.
'<span class="lgtxt">'.'DATE CREATED:'.' '.'</span>'.'<span class="colortxt2">'.$row['date_created'].'</span>';
$nestedData[3] = '<a href="materialMasterForm.php?id='.$row['mat_code'].'" target="_blank" class="nbtn">View</a>';
$data[] = $nestedData;
}
答案 0 :(得分:1)
您没有做到这一点。首先,“数据表”可能涉及几件事。只是带有数据的“表”,但我猜它是https://datatables.net
您的代码中有一个函数attrib()
,但是它有什么作用?它的名字什么也没告诉我,上面的注释说:“属性函数”,这不是很有意义。好的,我知道它会执行查询。
因此,您在“数据表”中输出一列,该列的值来自查询,并且您希望能够在选择要显示的行之前搜索该值。
一个简单的解决方案是将attrib()
的结果放在要搜索的表的列中。这可能违反了数据库规范化规则,但是同样它将是最快,最简单的解决方案。请记住,attrib()
所依赖的任何值每次更改时都需要更新该列中的值。因此,这使得该解决方案相当难看。
另一种解决方案是将attrib()
中的查询作为子查询合并到您的主搜索查询中。由于您的搜索查询已经非常复杂,因此最终可能会导致查询速度缓慢。但是,这是最好的解决方案。在最基本的形式下,它看起来像这样:
$sql .=" OR (SELECT ... FROM ... WHERE ....) LIKE '%".$requestData['search']['value']."%' ";
要了解有关子查询的更多信息,请参见:https://dev.mysql.com/doc/refman/8.0/en/subqueries.html
我敦促您编写更具可读性的代码。不要使用太多缩写,uombs
或mtgp
是什么意思?您使用的是高级语言,因为这会使您的代码更易于理解,因此请不要破坏它。还要编写有用的注释,不要在代码中将它们用作分隔符。