2011-06-23 84 views
0

在上一個線程接受了來自此處的人的建議後,我試圖將我的MySQL轉換爲PDO,但遇到了一些問題。將MySQL連接器轉換爲PDO

這是我原來的MySQL連接類:

class DbConnector { 

    public static function getInstance() { 
     static $instance = null; 
     if ($instance === null) { 
      $instance = new DbConnector(); 
     } 

     return $instance; 
    } 

    protected $theQuery; 
    private $link; 

    function DbConnector() { 

     $host = 'localhost'; 
     $db = ''; 
     $user = ''; 
     $pass = ''; 

     // connect to the db 
     $this->link = mysql_connect($host, $user, $pass); 
     mysql_select_db($db); 
     register_shutdown_function(array(&$this, 'close')); 
    } 

    public function find($query) { 
     $ret = mysql_query($query, $this->link); 
     if (mysql_num_rows($ret) == 0) 
      return array(); 
     $retArray = array(); 

     while ($row = mysql_fetch_array($ret)) 
      $retArray[] = $row; 

     return $retArray; 
    } 

    public function insert($query) { 
     $ret = mysql_query($query, $this->link); 

     if (mysql_affected_rows() < 1) 
      return false; 
     return true; 
    } 

    public function query($query) { 
     $this->theQuery = $query; 
     return mysql_query($query, $this->link); 
    } 

    public function fetchArray($result) { 
     return mysql_fetch_array($result); 
    } 

    public function close() { 
     mysql_close($this->link); 
    } 

    public function exists($query) { 
     $ret = mysql_query($query, $this->link); 
     if (mysql_num_rows($ret) == 0) 
      return false; 
    } 

    public function last_id($query) { 
     return mysql_insert_id($query); 
    } 

} 

這裏是我寫的函數:

function getRandomSubmission() { 
    global $db; 

    if(!empty($_GET['id'])){ 
     $submission_id = $_GET['id']; 

     $query = $db->find(" 
      SELECT 
       * 
      FROM 
       `submissions` 
      WHERE id = '{$submission_id}' 
      LIMIT 1 
     "); 

    } 
    else { 
     $query = $db->find(" 
      SELECT 
       * 
      FROM 
       `submissions` 
      ORDER BY RAND() 
      LIMIT 1 
     "); 
    } 


    if($query) { 
     return $query[0]; 
    } 
    else { 
     $query = $db->find(" 
      SELECT 
       * 
      FROM 
       `submissions` 
      ORDER BY RAND() 
      LIMIT 1 
     "); 
    } 
} 

這裏是PDO連接器:

$host = 'localhost'; 
$username = ''; 
$pass = ''; 
$db = ''; 

try { 
    $dbh = new PDO("mysql:host=$host;dbname=$db", $username, $pass); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

這裏是我試圖將其轉換爲,但它只是錯誤的。我想我需要在第二個if語句中返回一個PDO關聯數組,但我不確定。

function getRandomSubmission() { 
    global $dbh; 

    if(!empty($_GET['id'])){ 
     $submission_id = $_GET['id']; 

    $stmt = $dbh->prepare(' 
      SELECT 
       * 
      FROM 
       `submissions` 
      WHERE 
       `id` = ? 
      LIMIT 1 
      '); 

    $stmt->bindParam(1, $submission_id, PDO::PARAM_INT); 
    $stmt->execute(); 
    } 
    else { 
    $stmt = $dbh->prepare(' 
      SELECT 
       * 
      FROM 
       `submissions` 
      ORDER BY RAND() 
      LIMIT 1 
     '); 

    $stmt->execute(); 
    } 


    if($stmt) { 
     return $stmt[0]; 
    } 
    else { 
    $stmt = $dbh->prepare(' 
      SELECT 
       * 
      FROM 
       `submissions` 
      ORDER BY RAND() 
      LIMIT 1 
     '); 

    $stmt->execute(); 
    } 
} 

但是原來的那個按預期工作,(我知道我把連接細節留空了)。

+0

人們常常宣稱他們所有的類範圍的屬性在班級的頂部。這使得更容易確定課程中可用的所有屬性。 – dqhendricks

+0

謝謝,我通常爲我編寫的類(雖然很簡單)做這個,但這是我找到的一個,我一直在修改。我不打算在生產中使用它。謝謝:) –

回答

1

你需要調用獲取PDOStatement對象的方法:

return $stmt->fetch() 

閱讀有關抓取的風格,你真的不需要FETCH_BOTH ;-)

+0

啊哈!謝謝 :) –