Разъём PDO нельзя использовать на странице с несколькими экземплярами
Вверху моей php-страницы я включаю скрипт подключения, который называется:
include("connector.php")
Connector.php
<?php
try
{
$db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
echo $e->getMessage();
}
?>
Затем я делаю все последующие звонки на своих страницах по мере необходимости. В частности, на одной странице я первоначально делаю вызов хранимой процедуры MySQL:
$stmt = $db->prepare("CALL Procedure(:id)");
$stmt->bindParam(':id', $id);
$stmt->execute();
while($row=$stmt->fetch()) {
echo "<tr>
<td>".$row['ID']."</td>
<td>".$row['NAME']."</td>
</tr>";
}
Нет проблем с моей хранимой процедурой, но когда я пытаюсь выполнить какие-либо последующие вызовы, на странице появляется обычная ошибка небуферизованных запросов PDO Mysql:
Неустранимая ошибка: необработанное исключение "PDOException" с сообщением "SQLSTATE[HY000]: общая ошибка: 2014 г. Невозможно выполнить запросы, когда другие небуферизованные запросы активны. Рассмотрите возможность использования PDOStatement::fetchAll(). В качестве альтернативы, если ваш код работает только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.' в C:\page.php:261 Трассировка стека: #0 C:\page.php(261): PDOStatement->execute(Array) #1 {main}, брошенный в C: \ page.php в строке 261
Да, я пытался использовать FetchAll, и НЕТ, я не хочу использовать атрибут PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, так как мы можем отключить MySQL в более поздний момент времени, и я не хочу перестраивать на основе каждой БД (не говоря уже о том, чтобы даже когда я включил это не сработало).
Есть идеи, почему это может происходить? Я мог бы "включить" файл connector.php перед каждым вызовом БД, но это кажется повторяющимся, и мне пришлось бы $db->NULL для каждого оператора.
Примечание: похоже, это влияет только на страницы с обращениями к хранимым процедурам. Есть идеи?
Примечание: это выполняется на компьютере Windows с XAMPP 1.7.3 под управлением Apache 2.2.14, PHP 5.3.1
2 ответа
Очевидно, это вызвано ошибкой в PHP и отсутствием поддержки хранимых процедур на компьютерах с Windows.
Пожалуйста, попробуйте следующее: http://bugs.php.net/bug.php?id=39858
Глядя на самый последний комментарий: 1221253320 кажется, что это было исправлено, вы можете попробовать обновить ваш PHP до последней версии. 5,3
Мой совет: если вы используете предварительно упакованный "серверный" набор, такой как xampp, вам следует собрать все это вместе, разделить 2 ГБ жесткого диска, используя Storage Extender в разделе "Управление хранилищем", отдельно установить MySql,PHP,Apache, а затем настроить их.
используйте этот последний снимок PHP и последний дистрибутив MySql, перенесите приложение и базу данных на новую установку, пните свой компьютер, и он должен нормально работать.
Могу поспорить, что это может быть и до MySql Client Libs, обновить их
Некоторые связанные ссылки, с которыми я сталкиваюсь:
PDO Небуферизованные запросы и сохраненные процессы.