0

ブラウザから呼び出された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を介して正常に機能します。

すべての助けを感謝して受け取りました。

4

1 に答える 1