如何在Laravel 4中转义传递给原始查询的参数? 我期待像DB::escape()(从Laravel 3敲响钟声)并尝试DB::quote()(我认为可以通过PDO对象获得)
$query = DB::select("SELECT * FROM users WHERE users.id =" . DB::escape($userId));
我们不能将select方法与占位符一起使用,因为上面只是我们尝试实现的简化示例。 我们有一个大型自定义查询,其中包含一些无法适应查询构建器的嵌套选择查询。
插入Laravel 4之前逃避某些事情的最佳方法是什么?
编辑:
我刚刚发现你可以访问PDO对象并以这种方式使用quote函数。 这仍然是最好的方法,还是有更简单的方法来访问此功能?
DB::connection()->getPdo()->quote("string to quote");
谢谢。 包含解决方案的+1(你也可以将它作为答案分开发布,并接受它......可以为我们节省一些时间)
@ J.Bruni,好点! 我现在已将其添加为实际答案,因此应该更容易找到。
您可以通过DB外观以这种方式引用字符串。
DB::connection()->getPdo()->quote("string to quote");
当我发现它时,我确实把这个答案放在我的问题中,但是我现在把它作为一个实际的答案,让其他人更容易找到。
谢谢!令人惊讶的是人们如何坚持回答错误的问题。我需要和你一样的答案,参数在我的情况下也不起作用。
工作,但这么长的事情要打电话! DB :: escape()会很好。
$value = Input::get("userID");
$results = DB::select( DB::raw("SELECT * FROM users WHERE users.id = :value"), array(
'value' => $value,
));
更多细节在这里
这没有回答这个问题,它表示我不是在寻找带有占位符的解决方案,而是寻找逃避一个变量的适当方法。
@Dwight:因为没有实际意义。当您转义为将变量值实际编码为SQL时,占位符也是如此。 PDO也是如此。
要注意,我在使用这个和更多where语句时遇到了问题。查询构建器不会将select()中的占位符与where中的其他动态替换组合在一起。
@hakre如果我需要将一堆(变量数)变量放入语句的"IN()"部分,该怎么办?
@Janis:你能找到这样的问题吗?我可以将数组绑定到IN()条件吗?这是姐姐的问答。
您也可以试试这个,(阅读文档)
$results = DB::select('SELECT * FROM users WHERE users.id = ?', array($userId));
这个答案+1。使用数组绑定(如上例所示)将保护您。更多信息,请访问forums.laravel.io/viewtopic.php?id=11068
这没有回答这个问题,它表示我不是在寻找带有占位符的解决方案,而是寻找逃避一个变量的适当方法。
@Dwight,这是array binding/bound params所做的,安全的,转义的,不能应用sql注入而不仅仅是占位符。请阅读此答案以清除自己。
@Dwight,还注意到第一条评论,没有澄清你吗?
在寻找Laravel中的通用sql转义时,我发现了这个问题。我实际需要的是表/列名称转义。所以,供将来参考:
/**
* Quotes database identifier, e.g. table name or column name.
* For instance:
* tablename -> `tablename`
* @param string $field
* @return string
*/
function db_quote_identifier($field) {
static $grammar = false;
if (!$grammar) {
$grammar = DB::table('x')->getGrammar(); // The table name doesn't matter.
}
return $grammar->wrap($field);
}
DB::query()->getGrammar()可能是一种更直接的方法。让其他开发者不要问太多问题。
我在Laravel 5的helpers.php中使用它:
if ( ! function_exists('esc_sql'))
{
function esc_sql($string)
{
return app('db')->getPdo()->quote($string);
}
}
然后我可以使用esc_sql函数,我需要为原始SQL查询进行pergorm转义。
我使用的两个答案在DB外观中内置了较少的详细解决方案。
一,价值引用:
// From linked answer
DB::connection()->getPdo()->quote("string to quote");
// In the DB facade
DB::getPdo()->quote('string to quote');
二,标识符引用(表名和列名):
// From linked answer
DB::table('x')->getGrammar()->wrap('table.column');
// In the DB facade
DB::getQueryGrammar()->wrap('table.column');
这是一个更全面的示例,展示如何转义值和列并扩展Laravel的querybuilder:
namespace App\Providers;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\ServiceProvider;
class DatabaseQueryBuilderMacroProvider extends ServiceProvider {
public function register() {
Builder::macro('whereInSet', function($columnName, $value) {
/** @var \Illuminate\Database\Query\Grammars\Grammar $grammar */
$grammar = $this->getGrammar();
return $this->whereRaw('FIND_IN_SET(?,' . $grammar->wrap($columnName) . ')', [$value]);
});
}
}