laravel 查询生成器总是返回?而不是变量的值

Posted

技术标签:

【中文标题】laravel 查询生成器总是返回?而不是变量的值【英文标题】:laravel query builder always returns ? instead of value of variable 【发布时间】:2020-08-20 23:54:17 【问题描述】:

我正在使用 laravel 7.7.1 并在查询中传递一个变量 iaw 文档,如下所示:

public function show($graad=3)
    
        $sums=Sum::where(function ($query) use($graad)  
            $query->where('graad',$graad);
            )->inRandomOrder()->limit(1)->toSql();

结果总是:

"select * from `sums` where (`graad` = ?) order by RAND() limit 1"   

所以变量没有以正确的方式传递并转换为“?”。

更改 $graad='test' 或 $graad='3' 的值,甚至使用

进行类型提示
 public function show(int $graad=3)

确实会导致

 "select * from `sums` where (`graad` = ?) order by RAND() limit 1"

表中的列 graad 是一个 int(11)。 我做错了什么?

【问题讨论】:

这是一个防止sql注入的安全功能 你和 ORM 都没有做错什么。您看到的是 toSql() 函数的预期结果。在选择框架之前,请阅读所有this。 这是返回查询实例。当您传递参数时,它将替换它们以代替? 并在->get() 函数调用上执行。 【参考方案1】:

我认为你错过了get()

尝试:

$sums = Sum::where('graad', $graad)->inRandomOrder()->limit(1)->get();

$sums = JOBS::where(function($query) use ($graad)        
    $query->where('graad', $graad);
)->inRandomOrder()->limit(1)->get();
public function show($graad)

   // Rest of your code

然后确保您的路由正在接收 url 中的值并发送(假设这是您调用该方法的方式)。

Route::get('your-route-name/graad', 'YourController@show');

【讨论】:

没被问到。【参考方案2】:

Laravel 在底层使用 Prepared Statements。这是为了避免 SQL 注入。 ? 是稍后将由绑定替换的数据的占位符。

你可以使用 $query->getBindings(); 获取将在 SQL 语句中绑定的数据。

【讨论】:

【参考方案3】:

请在下面试试这个:

public function show($graad=3)
    
        $sums=Sum::where(function ($query) use($graad)  
            $query->where('graad',$graad);
            )->inRandomOrder()->limit(1);
        vsprintf(str_replace(['?'], ['\'%s\''], $sums->toSql()), $sums->getBindings());

【讨论】:

请不要教别人对自己执行 SQL 注入。 字符“?”是$graad绑定值的占位符,正常输出,不可更改。调试的完整解释或解决方案,请参考***.com/questions/32372437/… tesmojones 的答案对我来说是正确的答案。谢谢大家!

以上是关于laravel 查询生成器总是返回?而不是变量的值的主要内容,如果未能解决你的问题,请参考以下文章

我已将 Laravel 查询生成器分配给一个变量。使用时会发生变化

查询生成器获取结果数组而不是 Laravel 中的对象

NSStringFromSelector 返回变量名而不是变量值

Laravel DB 选择语句。查询返回列名作为结果而不是值

laravel数据库查询返回的数据形式

选择查询生成器返回 null