当前位置: 首页 > 面试题库 >

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

都阳
2023-03-14
问题内容

我在控制器的函数中。

因此,从表单中,我得到了一个变量的值,说:

$x = "whatever";

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

我已经试过了,双引号,串联。$ vx。,花括号{$ x},像$
variable这样的普通变量,但是在某些情况下(并置)会产生语法错误,或者如果我只是在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'
                           ));

问题答案:

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

DB::raw()想要字面上的 原始 SQL。因此,您需要在传递的SQL字符串中解决几个问题。

  1. 仅当在字符串周围使用双引号时,才会发生PHP变量插值(将变量注入到字符串中)。用单引号将其变为字符串常量。
  2. 如果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)
                   );


 类似资料:
  • 我使用Laravel创建一个简单的REST服务,将一个点几何图形和另外两个字符串值一起插入到PostgreSQL(用PostGIS扩展)表中。由于雄辩(据我所知)不支持PostGIS函数,我使用的是原始的SQL查询。 我的控制器如下所示: 通过请求发送的值是: 名称:Lidl 商店:便利 geom: {“type”:“Point”,“坐标”:[18.126712,42.643304],“crs”:

  • 在用户模型中,我定义了关系: 它返回如何获得包括参数的完整查询? 我还定义了与post模型的关系: 如何使用参数查看完整的关系查询?

  • 在模型查询API不够用的情况下,你可以使用原始的sql语句。django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。 警告 编写原始的sql语句时,应该格外小心。每次使用的时候,都要确保转义了参数中的任何控制字符,以防受到sql注入攻击。更多信息请参阅防止sql注入。 进行原始查询 r

  • 问题内容: 我可以在SQL Server 2008的Function中编写插入查询吗?如果尝试,会在函数中收到无效使用副作用运算符’INSERT’的错误。请帮帮我。但我希望它是一个函数,而不是存储过程 问题答案: 从这里引用: 用户定义的函数不能用于修改基表信息。DML语句INSERT,UPDATE和DELETE不能在基表上使用。 因此,您无法在函数中执行INSERT。 您可能想解释为什么不想使用

  • 问题内容: 在维基节点mysql的,我注意到变量(样)插入SQL查询两种不同的方式,一种是通过在查询字符串中间插入一个变量,另一种方式是通过将在查询字符串,并在下一个参数的数组中定义这些值。查询中替换的值将被转义。 有什么区别?什么时候应该在另一个上使用?(如果我们希望表名是一个变量,是否应该将其转义?) 维基密码 Wiki链接 :https : //github.com/felixge/node

  • 我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺乏任何参数处理(你好music_volume引号:-D)。 我试图遵循这个答案: 如何在SQLAlchemy flask应用程序中执行原始SQL 应用我读到的内容后,我的代码片段如下所示: 然而,我得到的错误,mv和ml是不能识别的参数。 如果我把我的代码片段改成