私の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();
}
?>
その後、必要に応じて自分のページですべての呼び出しを行います。ただし、特に 1 つのページで、最初に 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 をオフにする可能性があり、すべての DB に基づいて再構築したくないからです (言うまでもなく、含めたときは機能しませんでした)。
なぜこれが起こっているのでしょうか?すべての DB 呼び出しの前に connector.php ファイルを「含める」ことができますが、それは繰り返しのようで、すべてのステートメントを $db->NULL にする必要があります。
注: これは、ストアド プロシージャへの呼び出しを含むページにのみ影響するようです。何か案は?
注: これは、Apache 2.2.14、PHP 5.3.1 を実行する XAMPP 1.7.3 を搭載した Windows マシンで実行されています。