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

标签 php mysql select get where-clause

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

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

相关文章:

mysql - Heroku 远程数据库连接超时

php - 投注申请,获得获胜球队的赔率

r - 天际线查询或高效边界的实现

mysql - 在 mysql 中,如何连接第二个表并获取具有最新日期的行?

php - JQuery 使用 THIS 作为 .on [选择器]

php - 如何从 laravel 9 中删除/public 文件夹?

php - 使用 JMS Serializer 反序列化混合类型的值

java - 如何获取数据库中的第一个空白行?

MySQL 多个 SUM 返回相同的值

php - 在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则