在MySQL中使用引号where语句(列名)

时间:2018-03-25 14:56:09

标签: php mysql laravel-5

有没有人知道在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的方法?

2 个答案:

答案 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无法访问与其参数组合的查询字符串。查询和参数将单独发送到数据库服务器