Сброс соединения по запросу MySQL - PullRequest
1 голос
/ 21 мая 2010

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

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

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

Итак, в двух словах, я в тупике. Есть идеи?

Ответы [ 3 ]

1 голос
/ 23 мая 2010

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

Win XP, Wamp 2 PHP 5.3

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

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

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

0 голосов
/ 13 ноября 2014

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

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

max_allowed_packet = 1M

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

max_allowed_packet = 32M

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

Пояснение:

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

0 голосов
/ 21 мая 2010

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

...