2013-12-09 1 views
0

У меня есть 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.

Вся помощь с благодарностью получена.

+1

У вас должны быть исключения, чтобы узнать, получаете ли вы ошибки. – tadman

+0

'на не-объекте' означает, что ваша подготовка была неудачной, и почти гарантированно возвратил логическое значение false. Поскольку вы предполагали, что все всегда преуспевает, вы не потрудились проверить на неудачу.Либо проверьте возвращаемые значения (pdo возвращает boolean FALSE при ошибке), либо включите исключения и начните пошатывание в блоках try/catch. –

ответ

2

Ваши предположения ошибочны.

Если PHP были действительно сбросив соединение, вы бы была ошибка не на bindValue вызов, но на линии, где очень соединение PDO используется, поэтому, ошибка будет

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

Так , проблема связана не с подключением, а с запросом. Набор PDO в режиме ошибки:

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

затем появится сообщение об ошибке, а затем либо исправить или задать другой вопрос относительно этой конкретной ошибки.

+0

Я не знал, что смог установить этот атрибут (несколько новый для PDO). При этом он дал мне ошибку о буферизации. Казалось бы, -> fetch() буферизует результаты и не позволяет выполнять дальнейшие SQL-запросы. Решение заключается в использовании -> fetchAll, который возвращает все результаты, освобождая MySQL, чтобы возвращать результаты для других запросов. – dan360