php - 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'];
解决方案
如果您查看文档,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
}
推荐阅读
- julia - 类型和结构的区别
- laravel - 在没有可见命令提示符窗口的情况下在 Windows 上自动启动 websocket 服务器
- python - 如何在回调中更新 VTK 渲染窗口的大小和位置?
- model-view-controller - 我可以向现有的 MVC5 项目添加部分视图吗?
- database - 如何设置删除旧日志?
- python - if-elif-else 结合 group-by 创建新列
- python - 没有 id 和主键的 Django 数据透视表
- java - 如何将队列从另一个线程添加到一个线程?
- cloud - 云原生环境中的连接池
- python-3.x - 获取重用套接字组中单个套接字的所有请求