代码之家  ›  专栏  ›  技术社区  ›  Horen

Zend中的$adapter->query()不起作用-字符串要长才能插入?

  •  2
  • Horen  · 技术社区  · 12 年前

    我正在使用数据库适配器在Zend框架中插入数据

    $adapter = Zend_Db_Table::getDefaultAdapter();
    

    并执行如下插入语句:

    $q = "INSERT INTO questions (category_id, user_id, `text`, active) 
    VALUES($category_id, ".$user_id.", '".$question_text."', 1)";
    $adapter->query($q);
    

    但是,有时此查询不起作用。只有当 $question_text 相当长(>1000个字符),不取决于内容,只取决于长度。在phpmyadmin中执行相同的语句不会出现问题。(数据库字段为文本)

    当我使用

    $adapter->exec($q);
    

    查询也可以正常工作。

    现在我的问题是:

    query()语句出现问题的原因是什么?

    使用exec()有什么缺点吗?

    3 回复  |  直到 12 年前
        1
  •  2
  •   drew010    12 年前

    如果您将插入更改为使用面向对象的接口,该接口可以为您转义输入数据,那么您仍然有问题吗?

    $values = array('category_id' => $category_id,
                    'user_id'     => $user_id,
                    'text'        => $question_text,
                    'active'      => 1);
    
    $inserted = $adapter->insert('questions', $values);
    

    $inserted 应包含受操作影响的行数1。

        2
  •  2
  •   a1ee9b    12 年前

    当我试图将PDF插入BLOB时,也遇到了同样的错误。PHP的mysql_query()函数运行良好,但Zend函数query()或exec()不起作用,尽管没有抛出错误或异常。这似乎是Zend已知的一个问题,因为已经提交了一些错误。

    对我来说有效的不是解决这个问题的最优雅的方法,但它是有效的。如上所述,PHP的mysql_query()起作用,所以我从Zend application.ini中获取了参数,并使用它们创建了一个使用PHP的新连接。

        <?php
        $front = Zend_Controller_Front::getInstance();
        $bootstrap = $front->getParam('bootstrap');
        $options = $bootstrap->getOptions();
        $dbOptions = $options["resources"]["db"]["params"];
    
        $link = mysql_connect($dbOptions["host"], $dbOptions["username"], $dbOptions["password"]);
        if (!$link) {
            die('Verbindung schlug fehl: ' . mysql_error());
        }
        mysql_select_db($dbOptions["dbname"]);
    
        $ret = (mysql_query($query) === TRUE)? TRUE : mysql_error();
    
        mysql_close($link);
    
        return $ret;
        ?>
    

    这将返回TRUE或mysql错误。

        3
  •  1
  •   Aakash Sahai    11 年前

    也许回答得晚了,但我有勇气。 感谢@martinthewolf链接 。我找到了两个zend解决方案:

    $db->getConnection()->query($sql); // use getConnection()
    
    $db->exec($sql);
    

    这个问题是因为内存堆栈大小。在linux上,堆栈根据需要增长,但在Windows&Mac这个问题会因为堆栈大小而被冒泡。为此,php.net(此处)中提出了一个问题。享受