gpt4 book ai didi

sql - 在原始 sql 查询 Laravel 中插入变量

转载 作者:行者123 更新时间:2023-12-04 16:06:37 25 4
gpt4 key购买 nike

我在 Controller 的一个函数中。

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

$x = "whatever";

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

我试过,双引号,串联。 $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 字符串中有几个问题需要修复。

  • PHP 变量插值(将变量注入(inject)字符串)只有在字符串周围使用双引号时才会发生。使用单引号,它变成一个字符串常量。
  • 如果作者是 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 注入(inject)的可能性。从最初的问题来看,这是否是一个问题尚不清楚。
    DB::select()有一个选项允许您传递一组参数,这些参数对 SQL 注入(inject)本质上是安全的。在这种情况下,解决方案是:
    $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)
    );

    关于sql - 在原始 sql 查询 Laravel 中插入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618764/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com