サポート » 使い方全般 » CREATE時に、NULLである変数に勝手に値が入ってくれる

  • 解決済 mikazukimika

    (@mikazukimika)


    以下CREATEは、
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    でなく
    ) $charset_collate;";
    として変数で指定しています。

    問題なくCREATEできるのですが、疑問がございます。

    origins_create_table( 'origins' );
    function origins_create_table( $table_name ) {
        global $wpdb;
        $charset_collate = $wpdb->get_charset_collate;
        $sql = "CREATE TABLE IF NOT EXISTS " . $wpdb->prefix . $table_name . " (
    		 ID BIGINT(20) NOT NULL 
    		,title VARCHAR(1000) 
    		,PRIMARY KEY  (ID)
        ) $charset_collate;";
        add_option($table_name."_version", '1.0');
        $wpdb->query($sql);
    }

    試しに以下実行するとNULLとなったのですが、なのにどうしてCREATEできたのでしょうか?

    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate;
    var_dump( $charset_collate );

    ちなみに変数に入れる方法は「>この例では $wpdb->get_charset_collate() 関数を使って文字セットと照合順序を取得します。」という例を参考に致しました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • こんにちは

    実際にどのような SQL が実行されたのかを確認してみてはどうでしょうか。
    「wordpress sql 確認」などで検索するといろいろやり方が出てくると思います。

    トピック投稿者 mikazukimika

    (@mikazukimika)

    こんにちは
    いつもありがとうございます。

    実際にどのような SQL が実行されたのかを確認してみてはどうでしょうか。

    確認ですが、次の2つの方法で確認しました。

    まず質問にある2つ目のコードのvar_dumpは、1つ目のorigins_create_table()内に追記したものになります。

    つまり以下実行で<div class="phptest">NULL</div>という出力が得られることです。

    <div class="phptest">
    origins_create_table( 'origins' );
    </div>

    なので、実行されたSQLもNULLであったことがわかります。

    さらにそのことを重ねて確認すべくQuery Monitorを見ましたら以下画面となりまして、緑の文言の通りやはり$charset_collate;の部分に何もないことが見て取れます。
    https://imgur.com/ulIFMnA

    以上、var_dumpとQeury Monitorの結果から、実行されたSQLは紛れもな$charset_collate;がない状態だったと考えていいと思うのですが…

    それなのに作成されたテーブルをSHOW CREATEしますと、確かに
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    があるのです。
    これは一体いつ付いたのか不思議でなりません。

    それは MySQL の仕様です。
    省略された場合にはデフォルトの設定がテーブルに適用されます。

    トピック投稿者 mikazukimika

    (@mikazukimika)

    そうなのですね、ありがとうございます。
    しかしそうなりますと、そのデフォルトの設定がなぜget_charset_collateで取得できないのか疑問になりませんでしょうか?

    wp-includes/wp-db.phpの3530行目に見つけまして、そこは次のようあるのに…

    	public function get_charset_collate() {
    		$charset_collate = '';
    
    		if ( ! empty( $this->charset ) ) {
    			$charset_collate = "DEFAULT CHARACTER SET $this->charset";
    		}
    		if ( ! empty( $this->collate ) ) {
    			$charset_collate .= " COLLATE $this->collate";
    		}
    
    		return $charset_collate;
    	}

    get_charset_collateはプロパティではなく関数ですので、get_charset_collate()と記述してください。

    トピック投稿者 mikazukimika

    (@mikazukimika)

    っ!!!
    失礼いたしました。
    どうもありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「CREATE時に、NULLである変数に勝手に値が入ってくれる」には新たに返信することはできません。