我在控制器的一个函数中。
所以从表单中,我得到一个变量的值,比如:
$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'
));
原文由 Arminius 发布,翻译遵循 CC BY-SA 4.0 许可协议
这似乎是一个简单的 PHP 变量插值问题。
DB::raw()
想要真正的 原始 SQL。因此,您传递的 SQL 字符串中有几个问题需要修复。char
/varchar
,则 SQL 语法需要在原始 SQL 语句中的字符串周围加上引号。查询构建器通常会为您处理这些问题,但您正在绕过它们。所以这个的“固定”版本是:
像所有插值一样,如果被插值的变量来自用户输入,那么这会为您提供 SQL 注入的可能性。从最初的问题来看,这是否是一个问题尚不清楚。
DB::select()
有一个选项允许您传递一个对 SQL 注入本质上是安全的参数数组。在这种情况下,解决方案是: