我有一个使用AES_ENCRYPT
的加密字段数据库数据已加密并应保持这种状态,因此无法更改加密的方法。
最近我开始与Laravel合作开发一个新项目。 当我尝试使用AES加密的字段上的where子句进行更新时, 我收到了以下问题:
SELECT * FROM `users` WHERE `mail` = ? LIMIT 1
以下绑定:
AES_ENCRYPT('email@email.com', 'somekey')
以下代码:
$email = Input::get('email');
$user = User::where("mail", "AES_ENCRYPT('{$email}', '{$this->aesKey}')")->first();
这基本上是合乎逻辑的 - 但是如何使用force它执行以下查询:
SELECT * FROM `users` WHERE `mail` = AES_ENCRYPT(?, 'someKey') limit 1
使用此绑定:
email@email.com
希望有一种方法将函数传递给值
的where子句答案 0 :(得分:8)
您可以尝试使用whereRaw()
$user = User::whereRaw("mail", "AES_ENCRYPT('{$email}', '{$this->aesKey}')")->first();
或者只是使用RAW表达式:
$user = User::where("mail", DB::raw("AES_ENCRYPT('{$email}', '{$this->aesKey}'))")->first();
答案 1 :(得分:2)
在laravel 5中,你也可以使用whereRaw和绑定,这样你就可以正确地逃避和注入。
只需将bindings数组作为第二个参数传递。 例如:
$user = User::where("mail = AES_ENCRYPT(:email, :aesKey)", ['email' => $email, 'aesKey' => $this->aesKey])->first();
答案 2 :(得分:0)
$user = User::whereRaw("mail = AES_ENCRYPT('{$email}', '{$this->aesKey}')")->first();