我从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
仅包含当前登录用户的信息。
我得到这个错误
你的SQL语法有错误;查看手册对应于mariadb服务器版本,以使用正确的语法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 ).'"')
为什么‘老’吗?
你应该真的使用预处理语句而不是转义。我假设你正在使用的库支持它们,但我不能肯定。如果没有,你应该考虑放弃它,并按照前面的链接中的解决方案。
到底发生了什么?
查询结果如下:
where a.email=hello@site.com and a.dtstart>342734..
SQL将电子邮件视为查询的一部分。这就是所谓的SQL注入攻击的基础。例如,假设电子邮件设置为:
"" or (drop table users)
让你的查询看起来像这样:
where a.email="" or (drop table users) and a.dtstart>342734..
. .这可能会导致一些重大问题!不要相信任何来自用户的东西
$user->email
是字符串,所以你需要使用'
的单括号与电子邮件。
$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. "'") // $user->email is string
->where(' a.dtstart > '. $query->currentTimestamp())
->order('a.dtstart ASC');