Php 在Laravel 4中转义原始SQL查询
在Laravel4中,如何转义传递给原始查询的参数?我期待类似于Php 在Laravel 4中转义原始SQL查询,php,mysql,pdo,laravel,laravel-4,Php,Mysql,Pdo,Laravel,Laravel 4,在Laravel4中,如何转义传递给原始查询的参数?我期待类似于DB::escape()(这在Laravel 3中敲响了警钟)的东西,也尝试了DB::quote()(我认为可以通过 我们不能使用带有占位符的select方法,因为上面只是我们试图实现的一个简化示例。我们有一个大型自定义查询,其中包含一些嵌套的select查询,无法适应查询生成器 在插入Laravel 4之前,最好的方法是什么 编辑: 我刚刚发现,您可以通过这种方式访问PDO对象并在其上使用quote函数。这仍然是最好的方法,还是有
DB::escape()
(这在Laravel 3中敲响了警钟)的东西,也尝试了DB::quote()
(我认为可以通过
我们不能使用带有占位符的select方法,因为上面只是我们试图实现的一个简化示例。我们有一个大型自定义查询,其中包含一些嵌套的select查询,无法适应查询生成器
在插入Laravel 4之前,最好的方法是什么
编辑:
我刚刚发现,您可以通过这种方式访问PDO对象并在其上使用quote函数。这仍然是最好的方法,还是有更简单的方法访问此功能
DB::connection()->getPdo()->quote("string to quote");
更多详细信息您也可以试试这个,()
您可以通过
DB
facade以这种方式引用字符串
DB::connection()->getPdo()->quote("string to quote");
当我发现这个答案时,我确实把它放在了我的问题中,但是现在我把它作为一个实际的答案放在了问题中,以便让其他人更容易找到。我在我的
helpers.php
Laravel 5:
if ( ! function_exists('esc_sql'))
{
function esc_sql($string)
{
return app('db')->getPdo()->quote($string);
}
}
然后我可以使用
esc\u sql
函数,在这里我需要对原始sql查询执行转义。我在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);
}
下面是一个更完整的示例,展示了如何转义值和列并扩展Laravel的querybuilder:
<?php
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]);
});
}
}
我在这里使用的两个答案在DB
外观中内置了不太详细的解决方案
DB::connection()->getPdo()->quote("string to quote");
首先:
//来自链接答案
DB::connection()->getPdo()->引号(“字符串到引号”);
//在DB facade中
DB::getPdo()->quote('string to quote');
第二,(表和列名):
//来自链接答案
DB::table('x')->getGrammar()->wrap('table.column');
//在DB facade中
DB::getQueryGrammar()->wrap('table.column');
+1回答这个问题。使用数组绑定(如上面的示例)将保护您。这里的进一步信息这并不能回答问题,它表明我不是在寻找带有占位符的解决方案,而是寻找转义一个变量的合适方法。@Dwight,这就是数组绑定/绑定参数所做的,安全,转义,不可应用sql注入,而不仅仅是占位符。请阅读以澄清自己。@Dwight,也请注意第一条评论,它没有澄清您的意思吗?这并没有回答问题,它表明我不是在寻找带有占位符的解决方案,而是寻找一个变量的适当转义方法。@Dwight:这是没有实际意义的。当您转义将变量值实际编码为SQL时,占位符也是如此。PDO也是如此。注意,我在使用更多的where
语句时遇到了问题。查询生成器没有将select()
中的占位符与其他动态替换(如where
@hakre)结合起来。如果我需要转义一堆变量(一个变量编号)以放入语句的“in()”部分,该怎么办?@Janis:您可以在中找到这些问题的答案,这是我的姐妹问答。谢谢+1感谢您将解决方案包括在内(您也可以将其作为答案单独发布,并接受它……这样可以为我们节省一些时间)@J.Bruni,说得好!我现在已经添加了它作为一个实际的答案,所以它应该更容易找到。谢谢!令人惊讶的是,人们总是坚持回答错误的问题。我需要和你一样的答案,参数在我的情况下也不起作用。起作用,但要调用的时间太长了!DB::escape()会很好。DB::query()->getGrammar()
可能是一种更简单的方法。防止其他开发人员问太多问题。
/**
* 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);
}
<?php
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]);
});
}
}