У меня есть PHP-скрипт, который отлично работает через Apache, вызываемый через браузер, но тот же код, который вызывается в командной строке, по-видимому, удаляет соединение с базой данных после каждого вызова.Постоянная связь с командной строкой PHP
Так, например, в включаемого файла у меня есть:
$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.
Вся помощь с благодарностью получена.
У вас должны быть исключения, чтобы узнать, получаете ли вы ошибки. – tadman
'на не-объекте' означает, что ваша подготовка была неудачной, и почти гарантированно возвратил логическое значение false. Поскольку вы предполагали, что все всегда преуспевает, вы не потрудились проверить на неудачу.Либо проверьте возвращаемые значения (pdo возвращает boolean FALSE при ошибке), либо включите исключения и начните пошатывание в блоках try/catch. –