0

我有一个 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 正常工作。

感谢所有帮助。

4

1 回答 1

3

你的猜测是错误的。

如果 PHP 确实断开了一个连接,那么您在 bindValue 调用上没有出现错误,而是在使用 PDO 连接的行上出现错误,因此,错误将是

Call to member function prepare() on a non-object

所以,问题不在于连接,而在于查询。将 PDO 设置为错误模式:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后查看错误消息,然后修复它或询问有关此特定错误的另一个问题。

于 2013-12-09T18:44:44.290 回答