检查有效的SQL列名称

时间:2011-02-12 11:56:27

标签: php mysql sqlite postgresql

如何在php中检查字符串是否是sql语句的有效兼容列名? 只是一个字符串匹配。

4 个答案:

答案 0 :(得分:38)

最终每个字符串都是一个有效的列名,一旦用双引号括起来(MySQL可能不遵守该规则,具体取决于配置。它不会在默认安装中使用双引号作为标识符引号)。

但是,如果您想要跨平台(如不同的DBMS标记所示),您应该检查最小公分母。

PostgreSQL manual has a nice definition

  

SQL标识符和关键字必须以字母(a-z,但也包含带变音符号和非拉丁字母的字母)或下划线(_)开头。标识符或关键字中的后续字符可以是字母,下划线,数字(0-9)或美元符号($)。请注意,根据SQL标准的字母,标识符中不允许使用美元符号,因此它们的使用可能会降低应用程序的可移植性

因此,您应该使用正则表达式检查以下内容:

  • 以字母开头
  • 仅包含字符(字母)和数字以及下划线

因此,如下所示的正则表达式应涵盖此内容:

^[a-zA-Z_][a-zA-Z0-9_]*$

由于SQL不区分大小写(除非使用双引号),允许使用大写和小写字母。

答案 1 :(得分:1)

您可以按如下方式使用MySQL查询来获取特定表中的字段:

SHOW FIELDS FROM tbl_name

然后是一些简单的PHP:

$string_to_check = 'sample';
$valid = false;
$q = mysql_query("SHOW FIELDS FROM tbl_name");
while($row = mysql_fetch_object($q)) {
  if($row->Field == $string_to_check) {
     $valid = true; break;
  }
}
if($valid) {
  echo "Field exists";
}

答案 2 :(得分:0)

使用

使用show columns或描述查询。 而不是从结果中验证。

答案 3 :(得分:-2)

如果我有同样的问题,我会搜索特定数据库文档中的特定字符列表,然后以regexp的形式实现它。

但我永远不会面对这样的问题,因为基本的拉丁字符,数字和下划线足以命名我使用的任何字段。因此,我保持了良好的可移植性和可维护性。