MySQL 查询时连接重置

MySQL 查询时连接重置

好吧,我很困惑。(我也在 Stack 上问过这个问题 - 但我需要修复它,所以我也在这里问 - 任何帮助都非常感谢)我正在尝试在数据库上执行查询(本地),但我一直收到连接重置错误。我一直在通用 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)

下一个要检查的是表格的限制,因为如果“description”的长度在 300 左右(在 310 - 330 之间变化),它似乎会插入。字段限制设置为 VARCHAR(1500),并且此字段的验证不允许任何超过 1200(使用 HTML)或 800(不使用 HTML)的内容。

真正的问题是,如果我采用这个 SQL 字符串并通过命令行执行它,它可以正常工作 - 所以我无论如何也无法弄清楚哪里出了问题。

我尝试扩展服务器参数,例如 https://stackoverflow.com/questions/1964554/unexpected-connection-reset-a-php-or-an-apache-issue

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

答案1

如果生成的 SQL 在您复制/粘贴时有效,我很想说这是您的代码的问题。

我有一个类似的 DB 类,如果发生 SQL 错误,它会将记录插入日志表。我曾经修改过例程,它做了一些类似于你描述的事情,因为它生成了一个 SQL 错误,调用了函数,生成了一个 SQL 错误,调用了函数....你明白了 :)

你的函数是$this->db->query($sql);做什么的?可能值得看看它是否做了类似的事情,或者只是做了一个直接的mysql_query

答案2

好的,对于遇到此问题的其他任何人 - 问题与 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)

它实际上直接通过适配器(PDO 等)执行 sql。或者,您可以修改服务器以纠正 PCRE 本身的分段错误(尽管我承认我并不完全确定您将如何进行此操作)。希望这对遇到同样问题的人有所帮助

答案3

您是否尝试过查看 MySQL 错误日志?当 MySQL 客户端和服务器版本不匹配(5.5.x 客户端与 5.0.x 服务器等)并且您正在执行在服务器版本中无效但在当前客户端版本中有效的查询时,我也看到了此错误。如果是这种情况,我会检查以确保您使用的 Zend API 版本与您使用的 MySQL 服务器版本兼容。服务器上的 MySQL 错误日志至少应该会让您了解服务器崩溃或客户端崩溃。

相关内容