Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel 4中转义原始SQL查询_Php_Mysql_Pdo_Laravel_Laravel 4 - Fatal编程技术网

Php 在Laravel 4中转义原始SQL查询

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函数。这仍然是最好的方法,还是有

在Laravel4中,如何转义传递给原始查询的参数?我期待类似于
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]);
        });
    }
}