【发布时间】:2025-12-03 13:25:01
【问题描述】:
目前我将我的代码从 mysqli 样式编辑为 mysqli_stmt,以便能够更好地防止 SQL 注入。我重写了我的代码,但是当我想检查某个查询有多少行时,我收到了这个错误:命令不同步;你现在不能运行这个命令,所以我的表不会显示任何数据,但实际上它有。
我已经阅读这个错误几个小时了,但我不知道如何调整它才能使其正常工作。
此外,我知道在这种情况下我没有变量,但我倾向于在所有代码中使用相同的样式。
这是我目前使用的代码(不工作):
$stmt = mysqli_prepare($conn,"SELECT * FROM `assets`");
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
if (!($result = mysqli_stmt_get_result($stmt))){
die("Could not show the required data");}
elseif (empty(mysqli_stmt_num_rows($result))){
echo "Currently there are no assets to be shown.";}
elseif (mysqli_stmt_num_rows($result) > 0){
echo '<table id="table" class="display"><thead>
<tr>
<th>Asset name</th>
<th>Classification</th>
<th>Tag</th>
<th>Department</th>
<th>Next review date</th>
<th>Owner</th>
<th>Update</th>
</tr></thead><tbody>';
while($result2=mysqli_fetch_array($result, MYSQLI_NUM))
{ $class="";
if ($result2["Review_date"] < date('Y-m-d')){$class=" old";} elseif($result2["Review_date"] < date('Y-m-d', strtotime('+6 days'))){$class="notnew";} else {$class="new";}
echo '<tr class="'.$class.'">
<td>'.$result2["Asset_name"].'</td>
<td>'.$result2["Classification"].'</td>
<td>'.$result2["Tag"].'</td>
<td>'.$result2["Department"].'</td>
<td>'.$result2["Review_date"].'</td>
<td>'.$result2["Responsible"].'</td>
<td><a href="editassets.php?id='.$result2['id'].'">Edit</a> | <a href="deleteassets.php?id='.$result2['id'].'" onclick="return confirm(\'Do you want to delete this asset?\');">Delete</a></td>
</tr>';
}
echo '</tbody></table>';
}
我知道我的问题在于第一个 elseif 语句,我尝试使用 mysqli_stmt_free_result($stmt) 但在这种情况下,我不知道它是否是解决方案,如果是,在哪里以及如何放置它。
感谢您的帮助!
【问题讨论】:
-
尝试从您的代码中删除
mysqli_stmt_store_result($stmt);。你不应该把它和mysqli_stmt_get_result()混在一起。 -
mysqli_stmt_num_rows() 期望参数 1 是 mysqli_stmt,给定对象 --> 如果不包括该行,我收到此错误
-
试试
mysqli_stmt_num_rows($stmt)或mysqli_num_rows($result)- 顺便说一句,请阅读docs 了解您正在使用的功能。