我正在使用数据库适配器在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() 有什么缺点吗?
如果您将插入更改为使用面向对象的接口来为您转义输入数据,您仍然有问题吗?
$values = array('category_id' => $category_id,
'user_id' => $user_id,
'text' => $question_text,
'active' => 1);
$inserted = $adapter->insert('questions', $values);
$inserted
应包含受操作影响的行数 1。
当我尝试将PDF插入BLOB时,我遇到了同样的错误。PHP 的 mysql_query() 函数工作正常,但 Zend 函数 query() 或 exec() 无法正常工作,尽管没有抛出错误或异常。这似乎是Zend已知的问题,因为已经提交了一些错误。
对我有用的不是解决这个问题的最优雅的方法,但它有效。如上所述,PHP 的 mysql_query() 有效,所以我从 Zend 应用程序中获取参数.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 错误。
可能回答得很晚,但我有灵魂。感谢@martynthewolf链接。我发现zend的两个解决方案:
$db->getConnection()->query($sql); // use getConnection()
$db->exec($sql);
此问题是由于内存堆栈大小。在 Linux 上,堆栈会根据需要增长,但在 Windows 和 Mac 上,由于堆栈大小,此问题会出现气泡。为此,有一张票在 php.net(这里)看看。享受!!!