PHP PDO дает сбой при каждой операции записи - PullRequest
3 голосов
/ 20 февраля 2011

Все SELECTs работают правильно. Однако любое ОБНОВЛЕНИЕ или ВСТАВКА, даже если они работают при выполнении их в браузере запросов mysql, при входе в систему с тем же пользователем, к которому PHP подключается к серверу, завершаются ошибкой при выполнении PDO.

Как пример:

SELECT *  FROM Projects WHERE ssdUserID = :ssdUserID;

работает правильно все время, тогда как

INSERT INTO Projects SET ssdUserID = :ssdUserID, json = :json;

всегда завершается ошибкой при выполнении из PHP, хотя я делаю addlashes () для всех параметров.

То, как я звоню в PDO, - через подготовленные операторы:

$connection = new PDO("mysql:host=$mysqlServer;
    dbname=$mysqlSchema", $mysqlUser, $mysqlPassword);;
$statement = $connection->prepare($sql);
$result = $statement->execute($parameters);

$ result всегда равно false, и хотя фиксация происходит в конце (на данный момент для целей отладки), в базе данных нет ни обновления, ни вставки.

Я включил журнал трассировки mysql, и кажется, что sql даже не отправляется на сервер mysql - в журнале трассировки видно только начало и конец транзакции, между которыми нет ничего.

Поскольку поиск работает, очевидно, что PDO может установить соединение с базой данных. Кроме того, поскольку поиск выполняется по тому же коду, который не работает для операторов записи, я не могу думать ни о каком другом месте, где возникнут проблемы, кроме самого PDO.

Одной из проблем, которая может иметь значение, является то, что столбец json в приведенном выше примере имеет тип text. Я уже использую PDO в другом месте, где у меня есть только различные столбцы VARCHAR, и там он работает правильно.

Есть ли у кого-нибудь подобные проблемы? Кто-нибудь может мне помочь с этим?

1024 *
*

Обновление:

После некоторого копания и чтения (http://www.php.net/manual/en/pdo.lobs.php) я переключился на другое решение. Теперь я свяжу как входные параметры, так и выходные столбцы. Однако я оставлю исходный текст на месте, поэтому ppl делает то же самое начальное Ошибка может выяснить легче, чем я.

Связывание параметров легко. Я связываю выходные столбцы в универсальной функции:

01  private function __extractResultsEx($statement, $columns)
02  {
03      $data = array();
04      $msg = "query returned ".$statement->rowCount()." rows";
05      $receiverRow = array();
06      $i = 1;
07      foreach ($columns as $column => $type)
08      {
09          $receiverRow[$column] = NULL;
10          $statement->bindColumn($i++, &$receiverRow[$column], $type);
11      }
12      while ($statement->fetch(PDO::FETCH_BOUND))
13      {
14          $row = array();
15          foreach ($columns as $column => $type)
16              $row[$column] = $receiverRow[$column];
17          $data[] = $row;
18      }
19      return $data;
20  }

Столбцами являются ID / PDO :: PARAM_INT, userID / PDO :: PARAM_INT и json / PDO :: PARAM_LOB.

Я не знаю, нужна ли строка 09, только после первоначальной попытки, в которой $ receiverRow имел три элемента в конце, но ни один не был инициализирован, я подумал, что это может помочь - но это не так.

При таком подходе проблема заключается в том, что хотя в строке 04 оператор Statement говорит, что извлек одну строку, выполнение никогда не достигает внутри цикла while (строки 14–17), поскольку $ Statement-fetch () всегда возвращает false, нет Независимо от того, какую константу PDO :: FETCH_ я использую (я пробовал PDO :: FETCH_OBJ, PDO :: FETCH_BOUND и PDO :: FETCH_ASSOC, другая, кажется, не имеет большого смысла для больших объектов, и в любом случае страница руководства говорит только о PDO: : FETCH_BOUND для больших объектов).

В комментариях к вышеупомянутой странице руководства есть ошибка, которая говорит о том, что это должно быть безопасно и нормально просто читать LOB из строки. Тем не менее моя проблема возникает еще до того, как я получаю доступ к данным строки, хотя, похоже, я все сделал точно так же, как в примере кода.

Теперь есть одно улучшение. Трассировка MySQL показывает SQL, который я выполняю. Кроме того, поскольку в строке 04 говорится о строке, которую я ожидаю, я полагаю, что я близок к решению, но, похоже, я не могу его прибить.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2011

У вас есть несколько проблем:

Убедитесь, что $parameters является массивом, подобным этому:

array('ssdUserID' => "val", 'json' => "{}");

Кроме того, вам не нужно звонить addslashes при использовании подготовленных заявлений. PDO сделает это за вас.

Чтобы найти ошибку, вы можете добавить это (после вашего $statement->execute() вызова):

var_dump($connection->errorInfo());

PS: у вас 1 слишком много точек с запятой в строке new PDO(....

0 голосов
/ 20 февраля 2011

Можете ли вы попробовать вызвать bindParam вместо передачи параметров в execute?Возможно, вам потребуется указать длину для столбца типа text.

$statement->bindParam(':ssdUserID',$user_id, PDO::PARAM_INT);
$statement->bindParam(':json',$json_str,  PDO::PARAM_STR,strlen($json_str) );
$result = $statement->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...