与预准备语句和LIKE一起使用时,SHOW COLUMNS返回错误

时间:2018-04-30 13:05:34

标签: php mysql pdo

我在下面的MySQL / MariaDB查询中遇到了麻烦,我无法弄清楚原因。

$field = 'some_db_field';
$field = '%' . $field . '%';

$query = $db->prepare(
    " SHOW COLUMNS "
  . "         FROM table"
  . "         LIKE :fieldName"
);

$query->bindParam(':fieldName', $field, PDO::PARAM_STR);
$query->execute();

我收到以下错误:

  

致命错误:未捕获的异常' PDOException' with message' SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MariaDB服务器版本相对应的手册,以便在'附近使用正确的语法?'在第1行'在script.php中:

我做错了什么?

1 个答案:

答案 0 :(得分:2)

我也遇到过这个问题。

您根本无法在SHOW COLUMN查询中使用PDO bindParam函数。

我不知道为什么。我已经搜索了文档和网络几个小时,我找不到任何解释。

另一种方法是使用PDO::getColumnMeta

或者查询information_schema

$field = 'some_db_field';
$field = '%' . $field . '%';

$query = $db->prepare( 
    " SELECT * "
  . " FROM INFORMATION_SCHEMA.COLUMNS "
  . " WHERE table_name = 'your_table' AND column_name LIKE :fieldName "
);

$query->bindParam(':fieldName', $field, PDO::PARAM_STR);
$query->execute();
    return $output; 
}

这个优于SHOW COLUMN:你有更多的列信息返回。示例:

| TABLE_CATALOG | TABLE_SCHEMA |  TABLE_NAME | COLUMN_NAME | ORDINAL_POSITION | COLUMN_DEFAULT | IS_NULLABLE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | DATETIME_PRECISION | CHARACTER_SET_NAME |  COLLATION_NAME | COLUMN_TYPE | COLUMN_KEY | EXTRA |                      PRIVILEGES | COLUMN_COMMENT |
|---------------|--------------|-------------|-------------|------------------|----------------|-------------|-----------|--------------------------|------------------------|-------------------|---------------|--------------------|--------------------|-----------------|-------------|------------|-------|---------------------------------|----------------|
|           def |  db_9_1e4841 | input_table | Agency_CODE |                1 |         (null) |         YES |   varchar |                        3 |                      9 |            (null) |        (null) |             (null) |               utf8 | utf8_general_ci |  varchar(3) |            |       | select,insert,update,references |                |