Разъём PDO нельзя использовать на странице с несколькими экземплярами - PullRequest
2 голосов
/ 16 февраля 2011

В верхней части моей 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 ]

1 голос
/ 16 февраля 2011

Очевидно, это вызвано ошибкой в ​​PHP и отсутствием поддержки хранимых процедур на компьютерах с Windows.

Пожалуйста, попробуйте следующее: http://bugs.php.net/bug.php?id=39858

Глядя на самый последний комментарий: 1221253320 похоже, что это исправлено, вы можете попробовать обновить ваш PHP до последней версии. 5,3

мой совет: если вы используете предварительно упакованный «серверный» набор, такой как xampp, вам следует собрать все это вместе, разделить 2 ГБ вашего жесткого диска, используя Storage Extender в разделе «Управление хранилищем», отдельно установить MySql, PHP, Apache, а затем настроить их.

используйте этот последний снимок PHP и последний дистрибутив MySql, перенесите приложение и базу данных на новую установку, загрузите компьютер и все должно работать нормально.

Могу поспорить, что это могут быть и клиентские библиотеки MySql, обновите их

Некоторые похожие ссылки, с которыми я сталкиваюсь:

0 голосов
/ 16 февраля 2011

PDO Небуферизованные запросы и сохраненный процесс.

PDO Небуферизованные запросы

...