【发布时间】:2019-06-02 13:34:59
【问题描述】:
我想使用简单的查询进行搜索。
此查询在另一个页面和另一个表中运行良好。 我只是复制并粘贴了它。
这里是查询
$stmt = $pdo->prepare("SELECT * FROM _all_users WHERE fullname LIKE '%".$q."%' OR mobile LIKE '%".$q."%' ORDER BY time_stamp DESC");
$stmt->execute();
它必须工作。但是我收到了这个错误
致命错误:未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /var/www/_am/ajax/getLists 的第 1 行的“OR mobile LIKE '%848%' ORDER BY time_stamp DESC LIMIT 15 OFFSET 0”附近使用正确的语法。 php:171 堆栈跟踪:#0 /var/www/_am/ajax/getLists.php(171): PDO->prepare('SELECT * FROM _...') #1 {main} 抛出 /var/www /_am/ajax/getLists.php 第 171 行
有什么想法吗?
【问题讨论】:
-
$q的值是多少?插入变量后的查询是什么样的? -
请阅读SQL injection。不要使用字符串连接构建查询,而是使用 prepared statements 和 bound parameters。请参阅 this page 和 this post 了解一些很好的示例。
-
请只显示整个查询。这并不难做到。如果您需要我们的帮助,您应该按照我们的要求去做。我们在帮你一个忙。请尊重这一点,并为我们提供实际帮助您所需的东西。事实上,您也应该展示构建该查询的代码。
-
没关系。如果你不能提供我要求的东西,我无法帮助你。祝你好运。
-
@roberthofer 通过阅读上述 cmets:了解使用 PDO 本身并不能保护您免受 SQL 注入。如果您使用绑定参数,则使用准备好的语句只会保护您免受 SQL 注入。在没有绑定参数的查询上使用
prepare(正如您在此处所做的那样)根本无法提供任何保护。