gpt4 book ai didi

php - 当我通过电子邮件地址选择时,为什么会出现 MySQL 语法错误 (1604)?

转载 作者:行者123 更新时间:2023-11-29 19:58:41 25 4
gpt4 key购买 nike

我比较来自 MySQL 数据库的 PHP 电子邮件地址:

$query
->select(array('a.dtstart','a.cal_id','b.name','a.email'))
->from('#__pbbooking_events AS a')
->join('INNER', '#__pbbooking_cals AS b ON (a.cal_id = b.id)')
->where('a.email = ' . $user->email)
->where(' a.dtstart>'. $query->currentTimestamp())
->order('a.dtstart ASC');

$user 仅包含当前登录用户的信息。

我收到此错误

YOU HAVE AN ERROR IN YOUR SQL SYNTAX; CHECK THE MANUAL THAT CORRESPONDS TO YOUR MARIADB SERVER VERSION FOR THE RIGHT SYNTAX TO USE NEAR @RET.RU AND A.DTSTART>CURRENT_TIMESTAMP() ORDER BY A.DTSTART
ASC
AT LINE 4

如果我删除比较电子邮件的 where 子句,则查询运行不会出错。

我在某处读到问题是 @ 符号,但是我该如何进行比较呢?

最佳答案

你必须把它放在引号中:

->where('a.email = "' . $user->email.'"')

请注意,您需要转义该电子邮件地址。这取决于您使用的 SQL 库。一个古老的例子是这样的:

->where('a.email = "' . mysql_real_escape_string( $user->email ).'"')

为什么是“旧”?

你应该 really using prepared statements而不是逃避。我假设您使用的库支持它们,但我不能肯定地说。如果没有,您应该考虑删除它并按照 previous link 中的解决方案进行操作。 .

实际发生了什么?

您的查询结果如下:

where a.email=hello@site.com and a.dtstart>342734..

SQL 将电子邮件视为查询的一部分。这就是所谓的 SQL 注入(inject)攻击的基础。例如,假设电子邮件设置为:

"" or (drop table users)

使您的查询如下所示:

where a.email="" or (drop table users) and a.dtstart>342734..

..这可能会导致一些重大问题!不要相信来自用户的任何内容。

关于php - 当我通过电子邮件地址选择时,为什么会出现 MySQL 语法错误 (1604)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603852/

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