2007年6月22日金曜日

 

【PHP】変数名をキーにして配列を変数に変換する関数:extract

int extract ( array $var_array [, int $extract_type [, string $prefix]] )
連想配列 var_array を引数とし、そのキーを変数名、値を変数の値として処理する

自動的にキーの名前で変数を作るので、しっかりと設計してプログラムしてないと変数名がかぶる事が起こる(衝突)。
その時、どう処理するかを指定するのが第二引数 $extract_type 。以下が指定できる主な値。

EXTR_OVERWRITE 衝突があった場合、存在する変数が上書きされます。 EXTR_SKIP 衝突があった場合、存在する変数は上書きされません。 EXTR_PREFIX_SAME 衝突があった場合、prefix を前につけた新しい変数となります。 EXTR_PREFIX_ALL 全ての変数の前に prefix を付けます。PHP 4.0.5 以降、接頭辞を数値とすることも可能です

他の指定できる値についてはマニュアルを参照
衝突が起きて、別の変数名にしたい時には第三引数 $prefix の文字列とキーをくっつけた変数名で処理する。

$array = array("color"=>"RED",
                                     "size"  =>"SMALL",
                                     "price"=>"100");

上記の配列があった場合


$num=extract($array);

この様に実行すると


$num=3
$color=RED
$size=SMALL
$price=100

以下を実行した場合も同様。


$color="WHITE";
extract($array,EXTR_OVERWRITE );

次に、EXTR_SKIP を指定した場合は $color が既にあるので上書きされない。


$color="WHITE";
extract($array,EXTR_SKIP);

$color=WHITE
$size=SMALL
$price=100

EXTR_PREFIX_SAME を指定すると、衝突した値だけ第三引数を接頭語にした変数名になる。


$color="WHITE";
extract($array,EXTR_PREFIX_SAME,"var");

$color=WHITE
$var_color="RED"
$size=SMALL
$price=100

EXTR_PREFIX_ALL を指定すると全てが第三引数を接頭語にした変数名になる。


$color="WHITE";
extract($array,EXTR_PREFIX_ALL ,"var");

$color=WHITE
$var_color="RED"
$var_size=SMALL
$var_price=100

フォームからPOSTやGETで値を受ける時に便利なんですが

警告
extract() をユーザー入力 ($_GET, ...) のような信頼できないデータについて使用しないでください 。もし行う場合、例えば register_globals を信頼しているような古いコードを一時的に実行したい場合、 EXTR_SKIP のような extract_type の値が上書きされていないことを確認してください 。そして php.ini の variables_order で定義されたものと同じ順で展開すべきであることに留意してください。

これなら良いのでしょうか。責任は持てませんが。


extract($_POST,EXTR_SKIP);

参照

PHP マニュアル
http://jp.php.net/manual/ja/function.extract.php
PHPプロ!マニュアル
http://www.phppro.jp/phpmanual/php/function.extract.html

ラベル:


2007年6月6日水曜日

 

SQLite でテーブルの変更・カラムの追加をする-ALTER TABLE

ALTER TABLE
テーブル名の変更とカラムの追加が可能

※SQLite には、SQLite3 と SQLite2 の二系統がありSQLite2系ではALTER TABLEが使えません。
そのため、現在の表を一時的な表へコピー、新しく列が追加された表を作成、一時的な表から新しい表へコピーすると言う方法で、列を追加するという方法をとります。※1
また、ALTER TABLEが使えるSQLite3系統でも VACUUM を実行するまでは3.1.3 以前のバージョンからそのデータベースファイルを読み込むことができないことに注意。※2

SQLiteでは・・・

カラムの削除などは現在は出来ないようです。

との事です。
実際の使用例。

テーブル名の変更
ALTER TABLE old_table_name RENAME TO new_table_name;

接続しているデータベース上のテーブルのみ削除出来ます。

カラムの追加
ALTER TABLE table_name ADD column_name column_type;

追加するカラムの指定方法はCREATE TABLEの場合と同じです。
以下、追加するカラムの制約条件。

PRIMARY KEY制約とUNIQUE制約は指定できません。 DEFAULT制約でCURRENT_TIME、CURRENT_DATE、CURRENT_TIMESTAMPは指定できません NOT NULL制約を付ける場合にはNULL以外のDEFAULTを指定して下さい
参考
SQLite入門
http://www.dbonline.jp/sqlite/table/index9.html
seclanのほえほえルーム・・・※1、※2
http://seclan.dll.jp/dtdiary/2007/dt20070228.htm

ラベル: ,


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google