2009-12-22 127 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