web-dev-qa-db-ja.com

$ wpdb-> insertは値を変更しています

私はクライアントのための '特集リリース'と呼ばれるプラグインを書いています。ユーザーは管理領域に短い形式で記入し、$ wpdb-> insertでテキストと画像IDをwordpressデータベースに挿入します。私の開発マシンではうまくいきますが、プロダクションサーバー(あらゆる種類の500以上の投稿がありますが、ほとんどがイメージ)では、イメージIDの値が127に変更されています。 127は投稿のIDですが、画像ではなく、フォームから渡されたIDでもありません。

画像はネイティブのワードプレスメディアアップローダを介してアップロードされます。画像の投稿ID(wp_postsテーブルから)は、フォームの非表示入力に渡されます。送信時に、この関数は$ _POSTデータを処理します。

function fr_add_album() {
    global $wpdb;

    if ( isset($_POST) && (count($_POST) > 0) ) {

        check_admin_referer('featured-releases-add_album');

        $table_name = $wpdb->prefix . 'featured_releases';

        $desired_keys = array('fr_band', 'fr_album', 'fr_album_description', 'fr_image_id', 'fr_shop_url');

        $data = array();
        foreach( $desired_keys as $key ) {

            // Define and sanatize data
            if ( isset($_POST["$key"]) ) {
                $accepted_html = array('a' => array('href' => array(), 
                                       'title' => array())); 
                $data["$key"] = wp_kses($_POST["$key"], $accepted_html);

                unset($_POST["$key"]);
            } else {
                $data["$key"] = '';
            }
        }

        // Sanitize the shop url
        if ( isset($data['fr_shop_url']) ) {
            $data['fr_shop_url'] = esc_url($data['fr_shop_url']);
        }

        $data['fr_modified'] = date('Y-m-d h:i:sa');

        error_log($data['fr_image_id']); // This returns the correct value!

        $wpdb->insert($table_name, $data, array('%s','%s', '%s', '%d', '%s'));

        // After the insert, the fr_image_id column always reads "127"

    }
}

めちゃくちゃなことはそこに正しく投稿するいくつかの画像があるということです。これらは私がwordpressインストールを作成したときに私がアップロードした最初の画像でした。私がアップロードした新しい画像を含め、他の日付からの他のすべての画像はデータベースに127として保存されます。すべての画像は同じ所有者と同じ許可を持っています。私はまた、新しい画像と古い画像の間でwp_postsの違いを見ることができません。何か案は?私はここにいます。ご協力いただきありがとうございます!

3
likesalmon

素晴らしいアドバイス$ wpdb->クエリの出力はまさにそれがあるべきものでした:

"INSERT INTO `wp_featured_releases` (`fr_band`,`fr_album`,`fr_album_description`,`fr_image_id`,`fr_shop_url`,`fr_modified`) VALUES ('','','','504','','2011-01-14 10:49:58pm')"

504はイメージの正しいIDですが、テーブル内の値はまだ127です。

私の最近の考えは私のMySQLのスキルが私を失敗させたということです。 127未満のIDを持つ画像は問題なく動作しますが、127を超えるものは127に変更されます。fr_image_idを保持する列型はtinyint(9)です。これは9999999999までの任意の値を正しく保持できるはずです。そうでなければ、私は自分の答えを見つけたと思います。変更してみましょう。

3
likesalmon

確かに不可解です。本番のみで、クエリ実行の短い段階でのみ問題が発生します(広く使用されており、理論的には非常に信頼性があります)。

生成されたSQLクエリをチェックして健全性を確認しましたか? ( 分析用にクエリを保存します )。私は最初にデータベースに実際に送信されているものを確認し、PHPMyAdminまたは他のツールを使用して手動で実行されたときに同じクエリが正常に実行される場合は問題ないと思います。

1
Rarst