有没有人知道在where语句中可以在列名中使用引号的任何方式?
例如
SELECT * FROM users WHERE "username" = 'Joe Bloggs'
而不是
SELECT * FROM users WHERE username = 'Joe Bloggs'
这就是我想要这样做的原因。
我正在制作一个Laravel应用程序,我正在尝试通过ajax创建我自己的通用提交sql函数,用户可以在其中指定所需的所有参数。
例如,
JS
var argument = "id";
var argumentValue = 7;
var value = "Smith";
$.post('/genericUpdate', {'argument':argument, 'argumentValue':argumentValue, 'value':value});
全局控制器(PHP)
public function genericUpdate(Request $request){
$input = $request->all();
$argument = $input['argument'];
$value = $input['value'];
$argumentValue = $input['argumentValue'];
$query = DB::update('UPDATE users SET surname = ? where ? = ?', [$value, $argument, $argumentValue]);
}
但不幸的是,这会运行以下声明
UPDATE users SET surname = "smith" WHERE "id" = "7";
如果在MySQL中无法做到这一点,有没有人知道在JS或PHP中将"id"
转换为id
的方法?
答案 0 :(得分:2)
您可以使用查询构建器:
DB::table('users')
->where($argument, $argumentValue)
->update(['surname' => $value]);
您应该使用白名单来验证列名称。它可能是这样的:
$whitelist = collect([
'id',
'otherColumn',
// more columns
]);
$argument = $input['argument'];
if (!$whitelist->contains($argument)) {
throw new Exception('Unknown argument');
}
永远不要相信客户。即使它是你自己的JS代码。
答案 1 :(得分:0)
准备好的陈述只是为了让你可以在其中注入价值。 PDO无法访问与其参数组合的查询字符串。查询和参数将单独发送到数据库服务器