Zend Framework « Почему сбрасывается соединение с сервером из-за несложного запроса к бд?

Здравствуйте, я делаю на сайте запрос к базе на изменение одной записи. Запрос несложный, в phpmyadmin он выполнился за 0.0848 секунд
Запрос такой:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }

$_DB->query("
    UPDATE `pg_content`
    SET `changed`='1341423540', `changed_by`='1', `page_id`='2',
            `marker`='text', `access`='-2', `inc`='pg:fe_content_html', `title`='aa', `sorting`='3', `hidden`='0',
      `config`='a:0:{}', `text_field`='zzzzzzzzzzzzzzzzzzzz aaaaaaaaaaaaaaaaaaaa zzzzzzzzzzzzzzzzzzzz  aaaaaaaaaaaaaaaaaaaa zzzzzzzzzzzzzzzzzzzz aaaaaaaaaaaaaaaaaaaa zzzzzzzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzz'
     WHERE `id`= '18'"
);
 

У поля `text_field` тип TEXT, я укоротил количество символов в нём для наглядности, символы я просто вставил копипастом (никаких кавычек и прочего, только буквы a,z и пробелы)
В него заносятся около тысячи символов, если сделать поменьше символов, то запрос выполнится нормально. Я проверял запрос на другой машине, так там если в поле заносится более 300 символов соединение тоже сбрасывалось.

Ошибку выдает браузер: ФФ пишет, что соединение было сброшено, хром пишет, что данные от сервера не получены.
Запросы делаю с помощью Zend фреймворка в пхп, пробовал через библиотеки mysqli и pdo_mysql. Phpmyadmin без проблем выполняет запрос. Как быть? Куда копать?

------------
По поводу значений, заключенных в одинарные кавычки: так заключает значения зендовская функция quote(), я недавно попробовал заменить одинарные кавычки на двойные, сразу выскочили исключения по поводу двоеточий в некоторых значениях, я убрал двоеточия и запрос заработал нормально, даже если в поле text_field вставить очень много символов.

1 ответов


Попробуйте так

Создаем класс таблицы,



class Default_Model_DbTable_PgContent extends Zend_Db_Table_Abstract
{
  public $_name    = 'pg_content';
}
 

Затем делаем так

$table = new Default_Model_DbTable_PgContent();
$data = array();
$data ['changed'] ='1341423540';
$data ['changed_by'] ='1',
//...другие поля аналогично

$table->update($data, "id = 18");
 
Это конечно не ответ почему ваш запрос не работает и получаете негативный ответ от сервера, но так будет правильнее и более zend style.

Я лично делаю вообще так апдейты.

$table = new Default_Model_DbTable_PgContent();
$row = $table->fetchRow($table->select()->where("id = ?", 18));
if($row){
$row->changed ='1341423540';
$row->changed_by ='1',
//...другие поля аналогично
$row->save();
}
 
Все таки active records в зенд внедрили чтобы он генерировал запросы за вас.

у вас точно сбрасывается соединение с базой? потому как браузер не знает ничего о базе данных и может рапортовать только о разрыве соединения с сервером, никак не с базой.
и вообще, неясно - запрос таки выполнился или нет? и цифра в 300 символов - это реальный максимум символов или ориентировочный?

попробуйте сразу после критического запроса сделать самую примитивную выборку из базы. если не получится по причине отсутствия соединения - дело в базе. если до выполнения запроса дело не дойдет - вполне возможно, что у вас где-то есть плохо отлавливаемое исключение, которое и приводит к краху приложения, что, в свою очередь, приводит к реакции браузера "соединение сброшено". в таком случае - возможен вариант с неправильным экранированием кавычек. следовательно - use PDO :)


Похоже, что это баг.
http://framework.zend.com/issues/browse/ZF-8399
Решение такое: вместо $_DB->query(....) использовать $_DB->getConnection()->query(....)