- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用下面的代码时,我从数据库中得到了正确的结果。
$jobnumber= 'Agen912-493';
$sql =
"
SELECT *
FROM jobcards
WHERE jobnumber='$jobnumber'
";
$result = mysqli_query($conn, $sql);
但是当我交换时
$jobnumber= 'Agen912-493';
对于
$jobnumber= $_GET["jobnumber"];
我从数据库中得到“没有结果”。但我确信$_GET["jobnumber"];
返回完全相同的 Agen912-493
因为我在将其设置为等于 后回显了
并返回 $jobnumber
>$_GET["jobnumber"];Agen912-493
。
经过两个小时的挠头,我完全不明白这里出了什么问题。我只想在 WHERE
条件中使用 GET[]
调用的结果(我已检查是否返回正确的字符串)。
有人可以解释一下这里发生了什么吗?
最佳答案
您的代码容易受到 SQL 注入(inject)攻击。更好的模式是使用带有绑定(bind)占位符的准备好的语句。
(编辑:我误读了OP发布的内容。我的错。)
<罢工>对于您所观察到的行为,最可能的解释是缺少单引号。这要么会导致错误(或者,MySQL 在数字上下文中慷慨地解释文字值,并计算为零。
要了解发生了什么,echo $sql;
考虑差异:单引号使其成为字符串文字:
... FROM t WHERE t.mycol = 'Agen912-493'
^ ^
如果没有单引号,MySQL 会认为它是一个标识符,并将破折号字符视为减法运算:
... FROM t WHERE t.mycol = Agen912-493
我预计 MySQL 正在寻找列名 Agen912
然后从该值中减去 493。
很可能,MySQL 抛出了一个错误。并且
您的代码未检查
mysqli_query
的返回。它把虚拟的小指放在虚拟的嘴角上,就像邪恶博士那样,然后说“我只是假设一切都会按计划进行。什么?”
启用错误报告并检查
mysqli_query
的返回。如果出现错误,它将返回 FALSE 而不是结果集。
更好的模式是使用带有绑定(bind)占位符的准备好的语句:
$sql = "SELECT * FROM jobcards WHERE jobnumber = ?";
$sth = mysqli_prepare($sql);
if (!$sth) {
// error in prepare
}
else {
mysqli_stmt_bind_param($sth, 's', $jobnumber);
mysqli_stmt_execute($sth);
...
}
关于PHP SQL 以及将 'WHERE' 与变量一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910763/
我是一名优秀的程序员,十分优秀!