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 查询生成器分配给一个变量。使用时会发生变化
NSStringFromSelector 返回变量名而不是变量值