Php 在类上执行SELECT时,语句/准备无效

Php 在类上执行SELECT时,语句/准备无效,php,mysql,select,pdo,prepared-statement,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 h

这门课怎么了

<?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);
?>
我在MySQL上直接测试了SQL,没有错误

MySQL版本:5.0.92
PHP版本:5.2.11

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

我假设MySQL不接受descripe查询中的参数,这就解释了错误

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

引述:

只能使用参数标记 应显示数据值的位置,而不是 用于SQL关键字、标识符等 第四


在您的情况下,您试图使用参数标记作为表名的标识符,这是不受支持的。

对于准备好的语句,您不能在任何可能的查询类型中的任何位置使用参数:这不像是将其放入字符串:准备好的语句取决于服务器

我假设MySQL不接受descripe查询中的参数,这就解释了错误

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

引述:

只能使用参数标记 应显示数据值的位置,而不是 用于SQL关键字、标识符等 第四


在您的例子中,您试图使用参数标记作为表名的标识符,这是不受支持的。

Wow!谢谢你,帕斯卡,我更改了行,现在它可以工作了:$columnstale=$this->db->prepareSELECT*FROM INFORMATION\u SCHEMA.Columns其中TABLE\u NAME=:\u TABLE;哇!谢谢你,帕斯卡,我更改了行,现在它可以工作了:$columnstale=$this->db->prepareSELECT*FROM INFORMATION\u SCHEMA.Columns其中TABLE\u NAME=:\u TABLE;创建PDO对象时,应该始终捕获异常。如果您不这样做,并且出现了诸如mysql服务器关闭之类的错误,那么您的数据库信息包括密码!可以输出。请参阅:@Bv202改进了连接功能,谢谢。在创建PDO对象时,您应该始终捕获异常。如果您不这样做,并且出现了诸如mysql服务器关闭之类的错误,那么您的数据库信息包括密码!可以输出。请看:@Bv202改进了连接功能,谢谢。
string(17) "Invalid statement"