在原始SQL查询中插入变量Laravel

时间:2016-06-03 15:55:28

标签: sql laravel

我在控制器中的一个函数内。

所以从表单中,我得到一个变量的值,比如说:

$x = "whatever";

然后我需要在WHERE语句中嵌入该变量(因此,它的值)。如果我对值进行硬编码,它会带来正确的结果,但我已尝试以各种方式插入该变量但未成功。好吧,假设我设法使用该变量,那么我将不得不考虑绑定以避免sql注入,但到目前为止,我会说,看看该变量是否可以在查询中使用。

我试过,双引号,连接。 $ vx。 ,花括号{$ x},变量像这个$变量一样,但要么在某些情况下给出语法错误,(连接),或者如果我只是将这个变量嵌入到author = $ x的变量中,它告诉我它可以&找到名为$ x

的列
$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'
                           ));

3 个答案:

答案 0 :(得分:8)

这似乎是一个简单的PHP变量插值问题。

DB :: raw想要字面上的RAW sql。因此,在您传递的SQL字符串中需要修复一些问题。

  1. PHP只有在字符串周围使用双引号时,才会发生变量插值(将变量注入字符串)。使用单引号,它将变为字符串常量。
  2. 如果Author是char / varchar,则SQL语法需要在RAW SQL语句中围绕字符串引用。 Querybuilders通常会为您处理这些问题,但您正在解决这些问题。
  3. 因此,“固定”版本将是:

    $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 :: raw有一个选项,允许您传递一个参数数组,这对于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)
                         ));
    

答案 1 :(得分:3)

  

关于this tutorial

$results = DB::select( DB::raw("SELECT * FROM some_table WHERE some_col = :somevariable"), array(
   'somevariable' => $someVariable,
 ));

答案 2 :(得分:0)

这是您在原始sql laravel中插入变量的一个示例

        $query_result = Event::select(
            DB::raw('(CASE WHEN status = "draft" THEN "draft" 
            WHEN events.end_time <= \''.$now.'\' THEN "closed"
            ELSE "available"
            END) AS status'))
            ->orderBy('status')
            ->get();