如何在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");
答案 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');