连接重置MySQL查询

时间:2010-05-21 09:35:41

标签: php mysql connection-reset

好吧,我很沮丧。 我正在尝试在数据库(本地)上执行查询,并且我不断收到连接重置错误。我一直在通用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字符串并通过命令行执行它,它工作正常 - 所以我不能为我的生活弄清楚什么是错的。

我试过扩展服务器参数,即 Unexpected Connection Reset: A PHP or an Apache issue?

所以,简而言之,我很难过。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

好的,对于遇到此问题的其他人来说 - 问题与Zend_Db_Statement有关 - 或者更确切地说是该组件所依赖的preg库。它已在Zend问题跟踪器中标记:http://framework.zend.com/issues/browse/ZF-8399,但它并不严格地说是Zend lib的问题。您可能会也可能不会遇到此问题,具体取决于您的服务器环境。在我的情况下,此错误发生在:

赢得XP, 笨蛋2 PHP 5.3

可以使用

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

通过适配器(PDO等)直接有效地执行sql。或者,您可以修改您的服务器以纠正PCRE本身的segfaulting(虽然我承认我不完全确定你会怎么做)。希望能帮助其他人解决同样的问题

答案 1 :(得分:0)

如果您使用PDO,可以发布确切的错误消息($ this-&gt; db-&gt; errorInfo())? 您确定已建立数据库连接吗?

答案 2 :(得分:0)

对于那些正在使用Google搜索并在执行MySQL查询时发现有关连接重置的帖子的人:

除了sunwukung的回答,请检查MySQL设置中是否有瓶颈,特别是这个:

max_allowed_packet = 1M

您可以将其更改为更大的数字。这是我的:

max_allowed_packet = 32M

现在可行。

<强>解释

正如您可以从设置名称中读取的那样,连接重置主要是由于进出MySQL的数据集太大而导致的,其终止&#34;终止&#34;与MySQL的连接。