在Laravel 4中转义原始SQL查询

Dwi*_*ght 32 php mysql pdo laravel laravel-4

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

$query = DB::select("SELECT * FROM users WHERE users.id = " . DB::escape($userId));
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

DB::connection()->getPdo()->quote("string to quote");
Run Code Online (Sandbox Code Playgroud)

Dwi*_*ght 59

你可以通过DB门面以这种方式引用你的字符串.

DB::connection()->getPdo()->quote("string to quote");
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!令人惊讶的是人们如何坚持回答错误的问题.我需要和你一样的答案,参数在我的情况下也不起作用. (3认同)

小智 19

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

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

更多细节在这里

  • 这不回答这个问题,它表示我不是在寻找带占位符的解决方案,而是寻找逃避一个变量的适当方法. (4认同)

The*_*pha 9

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

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

  • 这个答案+1.使用数组绑定(如上例所示)将保护您.更多信息,请访问http://forums.laravel.io/viewtopic.php?id=11068 (2认同)

Son*_*nny 9

我使用的两个答案在外观中内置了不太冗长的解决方案DB

首先,值引用

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

二、标识符引用(表名和列名):

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


Raf*_* G. 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);
}
Run Code Online (Sandbox Code Playgroud)