这似乎是一个简单的PHP变量插值问题。
DB::raw()想要字面上的 原始 SQL。因此,您需要在传递的SQL字符串中解决几个问题。
- 仅当在字符串周围使用双引号时,才会发生PHP变量插值(将变量注入到字符串中)。用单引号将其变为字符串常量。
- 如果Author是
char
/varchar
,则SQL语法要求在原始SQL语句中的字符串前后加上引号。查询生成器通常会为您解决这些问题,但是您需要解决它们。
因此,此“固定”版本为:
$x = "whatever";$results = DB::select(DB::raw("SELECT t.id, t.AvgStyle, r.RateDesc FROM ( SELECt p.id, ROUND(AVG(s.Value)) AS AvgStyle FROM posts p INNER JOIN styles s ON s.post_id = p.id WHERe author = '$x' GROUP BY p.id ) t INNER JOIN rates r ON r.digit = t.AvgStyle" ));
像所有插值一样,如果要插值的变量来自用户输入,则可以打开SQL注入的可能性。从最初的问题尚不清楚这是否是一个问题。
DB::select()有一个选项,使您可以传递本质上可以防止SQL注入的参数数组。在这种情况下,解决方案将是:
$x = "whatever";$results = DB::select(DB::raw("SELECT t.id, t.AvgStyle, r.RateDesc FROM ( SELECt p.id, ROUND(AVG(s.Value)) AS AvgStyle FROM posts p INNER JOIN styles s ON s.post_id = p.id WHERe author = :author GROUP BY p.id ) t INNER JOIN rates r ON r.digit = t.AvgStyle" ), array('author' => $x) );
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)