Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MySQLi参数化查询无法运行_Php_Mysql_Mysqli - Fatal编程技术网

PHP MySQLi参数化查询无法运行

PHP MySQLi参数化查询无法运行,php,mysql,mysqli,Php,Mysql,Mysqli,我正在将当前未受保护的查询更新为参数化查询,以防止SQL注入 我花了几个小时试图解决这个问题,但是找不到问题,非常感谢任何帮助 BEFORE(echo$row['storeID'];)在之前工作 $storeName = mysqli_real_escape_string($conn,$_GET['store']); $query = "SELECT * FROM stores WHERE storeName = '$storeName'"; $results = mysqli_query($

我正在将当前未受保护的查询更新为参数化查询,以防止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);
之后

此回显应该可以工作,但使用的语句却不能

 echo $row['storeID']; 

如果您查看有关的文档,您将看到以下描述:

将准备好的语句中的结果提取到绑定变量中

因此,如果你想走这条路线,你还需要:

现在,在循环的每次迭代中,绑定的结果变量都会从结果集中获得一个值


然而,我强烈建议转到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
}

在获取行之前,您错过了对
mysqli\u stmt\u get\u result
的调用:

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

echo $row['id'];

不需要
mysqli\u real\u escape\u string
,prepare会处理它。@digijay我从问题中删除了mysqli\u real\u escape\u string,谢谢-有什么想法为什么这仍然不起作用吗?看看这里的示例:你必须迭代结果。很抱歉,我没看到,我更喜欢PDO…我已经读过了,谢谢anyway@bradders:必须爱PDO:-)真的很感谢你的回答,我会继续和PDO一起前进。。。我已经整理了一个查询来选择一个行,我把这个放在我的问题的底部,你会考虑这个安全的吗?安全,因为它与您的略有不同?如果您有一组命名参数,则使用命名参数是一种很好的方法;这样可以更容易地跟踪他们。对于像这样的单个参数,我觉得不值得在代码中多加赘述,但它肯定不会造成任何伤害。是否使用命名或未命名参数取决于个人意见。请注意,此函数需要
mysqlnd
驱动程序。
$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
}
$storeName = $_GET['store'];
$stmt = mysqli_prepare($conn, "SELECT * FROM stores WHERE storeName = ?");
mysqli_stmt_bind_param($stmt, "s", $storeName);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);

echo $row['id'];