php原始sql查询,关于php:在Laravel 4中逃避原始SQL查询

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

谢谢。 包含解决方案的+1(你也可以将它作为答案分开发布,并接受它......可以为我们节省一些时间)

@ J.Bruni,好点! 我现在已将其添加为实际答案,因此应该更容易找到。

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

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

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

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

工作,但这么长的事情要打电话! DB :: escape()会很好。

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

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

'value' => $value,

));

更多细节在这里

这没有回答这个问题,它表示我不是在寻找带有占位符的解决方案,而是寻找逃避一个变量的适当方法。

@Dwight:因为没有实际意义。当您转义为将变量值实际编码为SQL时,占位符也是如此。 PDO也是如此。

要注意,我在使用这个和更多where语句时遇到了问题。查询构建器不会将select()中的占位符与where中的其他动态替换组合在一起。

@hakre如果我需要将一堆(变量数)变量放入语句的"IN()"部分,该怎么办?

@Janis:你能找到这样的问题吗?我可以将数组绑定到IN()条件吗?这是姐姐的问答。

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

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

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

这没有回答这个问题,它表示我不是在寻找带有占位符的解决方案,而是寻找逃避一个变量的适当方法。

@Dwight,这是array binding/bound params所做的,安全的,转义的,不能应用sql注入而不仅仅是占位符。请阅读此答案以清除自己。

@Dwight,还注意到第一条评论,没有澄清你吗?

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

}

DB::query()->getGrammar()可能是一种更直接的方法。让其他开发者不要问太多问题。

我在Laravel 5的helpers.php中使用它:

if ( ! function_exists('esc_sql'))

{

function esc_sql($string)

{

return app('db')->getPdo()->quote($string);

}

}

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

我使用的两个答案在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');

这是一个更全面的示例,展示如何转义值和列并扩展Laravel的querybuilder:

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]);

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值