Php 有没有一种方法可以执行准备好的描述查询?

Php 有没有一种方法可以执行准备好的描述查询?,php,mysql,pdo,Php,Mysql,Pdo,我遇到的问题是:当我试图准备一个由descripe table\u name或SHOW table\u name中的列组成的查询时,我得到一个错误,该错误声明如下: 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在/Applications/MAMP/htdocs/test.php:28 Stack trace:#0/Applications/MAMP/htd

我遇到的问题是:当我试图准备一个由
descripe table\u name
SHOW table\u name
中的列组成的查询时,我得到一个错误,该错误声明如下:

致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在/Applications/MAMP/htdocs/test.php:28 Stack trace:#0/Applications/MAMP/htdocs/test.php(28):PDOStatement->execute()#1/Applications/MAMP/htdocs/test.php(6):show_columns_yes_prepared('users')#2{main}在第28行的/Applications/MAMP/htdocs/test.php中抛出

函数
show\u columns\u not\u prepared()
按预期/希望返回以下内容:

Array
(
    [0] => uid
    [1] => name
    [2] => pass
    [3] => mail
    [4] => mode
    [5] => sort
    [6] => threshold
    [7] => theme
    [8] => signature
    [9] => signature_format
    [10] => created
    [11] => access
    [12] => login
    [13] => status
    [14] => timezone
    [15] => language
    [16] => picture
    [17] => init
    [18] => data
    [19] => timezone_name
    [20] => timezone_id
)
。。。而上述错误是由于函数
show\u columns\u yes\u prepared()
导致的。这两个代码都可以在下面找到,还有文件
test.php
中使用的其他源代码(逐字),该文件位于我的localhost的根目录中

准备
描述
SQL查询是一项不可能完成的任务吗?还是我做错了什么?也不两者都有


数据库/表创建

CREATE DATABASE `testdatabaseforpdo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `testdatabaseforpdo`;

CREATE TABLE `users` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(60) NOT NULL DEFAULT '',
  `pass` varchar(32) NOT NULL DEFAULT '',
  `mail` varchar(64) DEFAULT '',
  `mode` tinyint(4) NOT NULL DEFAULT '0',
  `sort` tinyint(4) DEFAULT '0',
  `threshold` tinyint(4) DEFAULT '0',
  `theme` varchar(255) NOT NULL DEFAULT '',
  `signature` varchar(255) NOT NULL DEFAULT '',
  `signature_format` smallint(6) NOT NULL DEFAULT '0',
  `created` int(11) NOT NULL DEFAULT '0',
  `access` int(11) NOT NULL DEFAULT '0',
  `login` int(11) NOT NULL DEFAULT '0',
  `status` tinyint(4) NOT NULL DEFAULT '0',
  `timezone` varchar(8) DEFAULT NULL,
  `language` varchar(12) NOT NULL DEFAULT '',
  `picture` varchar(255) NOT NULL DEFAULT '',
  `init` varchar(64) DEFAULT '',
  `data` longtext,
  `timezone_name` varchar(50) NOT NULL DEFAULT '',
  `timezone_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`),
  UNIQUE KEY `name` (`name`),
  KEY `access` (`access`),
  KEY `created` (`created`),
  KEY `mail` (`mail`),
  KEY `picture` (`picture`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
源代码(根据需要调整
getConnection()
中的连接信息):

这是一只鸡:

function show_columns_yes_prepared($table)
{
    $db = getConnection(); // I HOPE it's SINGLETON. Yikes, it is not
    return $db->getCol( "DESCRIBE ?n", $table);
}
对于丑陋的PDO it,您最好坚持使用
信息\u模式
查询:

但你的主要问题不是那个无用的查询 但是
getConnection()函数,它将在或多或少的生产环境中杀死您的db服务器

因为每个应用程序只应连接一次,并在整个脚本中使用该连接,而不是每次需要查询数据库时都进行连接。

因为它是一只鸡:

function show_columns_yes_prepared($table)
{
    $db = getConnection(); // I HOPE it's SINGLETON. Yikes, it is not
    return $db->getCol( "DESCRIBE ?n", $table);
}
对于丑陋的PDO it,您最好坚持使用
信息\u模式
查询:

但你的主要问题不是那个无用的查询 但是
getConnection()函数,它将在或多或少的生产环境中杀死您的db服务器


因为每个应用程序只应连接一次,并在整个脚本中使用该连接,而不是每次需要查询数据库时都进行连接。

为什么还要运行该查询?只需从
信息\u模式查询即可。我知道这是一个选项,但这不是我问的问题。您不能将参数绑定到数据库标识符(表/列名),因为这相当于执行
描述“用户”
。使用Jack所说的
信息\u模式
,或者直接将标识符名称注入查询。一些开发人员实际上并不知道这一点,因此提到。为什么您甚至需要运行该查询?只需从
信息\u模式查询即可。我知道这是一个选项,但这不是我问的问题。您不能将参数绑定到数据库标识符(表/列名),因为这相当于执行
描述“用户”
。使用Jack所说的
信息模式
,或者直接将标识符名称注入查询。一些开发人员实际上并不知道这一点,因此提到
function show_columns_yes_prepared($pdo, $table)
{
    $sql = "SELECT column_name FROM information_schema.columns WHERE table_name =?";
    $stm = $pdo->prepare($sql);
    $stm->execute([$table]);
    return $stm->fetchAll(PDO::FETCH_COLUMN);
}