ブラウザから呼び出されたApache経由で完全に機能するPHPスクリプトがありますが、コマンドラインで呼び出された同じコードは、呼び出しのたびにデータベース接続を切断するようです。
たとえば、インクルードされたファイルには次のようなものがあります。
$pdo = new PDO('mysql:host=' . HOST . ';dbname=' . DB, USER, PASS, array(PDO::ATTR_PERSISTENT => true));
次に、私のスクリプトには次のものがあります。
$stmt = $pdo->prepare('SELECT intGroupID FROM tblquestiongroups WHERE dtDeleted IS NOT NULL ORDER BY RAND()');
$stmt->execute();
$something = $stmt->fetch(PDO::FETCH_ASSOC);
これは正常に動作しますが、その後すぐに次のことがありました。
$stmt = $pdo->prepare('SELECT intSurveyID FROM tblquestiongroups WHERE tblquestiongroups.intGroupID = :intQuestionId');
$stmt->bindValue(':intQuestionId', $intQuestionId);
$stmt->execute();
そうではなく、戻ります:
Call to member function bindValue() on a non-object
ここで、新しい接続を追加すると、つまり、2 番目の呼び出しの上のインクルード ファイルに接続をコピー アンド ペーストすると、すべて正常に動作します。
$pdo = new PDO('mysql:host=' . HOST . ';dbname=' . DB, USER, PASS, array(PDO::ATTR_PERSISTENT => true));
$stmt = $pdo->prepare('SELECT intSurveyID FROM tblquestiongroups WHERE tblquestiongroups.intGroupID = :intQuestionId');
$stmt->bindValue(':intQuestionId', $intQuestionId);
$stmt->execute();
私の最初の質問は、PHP がスクリプトの期間中接続を開いたままにしないのはなぜですか?
それでは、2 番目の質問に移ります。テストとして、PDO を介したデータベースへのすべての呼び出しの前に接続を追加しました。このスクリプト内で、実際には 2 つの異なるサーバーに接続しているため、次のような別の接続が定義されています。
$pdoLocal = new PDO('mysql:host=' . HOST_LOCAL . ';dbname=' . DB_LOCAL, USER_LOCAL, PASS_LOCAL, array(PDO::ATTR_PERSISTENT => true));
もちろん、動作させるために、ローカルデータベースへの呼び出しの上にこの行を追加しました。ただし、このコードでは:
$pdoLocal = new PDO('mysql:host=' . HOST_LOCAL . ';dbname=' . DB_LOCAL, USER_LOCAL, PASS_LOCAL, array(PDO::ATTR_PERSISTENT => true));
$pdoLocal->beginTransaction();
$stmtInsert = $pdoLocal->prepare('INSERT INTO tblresponses_string (strResponses, intSurveyID) VALUES (:strResponses, :intSurveyID)');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$stmtInsert->bindValue(':strResponses', $row['strResponses']);
$stmtInsert->bindValue(':intSurveyID', $surveyID);
$stmtInsert->execute();
}
$pdoLocal->commit();
最初のバインドで同じエラーが発生します。
これは、実行される最初のステートメントが beginTransaction であり、その後 PDO 接続が閉じられるという点で同じ問題だと思います。
前述のように、これはすべてApacheを介して正常に機能します。
すべての助けを感謝して受け取りました。