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

刻板

我遇到的问题是:当我尝试准备由DESCRIBE table_name组成的查询时,出现SHOW COLUMNS FROM table_name一条错误,指出以下内容:

致命错误:消息“ SQLSTATE [42000]”未捕获的异常“ PDOException”:语法错误或访问冲突:1064 SQL语法有错误;在/Applications/MAMP/htdocs/test.php:28堆栈跟踪:#0 / Applications / MAMP / htdocs中,检查与您的MySQL服务器版本相对应的手册,以找到在“用户”附近的“用户”附近使用的正确语法:28 /test.php(28):PDOStatement-> execute()#1 /Applications/MAMP/htdocs/test.php(6):show_columns_yes_prepared('users')#2 {main}放在/ Applications / MAMP / htdocs /中第28行的test.php

该函数show_columns_not_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_columns_yes_prepared()两者都可以与test.php位于我的本地主机根目录中的文件使用的其余源代码(verbatim)一起找到

准备DESCRIBESQL查询是不可能完成的任务吗?还是我做错了什么?都不行 都?


数据库/表创建

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()根据需要在内部调整连接信息):

<?php

$table = 'users';

print_r(show_columns_not_prepared($table)); 
print_r(show_columns_yes_prepared($table)); 

function show_columns_not_prepared($table) {
  $db = getConnection();
  // Not prepared, not safe...
  $sql = "DESCRIBE $table";
  $stmt = $db->query($sql);
  $out = array();
  while ($res = $stmt->fetchAll(PDO::FETCH_ASSOC)) {
    for ($i = 0; $i < count($res); $i++) {
      $out[] = $res[$i]['Field'];
    }
  }
  return $out;
}

function show_columns_yes_prepared($table) {
  $db = getConnection();
  // Ready to be prepared...
  $sql = "DESCRIBE :table";
  $stmt = $db->prepare($sql);
  $stmt->bindValue(':table', $table, PDO::PARAM_STR);
  $stmt->execute();
  $out = array();
  while($res = $stmt->fetch(PDO::FETCH_ASSOC)) {
    for ($i = 0; $i < count($res); $i++) {
      $out[] = $res[$i]['Field'];
    }
  }
  return $out;
}

function getConnection() {
  $dbhost="localhost";
  $dbuser="someuser";
  $dbpass="somepass";
  $dbname="testdatabaseforpdo";
  $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $dbh->exec("set names utf8");
  return $dbh;
}
你的常识

使用safeMysql就像一只鸡:

function show_columns_yes_prepared($table)
{
    $db = getConnection(); // I HOPE it's SINGLETON. Yikes, it is not
    return $db->getCol( "DESCRIBE ?n", $table);
}

使用丑陋的PDO可能是一个问题,因此,您最好坚持information_schema按照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);
}

但是您的主要问题不是那个无用的查询

但是该getConnection();功能实际上会在或多或少的生产环境中杀死您的数据库服务器。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以检查特定的模板对象是否准备好了?

来自分类Dev

有没有一种方法可以在O(1)执行数据库查询

来自分类Dev

有没有一种方法可以处理SQLKata中的现有查询?

来自分类Dev

有没有一种方法可以执行按钮单击下的方法?

来自分类Dev

有没有一种方法可以在linq查询中参数化方法?

来自分类Dev

有没有一种方法可以执行对结构实例的索引访问?

来自分类Dev

有没有一种方法可以自动执行SEO检查?

来自分类Dev

有没有一种方法可以执行面向Clojure的反射?

来自分类Dev

有没有一种方法可以强制执行引用左值?

来自分类Dev

有没有一种方法可以在表的模板变量中执行html?

来自分类Dev

有没有一种方法可以执行if语句为空值

来自分类Dev

有没有一种方法可以在Java中执行goto函数?

来自分类Dev

触发Pry时,有没有一种方法可以自动执行代码?

来自分类Dev

Postgres:有没有一种方法可以在INSERT语句之后执行代码?

来自分类Dev

有没有一种方法可以强制执行引用左值?

来自分类Dev

有没有一种方法可以确保对@property以外的变量执行验证?

来自分类Dev

有没有一种方法可以提高mysql事件执行的性能?

来自分类Dev

有没有一种方法可以提高mysql事件执行的性能?

来自分类Dev

有没有一种方法可以搜索eclipse命令来执行?

来自分类Dev

有没有一种方法可以使SQL NOT IN查询更快?

来自分类Dev

有没有一种方法可以计算MySQL查询响应的大小?

来自分类Dev

有没有一种方法可以结合计数和选择查询?

来自分类Dev

有没有一种方法可以优化此查询

来自分类Dev

有没有一种方法可以优化此Gremlin查询?

来自分类Dev

有没有一种方法可以在@Path批注中指定查询参数?

来自分类Dev

有没有一种方法可以按名称查询DbSet的名称属性?

来自分类Dev

有没有一种方法可以加快此查询的速度?

来自分类Dev

有没有一种方法可以强制Solr查询不使用缓存?

来自分类Dev

有没有一种方法可以设置Calabash触摸或查询的参数

Related 相关文章

  1. 1

    有没有一种方法可以检查特定的模板对象是否准备好了?

  2. 2

    有没有一种方法可以在O(1)执行数据库查询

  3. 3

    有没有一种方法可以处理SQLKata中的现有查询?

  4. 4

    有没有一种方法可以执行按钮单击下的方法?

  5. 5

    有没有一种方法可以在linq查询中参数化方法?

  6. 6

    有没有一种方法可以执行对结构实例的索引访问?

  7. 7

    有没有一种方法可以自动执行SEO检查?

  8. 8

    有没有一种方法可以执行面向Clojure的反射?

  9. 9

    有没有一种方法可以强制执行引用左值?

  10. 10

    有没有一种方法可以在表的模板变量中执行html?

  11. 11

    有没有一种方法可以执行if语句为空值

  12. 12

    有没有一种方法可以在Java中执行goto函数?

  13. 13

    触发Pry时,有没有一种方法可以自动执行代码?

  14. 14

    Postgres:有没有一种方法可以在INSERT语句之后执行代码?

  15. 15

    有没有一种方法可以强制执行引用左值?

  16. 16

    有没有一种方法可以确保对@property以外的变量执行验证?

  17. 17

    有没有一种方法可以提高mysql事件执行的性能?

  18. 18

    有没有一种方法可以提高mysql事件执行的性能?

  19. 19

    有没有一种方法可以搜索eclipse命令来执行?

  20. 20

    有没有一种方法可以使SQL NOT IN查询更快?

  21. 21

    有没有一种方法可以计算MySQL查询响应的大小?

  22. 22

    有没有一种方法可以结合计数和选择查询?

  23. 23

    有没有一种方法可以优化此查询

  24. 24

    有没有一种方法可以优化此Gremlin查询?

  25. 25

    有没有一种方法可以在@Path批注中指定查询参数?

  26. 26

    有没有一种方法可以按名称查询DbSet的名称属性?

  27. 27

    有没有一种方法可以加快此查询的速度?

  28. 28

    有没有一种方法可以强制Solr查询不使用缓存?

  29. 29

    有没有一种方法可以设置Calabash触摸或查询的参数

热门标签

归档