2011-02-08 53 views
0

服務器運行PHP 5.2.8。 PDO安裝了mysql 5.1.30驅動程序。PDO不會從多於1列的SELECT返回結果

好了,所以我試圖找出一些PDO(這實在是讓人受不了。當我運行下面的代碼,我得到預期的結果,沒有任何問題。

但是,每當我嘗試添加多於一列(或*)到SELECT,沒有答覆從查詢 - 沒有任何結果。我已經嘗試了一切 - 我知道它一定是簡單的任何建議,爲什麼多個列無法返回任何行?

$hostname = "localhost"; 
$dbname = "dbname"; 
$username = "username"; 
$password = "password"; 
try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    /*** echo a message saying we have connected ***/ 
    echo 'Connected to database<br />'; 

    /*** The SQL SELECT statement ***/ 
    $sql = "SELECT LastName FROM staff"; 
    foreach ($dbh->query($sql) as $row) { 
     echo $row['LastName'] . '<br />'; 
    } 

    /*** close the database connection ***/ 
    $dbh = null; 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

再次,如果我嘗試將存儲在$ SQL比單一的專欄中,我得到bupkis以外的任何聲明添加列。例如:

SELECT FirstName, LastName FROM staff 

返回零結果。兩列都存在 - 如果單獨要求,它們會返回預期結果。結合時,查詢需要相當長的時間,然後不返回任何內容。

catch塊沒有發現異常。

+0

請切換PDO錯誤無聲報告例外。這可能會有所幫助。 – NikiC 2011-02-08 19:57:56

+0

你有錯誤嗎?或者查詢只是返回空? – Cfreak 2011-02-08 19:58:33

回答

2

我想你在這裏有很多問題,主要是在你的代碼中,它處理讀取查詢返回的值。我冒昧地改變了一些事情,並將其改寫爲使用準備陳述,這是PDO提供的應該利用的功能。

在準備的語句:
爲什麼使用它們:http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
PHP PDO DOC:http://php.net/manual/en/pdo.prepare.php

這裏是核心代碼:

try { 
    //open database 
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    //define sql query 
    $sql = "SELECT LastName FROM staff"; 

    //prepare the query for execution 
    $qresult = $dbh->prepare($sql); 

    //insert code below to handle parameters to the sql query here 

    //execute the query 
    $qresult->execute(); 

    //fetch the results 
    foreach ($qresult->fetch(PDO::FETCH_ASSOC) as $row) 
    { 
    echo $row['LastName'] . '<br />'; 
    } 


} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

$qresult = null; //close the result set 
$dbh = null; //close the database   

請注意,我已經更換了電話查詢( )用幾行調用prepare()然後執行()。然後,您可以輕鬆地在prepare()和execute()調用之間插入以下行來處理傳遞的參數化查詢。這將有助於減少SQL注入的機會。

我也改變了你訪問retirned價值的方式,通過指定我希望它們返回爲和關聯數組PDO :: FETCH_ASSOC。這將爲您提供一個結果集,您可以像使用舊的mysql接口一樣遍歷結果集。

如果您的查詢是參數化查詢,如:

$sql="SELECT LastName FROM staff WHERE LastName=':lastname'"; 

其中:名字是參數。

這裏是你將插入在註釋中的代碼來處理這個問題,(此代碼將處理多個參數,只需添加其他元素來$參數數組):

//bind parameters to the prepared statement 
$param = array(':lastname'=>'Jones'); 
foreach ($param as $key => $value) { 
    $qresult->bindValue($key,$value); 
    } 
0

請確保您使用逗號分隔SELECT中的列(逗號兩邊的空格沒問題,但不是必需的)。如果你想選擇所有列,只有一個*沒有其他字符。