Я использую NetBeans 6.8 и у меня на компьютере Mac есть MAMP с этой конфигурацией:
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
Мой драйвер PDO для MySQL - это версия клиентской библиотеки 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 следует заменить на root. Однако это не так. Итак, давайте попробуем это, что также не работает вообще:
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?
Возможно ли, что подготовленные операторы где-то отключены?