【问题标题】:Adding backtick to column name when building mysql query from a string从字符串构建mysql查询时向列名添加反引号
【发布时间】:2018-06-26 21:34:07
【问题描述】:

我正在从数据库处理程序类构建我的 SQL 查询。但是,我无法在列名周围添加反引号。我需要反引号,因为该表有一个名为 ADMIN 的列,我的查询失败,因为它是我正在使用的 mysql 版本中的保留关键字。

“ADMIN LIKE”附近的 SQL 语法有错误 '%search_string%' OR BAN LIKE '%search_string%') ORDER BY ID DESC'

下面非常简化的是关于我如何使用该类的描述

我将 $where 子句发送给这样的类

$where = array("ID" => "%search_string%", 
               "USERNAME"=> "%search_string%", 
               "ADMIN"=> "%search_string%", 
               "BAN" => "%search_string%");

然后为准备好的语句添加占位符

$where = implode(" LIKE ? $andOr ", array_keys($where));

然后得到“ID LIKE?OR USERNAME LIKE?OR ADMIN LIKE?OR BAN LIKE?”

我尝试添加一个 foreach 循环来更改这样的列名

foreach($where as $key => $value) {
    $where["`" . $key "`"] = $value;
    unset($where[$key]);
}

但这不起作用,因为我随后在查询中将列名作为字符串获取,如 "'`ID`' LIKE ? OR '`USERNAME`' LIKE ? OR '`ADMIN`' LIKE ? OR '`BAN`' LIKE ?" 和 mysql 给我一个关于 "`column_name`" 不存在的错误

在处理这样的字符串时是否要在列名中添加反引号,或者我是否必须重命名列名 ADMIN 并浏览整个页面并使用新的列名更改脚本?

【问题讨论】:

  • 你的数据库类写得不好。它应该自动添加这些 backsticks。
  • 这就是我现在想做的事情。
  • 您在使用别名时遇到过这个问题吗?如果你添加your_alias.column_name admin 仍然有问题吗?
  • 解决了 Mickael 的问题。因此,如果无法在字符串中添加反引号,请使用它。

标签: php mysql


【解决方案1】:

您可以在将列输入到 implode 函数时使用数组映射自动将反引号添加到列。

$where = implode(" LIKE ? $andOr ", 
    array_map(function($key) {
        return "`$key`";
    }, array_keys($where))
);

【讨论】:

  • 谢谢!修复它:)
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
相关资源
最近更新 更多