我使用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