2

我正在使用 db 适配器在 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 中执行相同的语句没有问题。(db 字段是文本)

当我使用

$adapter->exec($q);

查询也可以正常工作。

现在我的问题:

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

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

4

3 回答 3

2

如果您将插入更改为使用为您转义输入数据的面向对象接口,您还有问题吗?

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

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

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

于 2012-08-13T18:11:46.790 回答
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。

于 2012-11-29T15:06:55.823 回答
1

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

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

$db->exec($sql);

这个问题是因为内存堆栈大小。在 linux 上,堆栈根据需要增长,但在 Windows 和 Mac 上,由于堆栈大小,这个问题变得冒泡。为此,在 php.net(here) 中提出了一张票,请看一看。享受!!!

于 2013-07-08T09:04:44.720 回答