Все 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 говорится о строке, которую я ожидаю, я полагаю, что я близок к решению, но, похоже, я не могу его прибить.