2013-04-28 80 views
1

我試過在PDO中禁用模擬準備,但我無法讓它工作。其他一切正常。查詢成功。我認爲它不工作的原因是因爲它不能避免引號,所以我得到語法錯誤。將PDO :: ATTR_EMULATE_PREPARES設置爲false不起作用

我試過兩種不同的方法。

$this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

$insert = $database->$con->prepare($insert, array(PDO::ATTR_EMULATE_PREPARES => false)); 

我也注意到的getAttribute不起作用。

通過這樣做......

$emul = $database->$con->getAttribute(PDO::ATTR_EMULATE_PREPARES); 
    var_dump($emul); 

...我得到這個錯誤

SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute 

這是我的數據庫類,其中動作發生。 (我可能會留下一些不必要的/愚蠢的代碼在那裏,而我測試。)

<?php 
class Database 
{ 
    public $dbh; 
    public $dbh1; 
    public $dbh2; 
    private static $instance; 

    public $numResults; 
    private $result = array();   // Results that are returned from the query 

    public function __construct() 
    { 
     try 
     { 
      $this->dbh = new PDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASS); 
      $this->dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

      $this->dbh1 = new PDO(DB_TYPE1.':host='.DB_HOST1.';dbname='.DB_NAME1.';charset=utf8', DB_USER1, DB_PASS1); 
      $this->dbh1->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      $this->dbh1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

      $this->dbh2 = new PDO(DB_TYPE2.':host='.DB_HOST2.';dbname='.DB_NAME2.';charset=utf8', DB_USER2, DB_PASS2); 
      $this->dbh2->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      $this->dbh2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
     catch (PDOException $e) 
     { 
      die("Database Error: ". $e->getMessage() . "<br />"); 

     } 
    } 

    public static function getInstance() 
    { 
     if (!isset(self::$instance)) 
     { 
      $object = __CLASS__; 
      self::$instance = new $object; 
     } 
     return self::$instance; 
    } 

    private function tableExists($table, $con) 
    { 
     switch($con) 
     { 
      case 'dbh': 
      $db_name = DB_NAME; 
      break; 
      case 'dbh1': 
      $db_name = DB_NAME1; 
      break; 
      case 'dbh2': 
      $db_name = DB_NAME2; 
      break; 
     } 

     $database = Database::getInstance(); 

     if(is_array($table)) 
     { 
      for($i = 0; $i < count($table); $i++) 
      { 
       $tablesInDb = $database->$con->prepare('SHOW TABLES FROM '.$db_name.' LIKE "'.$table[$i].'"'); 
       $tablesInDb->execute(); 
       $rowCount = $tablesInDb->rowCount(); 

       if($tablesInDb) 
       { 
        if($rowCount <> 1) 
        { 
         die('Error: Table does not exist'.$table[$i]); 
        } 
       } 
      } 
     }else 
     { 
      $tablesInDb = $database->$con->prepare('SHOW TABLES FROM '.$db_name.' LIKE "'.$table.'"'); 
      $tablesInDb->execute(); 
      $rowCount = $tablesInDb->rowCount(); 

      if($tablesInDb) 
      { 
       if($rowCount <> 1) 
       { 
        die('Error: Table does not exist'.$table); 
       } 
      } 
     } 

     return true; 
    } 

    public function insert($con, $table, $values, $cols = null) 
    { 
     if($this->tableExists($table, $con)) 
     { 
      $insert = 'INSERT INTO '.$table; 

      if($cols != null) 
      { 
       $cols = implode(',', $cols); 
       $insert.= '('.$cols.')'; 
      } 

      for($i = 0; $i < count($values); $i++) 
      { 
       if(is_string($values[$i])) 
        $values[$i] = "'".$values[$i]."'"; 
      } 

      $values = implode(',', $values); 
      $insert .= ' VALUES ('.$values.')'; 

      $database = Database::getInstance(); 
      $insert = $database->$con->prepare($insert, array(PDO::ATTR_EMULATE_PREPARES => false)); 
      $insert->execute(); 

      if($insert) 
      { 
       return true; 
      }else 
      { 
       return false; 
      } 
     } 
    } 

    public function getResult() 
    { 
     return $this->result; 
    } 
} 

?> 
+0

語法錯誤? ** [請教一個關於這個問題的問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem),而不是基於它的假設。** – 2013-04-28 16:13:44

+0

那麼,這一切都取決於'DB_TYPE'是什麼......並不是每種類型都可能準備好語句。 – Wrikken 2013-04-28 16:21:37

+0

@Wrikken DB_TYPE是mysql。 – Riketh 2013-04-28 16:22:19

回答

1
  1. 作爲manual狀態,getAttribute()不支持ATTR_EMULATE_PREPARES
  2. 沒有不宜與本地沒有準備逃脫在所有。
  3. 要檢查您是否處於仿真模式,您可以使用LIMIT clause with lazy binding。如果仿真打開,它會引發錯誤。
  4. 你的主要問題是你提到的任何「語法錯誤」,你必須先解決它。
  5. 正如ÁlvaroG. Vicario在評論中指出的那樣,您沒有使用準備好的語句。這顯然是問題的根源。 PDO本身不會「逃避」你的數據。只有在您使用佔位符來代表您在查詢中的數據時,才能執行此操作。您可以閱讀更多here
相關問題