我有一个 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 正常工作。
感谢所有帮助。