php - 在类里面执行 SELECT 时无效的语句/准备

标签 php mysql select pdo prepared-statement

这个类有什么问题吗?

<?php
class myClass {
  private $dbServer  = 'localhost';
  private $dbUser    = 'db_name';
  private $dbPass    = 'db_pass';
  private $dbName    = 'db_name';

  var $error  = NULL;
  var $db;

  function connect()
  {
    // improved by http://stackoverflow.com/users/618622/bv202
    try
    {
      $this->db = new PDO('mysql:host=' . $this->dbServer . ';dbname=' . $this->dbName, $this->dbUser, $this->dbPass);
      $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      return (!$this->db) ? FALSE : TRUE;
      $this->db = NULL;
    }
    catch (PDOException $e)
    {
      print "Error!: " . $e->getMessage() . "<br/>";
      die();
    }
  }

  function columns($table)
  {
    if(!$this->connect()) $this->error =  'Error connecting/creating PDO.';
    else
    {
      $columnsTable = $this->db->prepare("DESCRIBE :_table"); // here points out the error
      if(!$columnsTable) $this->error = 'Invalid statement';
      else
      {
        $columnsTable->bindParam(':_table', $table);
        if(!$columnsTable->execute()) $this->error = 'Error while executing statement.';
        else
        {
          $columns = $columnsTable->fetchAll();
          if(!$columns) $this->error = 'Invalid fetch.';
          else
          {
            $columnsTable->closeCursor();
            foreach($columns as $column=>$columnData)
            {
              $results[] = $columnData['COLUMN_NAME'];
            }
          }
        }
        $columnsTable = NULL;
      }
    }
    return !empty($this->error) ? $this->error : $results;
  }

}

$control = new myClass;
$content = $control->columns('customers');
var_dump($content);
?>

输出:

string(17) "Invalid statement"

我直接在 MySQL 上测试了 SQL,没有错误。

MySQL版本:5.0.92
PHP版本:5.2.11

最佳答案

使用准备好的语句,您不能在任何可能类型的查询中的任何地方使用参数:它不像“将其放入字符串”:准备好的语句取决于服务器。

我想 MySQL 不接受 describe 查询中的参数——这解释了错误。

对于这种查询,您不必使用准备好的语句。


引用 MySQL's documentation :

Parameter markers can be used only where data values should appear, not for SQL keywords, identifiers, and so forth.

在您的情况下,您正尝试对标识符(表的名称) 使用参数标记——这是不受支持的。

关于php - 在类里面执行 SELECT 时无效的语句/准备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276788/

相关文章:

php - 自动调整 Excel 列宽

php - 如何通过 html 表单连接到我的服务器

php - 访问被拒绝使用 PHP 连接到 MySQL

c# - mysql 检索最后插入的自动递增值

mysql - 无法在Raspberry Pi上下载MySQL软件

php - 无法弄清楚 foreach 循环

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 如何获得mysql中某天之前和某天之后的平均评分?

mysql - 在 MySQL 中使用 SELECT 时过滤列值

sql - 带有多个嵌套 SELECT 的 MySQL INSERT