3

着信するmySQLデータ型を調べて、それを「カテゴリ」(このコードではファミリと呼びます)にロールアップして、カテゴリレベルでデフォルト値を適用できるようにする単純な関数があります。とにかく、このコードは整数、文字、およびテキストのカテゴリを見つけるために正常に機能しますが、日時および小数のカテゴリでは完全に失敗します。私は私の知恵の終わりにいます。どんな助けでも大歓迎です:

public static function get_family_type ( $col_type ) {
    $families = array (
                'integer' => array ( 'integer', 'int', 'tinyint', 'mediumint', 'bigint' ),
                'fixed' => array ( 'decimal', 'numeric' ),
                'floating' => array ( 'float' , 'double' ),
                'character' => array ( 'char', 'varchar' ),
                'datetime' => array ( 'datetime' , 'timestamp'),
                'time' => array ('time'),
                'date' => array ('year'),
                'text' => array ('tinytext', 'text', 'mediumtext' , 'longtext'),
                'blob' => array ('blob','tinyblob','mediumblob','longblob')
    );

    // first get rid of any optional length parameterisation
    list ( $col_type ) = explode ( "(" , $col_type , 2 );
    foreach ($families as $family => $family_members) {
        if ( array_search ( $col_type , $family_members , true ) ) {
            return $family;
        }
    }
    return "unknown $col_type";
}

最後の行のbackupreturnステートメントに注意してから、コードの他の場所で定義したテーブルからのこの出力を確認してください。

    [18-Jun-2012 17:39:24] Getting default for family of integer
    [18-Jun-2012 17:39:24] Getting default for family of text
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of integer
    [18-Jun-2012 17:39:24] Getting default for family of integer
    [18-Jun-2012 17:39:24] Getting default for family of unknown decimal
    [18-Jun-2012 17:39:24] Getting default for family of character
    [18-Jun-2012 17:39:24] Getting default for family of unknown datetime
    [18-Jun-2012 17:39:24] Getting default for family of floating
4

2 に答える 2

3

array_searchは、成功すると配列キーを返します。値が 0 になることもあります。php では、0 はブール値 false に強制されます。のようにチェックする必要があります。

    if ( array_search ( $col_type , $family_members , true ) !== false ) {
        return $family;
    }

厳密な比較に注意してください!==

PHP のマニュアルでは、array_search のドキュメントでこれについて言及しています。

于 2012-06-18T18:12:31.890 に答える
2

あなたの変化:

if ( array_search ( $col_type , $family_members , true ) ) {
            return $family;
    }

if ( in_array( $col_type , $family_members , true ) ) {
            return $family;
   }

ご了承ください:

array_search — 指定された値の配列を検索し、成功した場合は対応するキーを返します

したがって、array_search からのブール値の戻り値ではないため、希望どおりに機能しない可能性があります。

于 2012-06-18T17:55:08.280 に答える