[英]PHP command line persistent connections
我有一個PHP腳本,可以通過瀏覽器調用Apache完美地工作,但是在命令行上調用的相同代碼似乎在每次調用后都會丟棄數據庫連接。
因此,例如在我包含的文件中:
$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
現在,如果我添加一個新連接,即復制並粘貼第二次調用上方的包含文件中的一個連接,它將再次正常工作,即:
$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不會在腳本期間保持連接打開?
所以我的第二個問題。 作為測試,我經歷了在通過PDO對數據庫的所有調用之前添加連接。 在這個腳本中我實際連接到兩個不同的服務器,因此我有另一個定義的連接,如下所示:
$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完成。
感謝所有的幫助。
你的推測是錯誤的。
如果PHP確實丟棄了一個連接,那么你在bindValue調用時沒有出錯,而是在使用了非常PDO連接的行上 ,所以錯誤就是
Call to member function prepare() on a non-object
所以,問題不在於連接,而在於查詢。 在錯誤模式下設置PDO:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
然后查看錯誤消息,然后修復它或詢問有關此特定錯誤的其他問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.