2013-05-17 63 views
-2

檢索數據這裏是實現函數之前的代碼,從數據庫使用功能PDO

能正常工作。然後我移動db連接命令來分開php文件(functions.php)。並創建了這個功能,

function run_db($sqlcom,$exe){ 
    $conn = new PDO('mysql:host=localhost;dbname=dbname', 'usr', 'pass'); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $conn->prepare($sqlcom); 
    $stmt->execute($exe); 
    $data_db = $stmt->fetch(PDO::FETCH_ASSOC) ; 
    return $data_db; 
} 

後來我改變第一次提到這樣的代碼,

try { 
    $data_db=run_db('SELECT * FROM posts WHERE status= :published ORDER BY id DESC LIMIT 5',array(':published' => 'published')); 
    while ($result = $data_db) { 
    $contents = $result['content']; 
    $title = $result['title']; 

那麼我得到的是一個後重復無限。任何人都可以告訴我如何糾正?

+1

每次調用函數時都不應該連接。你會殺死你的數據庫服務器。 –

回答

3

更改的功能如下:

function run_db($sqlcom,$exe){ 
    $conn = new PDO('mysql:host=localhost;dbname=dbname', 'usr', 'pass'); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $conn->prepare($sqlcom); 
    $stmt->execute($exe); 
    return $stmt; 
} 

和調用該函數:

try { 
    $stmt = run_db('SELECT * FROM posts WHERE status= :published ORDER BY id DESC LIMIT 5',array(':published' => 'published')); 
    while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     $contents = $result['content']; 
     $title = $result['title']; 

編輯:更好的解決方案是,JEROEN建議之一 - 到立即返回所有提取的對象

function run_db($sqlcom,$exe){ 
    $conn = new PDO('mysql:host=localhost;dbname=dbname', 'usr', 'pass'); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $stmt = $conn->prepare($sqlcom); 
    $stmt->execute($exe); 
    return $stmt->fetchAll(PDO::FETCH_ASSOC); 
} 

則調用此方法:

try { 
    $data = run_db('SELECT * FROM posts WHERE status= :published ORDER BY id DESC LIMIT 5',array(':published' => 'published')); 
    foreach($data as $result) { 
     $contents = $result['content']; 
     $title = $result['title']; 

編輯2:反正 - 包裝這樣的邏輯放到一個功能是不是很不錯的主意。現在只能執行SELECT查詢,並且結果數組始終只包含記錄的關聯數組。如果您想(由於任何原因)檢索對象或甚至的數組只有一個值?如果您要執行INSERTUPDATEDELETE查詢怎麼辦?

如果您肯定希望走這條路,那麼我想創建與函數的類是這樣的:

class MyPDO { 
    private $connection; 

    static $instance; 

    function __construct() { 
     $this->connection = new PDO('mysql:host=localhost;dbname=dbname', 'usr', 'pass'); 
     $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

    static function getInstance() { 
     return self::$instance ? : self::$instance = new MyPDO; 
    } 

    // retrieves array of associative arrays 
    function getAssoc($sqlcom, $exe) { 
     $stmt = $this->connection->prepare($sqlcom); 
     $stmt->execute($exe); 

     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } 

    // retrieves array of objects 
    function getObj($sqlcom, $exe) { 
     $stmt = $conn->prepare($sqlcom); 
     $stmt->execute($exe); 

     return $stmt->fetchAll(PDO::FETCH_OBJ); 
    } 

    // retireves one single value, like for SELECT 1 FROM table WHERE column = true 
    function getOne($sqlcom, $exe) { 
     $stmt = $conn->prepare($sqlcom); 
     $stmt->execute($exe); 

     return $stmt->fetchColumn(); 
    } 

    // just executes the query, for INSERT, UPDATE, DELETE, CREATE ... 
    function exec($sqlcom, $exe){ 
     $stmt = $conn->prepare($sqlcom); 

     return $stmt->execute($exe); 
    } 
} 

那麼你可以這樣調用它:

try { 
    $pdo = MyPDO::getInstance(); 
    foreach($pdo->getAssoc('MySQL QUERY'), array($param, $param)) as $result) { 
     print_r($result); 
    } 
} catch(\Exception $e) { 
    // ... 
} 
+0

是的,我實施你的建議,使用類。 thx爲您的努力。 – aruth

+0

不客氣! – shadyyx

2

剛返回聲明:

function run_db($sqlcom,$exe){ 
    static $conn; 
    if ($conn == NULL) 
    { 
     $conn = new PDO('mysql:host=localhost;dbname=dbname', 'usr', 'pass'); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    $stmt = $conn->prepare($sqlcom); 
    $stmt->execute($exe); 
    return $stmt; 
} 


try { 
    $stmt=run_db('SELECT * FROM posts WHERE status= :published ORDER BY id DESC LIMIT 5',array(':published' => 'published')); 
    while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $contents = $result['content']; 
    $title = $result['title']; 

而且您還可以在連接上設置默認fecth模式。

0

到從函數返回$stmt正確答案的替代,將是fetch all rows在功能和主代碼使用foreach

在功能:功能

... 
$data_db = $stmt->fetchAll(PDO::FETCH_ASSOC) ; 
return $data_db; 

外:

$data_db=run_db('SELECT * FROM posts WHERE status= :published ORDER BY id DESC LIMIT 5',array(':published' => 'published')); 
foreach ($data_db as $result) { 
    $contents = $result['content']; 
    $title = $result['title']; 
    ... 
+1

絕對是最好的答案!我怎麼能不考慮'fetchAll'?我的天啊! – shadyyx

+0

這就是我正在尋找的,謝謝。 – aruth

0

你的代碼有兩個基本問題。

  1. 它每次運行查詢都會連接。
  2. 它只返回一種格式的數據,而PDO可以返回幾十個不同格式的結果。

接受的答案使它錯了,因爲它只是試圖重塑PDO功能,但非常髒的方式,有很多重複的代碼,仍然沒有使它像香草PDO一樣好。

正如xdazz的回答中所述,您必須返回該聲明。然後使用PDO的本地獲取模式以期望的格式獲得結果,使用方法鏈接

此外,您不應該將try添加到您的代碼。