【问题标题】:laravel query builder always returns ? instead of value of variablelaravel 查询生成器总是返回?而不是变量的值
【发布时间】: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() 函数调用上执行。

标签: laravel eloquent


【解决方案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绑定值的占位符,正常输出,不可更改。调试的完整解释或解决方案,请参考stackoverflow.com/questions/32372437/…
    • tesmojones 的答案对我来说是正确的答案。谢谢大家!
    猜你喜欢
    • 2016-08-12
    • 2011-12-27
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多