我使用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本身中的一個殘酷的錯誤?
準備好的語句是否可能在某處被禁用?
+1閱讀手冊被低估。 – 2009-12-22 14:32:47
平心而論,冒號很容易錯過。 – troelskn 2009-12-22 14:33:42
我很幸運地打了兩個教程,不要在綁定方法中包含冒號。天啊!謝謝! – openfrog 2009-12-22 14:35:14