2009-12-22 86 views
0

我使用NetBeans 6.8,並有MAMP這個配置我的Mac上:爲什麼這些準備好的陳述不起作用?

Apache 2.0.63 
MySQL 5.1.37 
PHP 4.4.9 & 5.2.10 
APC 3.0.19 & APC 3.1.2 
eAccelerator 0.9.5.3 
XCache 1.2.2 
phpMyAdmin 2.11.9.5 & phpMyAdmin 3.2.0.1 
Zend Optimizer 3.3.3 
SQLiteManager 1.2.0 
Freetype 2.3.9 
t1lib 5.1.2 
curl 7.19.5 
jpeg 7 
libpng-1.2.38 
gd 2.0.34 
libxml 2.7.3 
libxslt 1.1.24 
gettext 0.17 
libidn 1.15 
iconv 1.13 
mcrypt 2.5.8 
YAZ 3.0.47 & PHP/YAZ 1.0.14 

我的MySQL的PDO驅動程序是客戶端庫版本5.1.37

我嘗試在這裏使用準備好的語句。

這工作完全無準備的語句:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"'); 
    //$prepared->bindParam('foo', 'root'); 

    $prepared->execute(); 

    foreach($prepared as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

但這並不用事先準備好的聲明在所有的工作。這樣做時完全空白頁:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=:foo'); 
    $prepared->bindParam('foo', 'root'); 

    $prepared->execute(); 

    foreach($prepared as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

foo應該被替換爲根。但是,它沒有。好吧,讓我們嘗試一下,這也完全不起作用:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=?'); 
    $prepared->bindParam(1, 'root'); 

    $prepared->execute(); 

    foreach($prepared as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

絕對沒有。我甚至沒有收到錯誤信息。只是一個空白頁面。在這段代碼之後,標準HTML輸出會有一些回聲。它不會熄滅,所以腳本在bindParam方法調用附近停止。

另外,這工作完全正常,沒有任何事先準備好的聲明:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root'); 
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"'); 
    //$prepared->bindParam('foo', 'root'); 

    $prepared->execute(); 

    foreach($prepared as $row) { 
     print_r($row); 
    } 
    $dbh = null; 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

就像你所看到的,顯然所有的版本是完全一樣的查詢。隨着PS不起作用。沒有PS它。現在我發現了PHP本身中的一個殘酷的錯誤?

準備好的語句是否可能在某處被禁用?

回答

2

綁定名稱是:foo - 而不是foo。你不應該使用bindParam,但是bindValue,因爲你沒有給變量作爲參數。例如。 :

$prepared->bindValue(':foo', 'root'); 

一般情況下,我建議你從未使用bindParam,因爲它具有一定的參考語義,從而可以創造一些真正難以發現錯誤。

+0

+1閱讀手冊被低估。 – 2009-12-22 14:32:47

+0

平心而論,冒號很容易錯過。 – troelskn 2009-12-22 14:33:42

+0

我很幸運地打了兩個教程,不要在綁定方法中包含冒號。天啊!謝謝! – openfrog 2009-12-22 14:35:14

3

您正在使用這種代碼:

$prepared->bindParam('foo', 'root'); 

bindParam期待一個變量作爲第二個參數:

bool PDOStatement::bindParam (mixed $parameter , 
    mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length 
    [, mixed $driver_options ]]]) 


在這裏,你應該使用bindValue,因爲你只想綁定...值...而不是一個變量參考SQL查詢傳遞:

bool PDOStatement::bindValue (mixed $parameter , mixed $value 
    [, int $data_type = PDO::PARAM_STR ]) 

所以,你的代碼看起來像:

$prepared->bindValue(':foo', 'root'); 

(不要忘了「:」帕拉姆名稱之前,順便說一句;-))

+0

很好的解釋。所以這兩件事都是錯誤的。缺少冒號和錯誤的方法。 – openfrog 2009-12-22 14:38:49

+0

謝謝:-)好吧,一次解決了兩個問題;這對一個單一的問題並不壞,是嗎? – 2009-12-22 14:43:17