Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查有效的SQL列名_Php_Mysql_Sqlite_Postgresql - Fatal编程技术网

Php 检查有效的SQL列名

Php 检查有效的SQL列名,php,mysql,sqlite,postgresql,Php,Mysql,Sqlite,Postgresql,如何在php中检查字符串是否是sql语句的有效兼容列名? 只是字符串匹配。使用 使用“显示列”或“描述查询”。 并从结果进行验证 您可以按如下方式使用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_

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

使用

使用“显示列”或“描述查询”。
并从结果进行验证

您可以按如下方式使用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";
}

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


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

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

但是,如果您想要跨平台(正如不同的DBMS标记所建议的那样),则应该检查最小公分母

其中:

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

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

  • 以字母开头
  • 仅包含字符(字母)、数字和下划线
因此,下面这样的正则表达式应该包括:

^[a-zA-Z_u][a-zA-Z0-9_u]*$


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

对于mysql,其信息\u架构表查询“有效”是什么意思?您的意思是字符串在DB表中作为列存在吗?或者你们的意思是数据库支持这个字符串作为列名吗?我不会查的,伙计。基于未知源动态创建数据库表是我最不愿意做的事情。我不是动态创建表,我只是在独立模块中确保内部输入变量看起来像列名, assertions@YuriKolovsky:如果在mysql中使用`in,则可以使用任何名称。@zerkms您不能直接使用任何名称作为表名,例如,创建表`@Apostle:只需将其加倍即可“创建表`te``st`(c int);”@Smudge:unicode字符不允许用于非引号标识符。一旦你使用了一个带引号的标识符,你就不需要正则表达式了,因为当你引用这个名字时,任何东西都是允许的。@horse\u加上\u no\u名字,好的,这是有意义的。我实际上想的是,它不支持PostgreSQL引用的所谓“非拉丁字母”和“带变音标记的字母”。今天我碰巧碰到了一个类似的正则表达式字符串,这也影响了Unicode的支持。@Smudge:我建议不要使用任何需要引用的名称。如果您将自己限制为“仅ASCII”名称,那么从长远来看,麻烦会小得多。@a_horse_和_no_名称我同意这样做比较麻烦,但是如果您正在构建一个与数据库连接的系统(跨平台或其他),并且希望它在国际上使用,那么针对非ASCII字符进行验证是一个真正的好处,不管多么麻烦。当然,分隔标识符通常可以解决这个问题,但在某些情况下(例如,函数参数),不可能使用引号或括号,但在某些平台上仍然支持Unicode。因此,这是一个需要解决的有趣问题。我的观点很简单,[a-zA-Z]正则表达式并不总是能解决这个问题。@a“u horse”和“u no”的名称我同意你应该避免使用需要引用的名称,但即使使用正则表达式名称,如“order”和“group”,也需要引用。