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 の 2 つの解決策:

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

$db->exec($sql);

この問題は、メモリ スタック サイズが原因です。Linux ではスタックは必要に応じて大きくなりますが、Windows と Mac ではスタック サイズが原因でこの問題が発生します。これについては、php.net で提起されたチケット (こちら) をご覧ください。楽しみ!!!

于 2013-07-08T09:04:44.720 に答える