我有一个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
现在,如果我添加一个新连接,即在第二次调用之上的include文件中复制并粘贴一个连接,它就可以再次正常工作,即:
$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完成。
感谢所有的帮助。
答案 0 :(得分:2)
你的推测是错误的。
如果PHP确实丢弃了连接,那么你在bindValue调用时遇到错误,但是在使用PDO连接的行上 ,因此,错误将是
Call to member function prepare() on a non-object
因此,问题不在于连接,而在于查询。在错误模式下设置PDO:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
然后查看错误消息,然后修复它或询问有关此特定错误的其他问题。