【发布时间】:2018-05-21 19:21:53
【问题描述】:
laravel 在执行此行时返回此错误:
$select = trim($request->select);
$where = trim($request->where);
$d = trim($request->d);
$order = trim(stripslashes($request->order));
$limit = isSet($request->limit) ? " LIMIT ".trim($request->limit) : '';
$forUser = trim(stripslashes($request->userId));
$campaignId = trim(stripslashes($request->campaignId));
$userRole = trim(stripslashes($request->userRole));
$events = DB::select('SELECT *, DATE_FORMAT(timestamp, ?) selector FROM events WHERE DATE_FORMAT(timestamp, ?) = ? AND campaignId = ? ORDER BY ? ASC ?', [$select, $where, $d, $campaignId, $order, $limit])->get();
错误:
[2018-05-21 19:09:22] local.ERROR: exception 'PDOException' with message 'SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在“?”附近使用的正确语法。在 C:\xampp\htdocs\spotlike_laravel\trunk\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOConnection.php:77 中的第 1 行
有什么想法吗? :(
【问题讨论】:
-
您知道您传递的所有这些变量是否都有一些数据吗?出于调试原因,如果可以的话,我会尝试在 Laravel 之外执行 SQL,以便您隔离问题。
-
当我查看您的变量和查询中的问号时,您的查询中似乎漏掉了
LIMIT关键字。 -
我找到了查询,但是当我在 phpmyadmin 中运行它时它不会返回错误,查询如下所示:SELECT *, DATE_FORMAT(timestamp, "%Y-%c-%e")选择器 FROM 事件 WHERE DATE_FORMAT(timestamp, "%Y-%c") = "2018-5" AND campaignId = "194" ORDER BY timestamp, id ASC
-
将此作为答案发布,但没有用!将作为评论发布以可能在将来帮助某人:尝试将时间戳字段名称放在反引号中。 IIRC 时间戳是一个保留字。另外,作为旁注,我不知道您是否可以将绑定参数用于 order by 和 limit 参数,因为 PDO 会将参数值用引号括起来,导致类似:
ORDER BY 'some_field' ASC 'LIMIT 30' -
要获取查询和绑定,试试这个:
$events = DB::select('SELECT *, DATE_FORMAT(timestamp, ?) selector FROM events WHERE DATE_FORMAT(timestamp, ?) = ? AND campaignId = ? ORDER BY ? ASC ?', [$select, $where, $d, $campaignId, $order, $limit]); dd($event->toSql(), $event->getBindings());这将dd查询和传递的参数。可能会更清楚地说明这个问题。