我在控制器中的一个函数内。
所以从表单中,我得到一个变量的值,比如说:
$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'
));
答案 0 :(得分:8)
这似乎是一个简单的PHP变量插值问题。
DB :: raw想要字面上的RAW 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 :: 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)
$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();