1

我有搜索查询 mysql,但由于 SQL INJECTION 我将代码更改为 MySqli。我用了

if(mysql_num_rows($result)>= 1)

之前,我把它改成

if(($result->num_rows)>= 1)

我的问题是即使查询中有匹配值,它总是回显没有结果。这是为什么?

<?php
$mysqli = new mysqli("localhost", "root", "", "app");
$result = $mysqli->query="SELECT *,SUM(unit_cost*quantity) AS total_amount FROM procurement WHERE counter LIKE '%".$search."%' 
OR item_description LIKE '%".$search."%' OR fund_source LIKE '%".$search."%' OR quantity LIKE '%".$search."%' OR mode_of_procurement LIKE '%".$search."%' 
OR division LIKE '%".$search."%' OR section LIKE '%".$search."%' GROUP BY counter";

if(($result->num_rows)<= 0){
echo "</br><div style='margin:0 auto;background:#fff;padding:3px;color:#2086e4;font-size:11px;font-weight:bold;text-align:center;'>
No Result for :<font color='red' style='text-transform:uppercase'>&nbsp; &nbsp;".$search."</div>";

//echo 'No Result for <font color="red">'.$search.'</font>';
}
if(($result->num_rows)>= 1){
echo'</br><div style="margin:0 auto;background:#fff;padding:3px;color:#2086e4;font-size:11px;font-weight:bold;text-align:center;">
Result for :<font color="red" style="text-transform:uppercase">&nbsp; &nbsp;'.$search.'</font></div>';
    echo"<div id='id3' style='margin-top:10px;'><table id='tfhover' class='tftable' border='1 style='text-transform:uppercase;'>
        <thead>
        <tr>
        <th></th><th>Item Description</th>
        <th>Fund Source</th>
        <th>Unit</th>
        <th>Unit Cost</th>
        <th>Quantity</th>
        <th>Total Amount</th>
        <th>Mode of Procurement</th>
        <th>Supplier</th>
        <th>P.O #</th>
        <th>P.O Date</th>
        <th>Division</th>
        <th>Section</th>
        </tr></thead><tbody>";

    while($row = $result->fetch_assoc()){
echo'<tr>
        <td><a href="'.$_SERVER['PHP_SELF'].'?pn='.$row["counter"].'" onclick="return confirm(\'Really want to delete?\');"><img src="images/del.png" border"0" width="15" height="15"></a></td>
        <td>'.$row['item_description'].'</td>
        <td>'.$row['fund_source'].'</td>
        <td>'.$row['unit'].'</td>
        <td>'.$row['unit_cost'].'</td>
        <td>'.$row['quantity'].'</td>
        <td>'.$row['total_amount'].'</td>
        <td>'.$row['mode_of_procurement'].'</td>
        <td>'.$row['supplier'].'</td>
        <td>'.$row['po_number'].'</td>
        <td>'.$row['po_date'].'</td>
        <td>'.$row['division'].'</td>
        <td>'.$row['section'].'</td></tr></tbody>';
}
}
else{
}
?>
4

3 回答 3

2

您正在对象query上设置属性$mysqli,而不是调用query() 方法。利用

$result = $mysqli->query("some sql");

反而。

此外,以这种方式使用任何数据库模块都可能(并且可能会)导致 SQL 注入。您仍在通过字符串连接构建查询字符串;无论是mysqlmysqli还是别的什么,通过这种方式,你总会遇到 SQL 注入漏洞。

于 2013-10-02T06:01:09.020 回答
1

你只是设法弄错了一切。

首先,你没有让你的代码变得安全。“Mysqli”不是一个神奇的圣歌,它的存在就可以让一切变得安全。为了使您的代码安全,您必须使用准备好的语句

其次,您根本不需要行数。您应该放弃将 HTML 与 SQL 混合的旧肮脏方法,并学习使用一些模板。使用模板,您将不需要专门的函数来知道您是否得到任何行。

于 2013-10-02T06:08:11.220 回答
0

step1:像这样回显它:

echo $result = $mysqli->query="SELECT *,SUM(unit_cost*quantity) AS total_amount FROM procurement WHERE counter LIKE '%".$search."%' 
OR item_description LIKE '%".$search."%' OR fund_source LIKE '%".$search."%' OR quantity LIKE '%".$search."%' OR mode_of_procurement LIKE '%".$search."%' 
OR division LIKE '%".$search."%' OR section LIKE '%".$search."%' GROUP BY counter";

comnt 所有其他行并运行,复制输出并粘贴到 phpmyadmin 的 sql 区域。如果显示任何结果,则仅表示与 numrow 条件相关的问题。在此之前,请确保您有数据要显示的条件。(如果 dar 在 SQL 中没有输出,并且您有数据要显示为您的搜索键,那么您在 PHP 中的 SQL 提取语句有问题)

2:现在从 first 更改 echo 并将其添加到 numnow obj 中,例如:echo $xxx=$result->num_rows; 执行相同的过程

if($xxx==0) {Action 1} 
elseif($xxx>=1){Action 2}
else{Action 3}

快乐编码

于 2014-01-20T10:31:45.227 回答