gpt4 book ai didi

PHP SQL 以及将 'WHERE' 与变量一起使用

转载 作者:行者123 更新时间:2023-11-29 07:33:09 24 4
gpt4 key购买 nike

当我使用下面的代码时,我从数据库中得到了正确的结果。

$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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com