Сброс соединения по запросу MySQL

Хорошо, я сбит с толку. Я пытаюсь выполнить запрос к базе данных (локально) и постоянно получаю сообщение об ошибке сброса соединения. Я использовал описанный ниже метод в универсальном классе DAO для создания строки запроса и передачи в Zend_Db API.

public function insert($params) {
    $loop = false;
    $keys = $values = '';
    foreach($params as $k => $v){
        if($loop == true){
            $keys   .= ',';
            $values .= ',';
        }
        $keys   .= $this->db->quoteIdentifier($k);
        $values .= $this->db->quote($v);
        $loop = true;
    }

    $sql = "INSERT INTO " . $this->table_name . " ($keys) VALUES ($values)";

    //formatResult returns an array of info regarding the status and any result sets of the query
    //I've commented that method call out anyway, so I don't think it's that
    try {
        $this->db->query($sql);
        return $this->formatResult(array(
                true,
                'New record inserted into: '.$this->table_name
        ));
    }catch(PDOException $e) {
        return $this->formatResult($e);
    }
}

До сих пор это работало нормально — ошибки возникали с тех пор, как мы создали новые таблицы для записи пользовательского ввода. Строка вставки выглядит так:

INSERT INTO tablename(`id`,`title`,`summary`,`description`,`keywords`,`type_id`,`categories`) VALUES ('5539','Sample Title','Sample content','
\'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue ullamcorper nec. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam vel elit libero. Vestibulum in turpis nunc.\'','this,is,a,sample,array',1,'category title') 

Вот параметры, которые он получает перед сборкой запроса (var_dump):

array
    'id' => string '1' (length=4)
    'title' => string 'Sample Title' (length=12)
    'summary' => string 'Sample content' (length=14)
    'description' => string '<p>'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue'... (length=677)
    'keywords' => string 'this,is,a,sample,array' (length=22)
    'type_id' => int 1
    'categories' => string 'category title' (length=43)

Следующим портом захода была проверка ограничений в таблице, поскольку она, кажется, вставляется, если длина «описания» составляет около отметки 300 (оно варьируется от 310 до 330). Ограничение поля установлено на VARCHAR (1500), и проверка этого поля не позволит ничего больше 1200 с HTML, 800 без.

Настоящим кикером является то, что если я возьму эту строку sql и выполню ее через командную строку, она будет работать нормально, поэтому я не могу понять, что не так.

Я попытался расширить параметры сервера, т.е. Неожиданный сброс соединения: A Проблема с PHP или Apache?

Итак, короче говоря, я в тупике. Любые идеи?


person sunwukung    schedule 21.05.2010    source источник


Ответы (3)


Хорошо, для всех, кто столкнулся с этой проблемой - проблема связана с Zend_Db_Statement - или, скорее, с библиотекой preg, на которую опирается этот компонент. Это было отмечено в системе отслеживания проблем Zend: http://framework.zend.com/issues/browse/ZF-8399, но это не совсем проблема с библиотекой Zend. Вы можете или не можете столкнуться с этой проблемой в зависимости от вашей серверной среды. В моем случае эта ошибка произошла:

Win XP, Wamp 2 PHP 5.3

Ее можно решить с помощью

db->getConnection()->exec($sql)

который эффективно выполняет sql напрямую через адаптер (PDO и т. д.). В качестве альтернативы вы можете модифицировать свой сервер, чтобы исправить ошибки сегментации в самом PCRE (хотя, признаюсь, я не совсем уверен, как вы это сделаете). Надеюсь, это поможет кому-то еще с той же проблемой

person sunwukung    schedule 23.05.2010
comment
Большое спасибо, мне помогло! :) Кстати, это должно быть $db->getConnection()->exec($sql) - person Znarkus; 30.06.2011

Для тех, кто гуглит и находит этот пост о сбросе соединения при выполнении запроса MySQL:

Помимо ответа от sunwukung, также проверьте, есть ли узкое место в ваших настройках MySQL, особенно это:

max_allowed_packet = 1M

Вы можете изменить его на большее число. Вот мой:

max_allowed_packet = 32M

Теперь это работает.

Пояснение:

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

person Ellery Leung    schedule 13.11.2014

Не могли бы вы опубликовать точное сообщение об ошибке ($this->db->errorInfo(), если вы используете PDO)? Вы уверены, что у вас установлено соединение с БД?

person ts.    schedule 21.05.2010
comment
соединение сбрасывается, поэтому у меня нет вывода скрипта - person sunwukung; 21.05.2010
comment
а что, если вы установите для PDO::ERRMODE_SILENT значение false? - person ts.; 21.05.2010
comment
нет, все равно умирает. Если я создам новый экземпляр PDO, все в порядке, всякий раз, когда он сталкивается с Zend_API, он ломается. - person sunwukung; 21.05.2010
comment
Я только что обнаружил идентичную ошибку в системе отслеживания проблем Zend Framework — с простыми вызовами PDO/MySQL все в порядке — значит, это что-то в Zend. - person sunwukung; 21.05.2010