首页 > 解决方案 > PHP MySQLi参数化查询不起作用

问题描述

我正在将当前未受保护的查询更新为参数化查询,以防止 SQL 注入。

我花了几个小时试图对此进行排序,但是找不到问题,非常感谢任何帮助。

BEFORE (echo $row['storeID'];) 之前工作

$storeName = mysqli_real_escape_string($conn,$_GET['store']); 
$query = "SELECT * FROM stores WHERE storeName = '$storeName'";
$results = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($results);

$storeName = $_GET['store'];
$stmt = mysqli_prepare($conn, "SELECT * FROM stores WHERE storeName = ?");
mysqli_stmt_bind_param($stmt, "s", $storeName);
mysqli_stmt_execute($stmt);
$row = mysqli_stmt_fetch($stmt);

这个回声应该可以工作,但使用它不可以的语句

 echo $row['storeID']; 

标签: phpmysqlmysqli

解决方案


如果您查看文档,mysqli_stmt_fetch您会看到以下描述:

从准备好的语句中获取结果到绑定变量中

所以如果你想走这条路,你也需要 ue mysqli_stmt_bind_result

$storeName = $_GET['store'];
$stmt = mysqli_prepare($conn, "SELECT * FROM stores WHERE storeName = ?");
mysqli_stmt_bind_param($stmt, "s", $storeName);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $col1, $col2, $col3,...);
while (mysqli_stmt_fetch($stmt)) {
    // do stuff with $col1, $col2, etc.
}

现在,随着循环的每次迭代,绑定的结果变量被赋予结果集中的值。


但是,我强烈建议迁移到 PDO,它的详细程度要低得多:

$storeName = $_GET['store'];
$stmt = $db->prepare("SELECT * FROM stores WHERE storeName = ?");
$stmt->execute([$storeName]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// now you have a simple array with all your results
foreach ($rows as $row) {
    // do stuff with $row
}

推荐阅读