在Laravel 4中转义原始SQL查询

时间:2013-09-23 02:43:08

标签: php mysql pdo laravel laravel-4

如何在Laravel 4中转义传递给原始查询的参数?我期待类似DB::escape()(从Laravel 3响起铃声)并尝试DB::quote()(我认为可以通过PDO object获得)

$query = DB::select("SELECT * FROM users WHERE users.id = " . DB::escape($userId));

我们不能将select方法与占位符一起使用,因为上面只是我们尝试实现的一个简化示例。我们有一个大型自定义查询,其中包含一些不能嵌套的选择查询适应查询构建器。

在插入Laravel 4之前逃避某些事情的最佳方法是什么?

编辑:

我刚刚发现你可以通过这种方式访问​​PDO对象并使用quote函数。这仍然是最好的方法,还是有更简单的方法来访问这个功能?

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

7 个答案:

答案 0 :(得分:55)

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

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

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

答案 1 :(得分:19)

$value = Input::get("userID");

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

更多详情HERE

答案 2 :(得分:9)

你也可以尝试这个,(Read Documentation

$results = DB::select('SELECT * FROM users WHERE users.id = ?', array($userId));

答案 3 :(得分:3)

我在Laravel 5的helpers.php中使用了这个:

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

然后我可以使用esc_sql函数,我需要在原始SQL查询中进行转义。

答案 4 :(得分:3)

在寻找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);
}

答案 5 :(得分: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]);
        });
    }
}

答案 6 :(得分:0)

我在这里使用的两个答案在DB外观中内置的详细解决方案较少。

首先,value quoting

// From linked answer
DB::connection()->getPdo()->quote("string to quote");
// In the DB facade
DB::getPdo()->quote('string to quote');

第二,identifier quoting(表名和列名):

// From linked answer
DB::table('x')->getGrammar()->wrap('table.column');
// In the DB facade
DB::getQueryGrammar()->wrap('table.column');