34

如何在 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");
4

7 回答 7

60

DB您可以通过外观以这种方式引用您的字符串。

DB::connection()->getPdo()->quote("string to quote");

当我发现这个答案时,我确实把它放在了我的问题中,但是我现在把它作为一个实际的答案放进去,以便其他人更容易找到。

于 2014-04-22T00:35:38.410 回答
23
$value = Input::get("userID");

$results = DB::select( DB::raw("SELECT * FROM users WHERE users.id = :value"), array(
   'value' => $value,
 ));

More Details HERE

于 2013-09-23T02:49:56.053 回答
11

你也可以试试这个,(阅读文档

$results = DB::select('SELECT * FROM users WHERE users.id = ?', array($userId));
于 2013-09-23T02:54:29.493 回答
5

我在 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);
}
于 2015-07-27T13:36:52.943 回答
5

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');
于 2019-06-26T20:59:07.070 回答
4

helpers.php在 Laravel 5 中使用它:

if ( ! function_exists('esc_sql'))
{
    function esc_sql($string)
    {
        return app('db')->getPdo()->quote($string);
    }
}

然后我可以esc_sql在需要对原始 SQL 查询进行转义的地方使用函数。

于 2015-06-08T20:41:26.983 回答
0

这是一个更完整的示例,展示了如何转义值和列并扩展 Laravel 的查询构建器:

<?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]);
        });
    }
}
于 2017-11-03T22:25:56.160 回答