Zend中的$ adapter-> query()不工作 - 要插入多长的字符串?

时间:2012-08-13 16:51:56

标签: php mysql zend-framework zend-db

我使用db adapter

在Zend框架中插入数据
$adapter = Zend_Db_Table::getDefaultAdapter();

并执行这样的insert语句:

$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中执行相同的语句没有问题。 (db字段是文本)

当我使用

$adapter->exec($q);

查询也可以。

现在我的问题:

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

使用exec()是否有任何缺点?

3 个答案:

答案 0 :(得分:2)

如果您更改插入以使用面向对象的界面来逃避您的输入数据,那么您是否还有问题?

$values = array('category_id' => $category_id,
                'user_id'     => $user_id,
                'text'        => $question_text,
                'active'      => 1);

$inserted = $adapter->insert('questions', $values);

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

答案 1 :(得分:2)

当我尝试将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-error。

答案 2 :(得分:1)

可能要迟到才能回答,但我有灵魂。感谢@martynthewolf链接。我找到了两个zend解决方案:

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

$db->exec($sql);

此问题是由于内存堆栈大小。在Linux上,堆栈会根据需要增长,但在Windows和&amp;由于堆栈大小,Mac此问题会冒泡。为此,在php.net(这里)提出了一张票。看看。享受!!!