PHPでテキストファイルを簡易データベースとして使用するTextDbクラス公開!find()
では、find($conditions) の使い方を説明します。
find($conditions)は指定した条件に合致したレコードを取得します。
今、
このディレクトリ構成で、index.phpに
require_once 'TextDb.php'; $c_fields = array("id","name","address"); $c_db = new TextDb("tbl/customer.txt","::",$c_fields); $i_fields = array("id","name","customer_id"); $i_db = new TextDb("tbl/item.txt","::",$i_fields);
と記述してあるとして、customer.txtに
tablename::customer id::name::address 1::yamada::tokyo 2::tanaka::osaka 3::suzuki::kyoto 4::sato::tokyo 5::sasaki::tokyo
のように5つのレコードがあるとします。
find($conditions)は条件通りにレコードを取得しますから、条件の指定方法を先に説明しましょう。
条件は
AND検索(A且つB且つ・・・)
OR検索(AまたはBまたは・・・)
のどちらも可能です。
AND検索の方法
条件を指定する引数$conditionsに
$conditions = array( "テーブル名.カラム名"=>値,//① "テーブル名.カラム名"=>値,//② "テーブル名.カラム名"=>値,//③ ・・・・・ ・・・ ・ ); $data = $c_db->find($conditions); print_r($data);
のようにキーと値を指定します。
このように連ねることで
「①且つ②且つ③且つ・・・」
のように全てAND検索になります。
OR検索の方法
条件を指定する引数$conditionsに
$conditions = array( "テーブル名.カラム名"=>array(①,②,③・・・・) ); $data = $c_db->find($conditions); print_r($data);
のような配列の値を指定します。
配列で指定することで
「このテーブルのこのカラムが①または②または③または・・・」
のようにOR検索になります。
検索の例
では例えばこの記事の上部で示したテーブルの状況だとして、
「東京の佐藤さん」を探してみましょう。
条件指定は、
「addressが東京 且つ nameが佐藤」ですから、
$conditions = array( "customer.address"=>"tokyo", "customer.name"=>"sato" ); $data = $c_db->find($conditions); print_r($data);
となります。実行結果は、
Array ( [customer] => Array ( [4] => Array ( [id] => 4 [name] => sato [address] => tokyo ) ) )
です。見つかりましたね。
では次に
「idが1~4のうちどれかで、東京在住」
の人を探してみましょう。
条件は
「idが1または2または3または4 且つ addressが東京」
ですから、
$conditions = array( "customer.id"=>array(1,2,3,4), "customer.address"=>"tokyo" ); $data = $c_db->find($conditions); print_r($data);
となります。実行結果は、
Array ( [customer] => Array ( [1] => Array ( [id] => 1 [name] => yamada [address] => tokyo ) [4] => Array ( [id] => 4 [name] => sato [address] => tokyo ) ) )
です。
ちゃんと見つかってますね。
こんな感じで、バリエーションは色々です。
否定検索
「~ではない」で検索することもできます。
方法は「<>」を使います。以下例です。
$conditions = array( "customer.id"=>"<>3", "customer.address"=>"<>tokyo" ); //IDが3ではなく 且つ 住所が東京ではない
演算子の指定で検索
~を超える
~以上
~未満
~以下
~辞書式で後にくる(一致を含む)
~辞書式で前にくる(一致を含む)
~辞書式で後にくる(一致を含まない)
~辞書式で前にくる(一致を含まない)
など、演算子を使用した検索もできます。以下例です。
$conditions = array(
"customer.id"=>">3"//3を超える
);
$conditions = array(
"customer.id"=>"<3"//3未満
);
$conditions = array(
"customer.id"=>">=3"//3以上
);
$conditions = array(
"customer.id"=>"<=3"//3以下
);
//3以上10未満
$conditions = array(
"customer.id"=>">=3",
"customer.id::"=>"<10"
);
はい。
ちなみに数値ではなく文字列の場合には、
辞書式に判断されることになります。
・・・3以上10未満が気になりますね(笑
はい、説明します。
find($conditions)の検索は内部でforeachをして値を比べています。
その際、配列の性質として
「同じキーの値が複数ある場合、後の値が前の値を自動的に上書きする」
というのがありますから、"customer.id"というキーが複数あると
foreachで回せないんですね。
ですので「::」こんなものを入れて異なるキーとして扱っているわけです。
ではこの「::」はなんなのか?
これはインスタンス生成の際に指定した$del_markです。
今回の例ではインスタンス生成時に$del_markを「::」にしています。
$c_fields = array("id","name","address"); $c_db = new TextDb("tbl/customer.txt","::",$c_fields);
find($conditions)はキーに入った$del_markを全て取り除いてから検索を始めるようにしてありますから、同じキーが複数になりそうなときはインスタンス生成時に指定した$del_markでキーを変化させて下さい。
例です。
$conditions = array( "customer.id"=>・・・・, "customer.id::"=>・・・・, "customer.id::::"=>・・・・, "customer.id::::::"=>・・・・, ・・・・・ ・・・ ・ );
こんな感じです。
関数名 | 説明 |
---|---|
get() |
テーブルの全レコードを取得する。 |
find($conditions = array()) |
検索条件を指定してレコードを取得する。 引数がない場合はget()と同じ動作をする。 |
findJoin($join,$con1=array(),$con2=array()) |
テーブルを結合して 指定条件に合致したレコードを取得する。 |
save($arr) |
レコードを追加または更新する。 引数の配列にidが指定されている場合は、 そのidのレコードを更新する。idがない場合は追加する。 |
updateBase($form) | 特定のレコードの特定のカラムを更新する。 |
updateAll($arr,$conditions) |
指定した条件に合ったレコードの指定カラムを 一括更新する。 |
delete($id) | 指定したidのレコードを削除する。 |
deleteAll($conditions) |
指定した条件に合ったレコードを 一括削除する。 |
getLastId() | 最後のレコードのidを数値で取得する。 |