我有一个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);
然后查看错误消息,然后修复它或询问有关此特定错误的另一个问题。