Php 更新到准备好的mysqli SELECT语句-找不到该行
有人建议我更新代码以防止sql注入。这就是我所拥有的 来自URL的变量Php 更新到准备好的mysqli SELECT语句-找不到该行,php,select,mysqli,Php,Select,Mysqli,有人建议我更新代码以防止sql注入。这就是我所拥有的 来自URL的变量 $Idarticle = "5-6142-8906-6641"; 这很有效-旧的 $sql2 = "SELECT * FROM articles WHERE IDArticle IN ('{$Idarticle}')"; $results2 = $conn->query($sql2); $row2 = $results2->fetch_assoc(); 这不起作用-新建 $sql2 = "SELECT * F
$Idarticle = "5-6142-8906-6641";
这很有效-旧的
$sql2 = "SELECT * FROM articles WHERE IDArticle IN ('{$Idarticle}')";
$results2 = $conn->query($sql2);
$row2 = $results2->fetch_assoc();
这不起作用-新建
$sql2 = "SELECT * FROM articles WHERE IDArticle IN ( ? )";
if ($stmt = $conn->prepare($sql2)) {
$stmt->bind_param("s", $Idarticle);
$stmt->execute();
$row2 = $stmt->fetch();
}
我的连接脚本
$conn = new mysqli($servername, $username, $password, $db);
在第二个示例中,我没有得到任何结果(也没有错误),而在第一个示例中,它找到了正确的行。我读过很多以前问过的类似问题,虽然可能有答案,但我没有找到。我也尝试了其中一些答案,但没有成功。谢谢你的帮助
根据评论更新代码
$sql2 = "SELECT * FROM articles WHERE IDArticle = ?";
if (!$stmt = $conn->prepare($sql2)) {
if (!$stmt->bind_param("s", $Idarticle));
echo "error: " . $stmt->error;
if (!$stmt->execute());
echo "error: " . $stmt->error;
$row2 = $stmt->fetch();
}
仍找不到记录/未报告任何错误
我的解决方案
在花了将近两天的时间研究并试图解决这个问题后,我决定mysqli是问题的核心。为什么我确信mysqli可以解决这个问题,我最终选择了PDO。起初我拒绝这样做,但经过几个小时的研究,我和其他许多人都认为这要好得多。总之,它现在工作完美无瑕,几乎没有什么变化。我的建议是,如果您正在与mysqli抗争,请切换到PDO
非常感谢那些试图帮助你的人顺便问一下:使用IN有什么特别的原因吗
"SELECT * FROM articles WHERE IDArticle = ?"
如果$results1/$results2不是打字错误,那么新代码就非常不同,因为必须有两个独立的查询
$sql2 = "SELECT * FROM articles WHERE IDArticle IN ( ? )";
if ($stmt = $conn->prepare($sql2)) {
$stmt->bind_param("s", $Idarticle);
$stmt->execute();
}
但不清楚代码后面对$results2做了什么。第2行可能与
$row2 = $results1->fetch_assoc();
这就是你的问题:
$row2 = $stmt->fetch();
成功时返回布尔值true/false,您试图将其用作行2的数组
您必须先将结果与绑定,然后fetch
有关如何从bind\u结果
最好是,如果已安装,则可以直接使用
此外,您没有检查语句错误
if ( !$stmt->bind_param("s", $Idarticle) )
echo "error: " . $stmt->error;
if ( !$stmt->execute() )
echo "error: " . $stmt->error;
你应该确保你正在使用。花括号在这里没有帮助。op在中使用的原因是他试图从多个帖子中提取记录。$Idarticle=“5-6142-8906-6641”;问题中只有一个值,而不是一个列表<代码>(“{$Idarticle}”)
在工作示例中向参数添加大括号。啊,关于中的参数,您可能是对的。但是大括号用于php变量扩展,在您的使用中不正确。我尝试了大括号,但抛出了一个错误-无法通过引用传递参数(指的是行号。到目前为止,这是旧脚本的残余。马上回来,必须遛狗。好的,根据我的评论,我去掉了括号,回到了我开始的地方。没有记录没有错误。旧代码无法工作,因为$results2
不是$results1
,所以你可能应该修复这个打字错误。非常好很抱歉对结果1造成混淆,这是我的问题中的一个输入错误,但不是在我的工作示例中。我更正了这个问题。@spaceman:NP,您是否尝试了=?变量?否则,请几乎保留原始代码,但$IDarticleEscape=mysqli\u real\u escape\u string($Idarticle);$sql2=“选择*自Idarticle所在的文章(${$IDArticleSeverit}');
是的,我尝试了=?。在发布这个问题之前,我最初的想法是你对变量进行清理的解决方案,但我想他让我尝试一下的是什么。几个小时后我还在想。我将按照Puckett的建议进行错误检查。$Idarticle=“5-6142-8906-6641”
;这不是整数;)但是如果-你是对的。不管怎样,错误检查总是一个很好的做法。谢谢你撤销下一票。@lexx LOL你对这一票了如指掌!我不应该在我的手机上这么做。谢谢你抓住了那个。谢谢我会这么做并跟进,所以我添加了错误检查,我没有收到任何错误,它仍然没有找到任何结果。在这一点上,我在想这是一匹死马。它不会去任何地方。感谢你的时间和想法。@Spaceman好的,我终于到了一台真正的计算机上并加载了这个。问题现在非常明显,我已经更新了我的答案。