プログラミングで飯を食え。腕をあげたきゃ備忘録!

PHP、JavaScript、HTML5、CSS3などWEB系言語を中心に基本テク、備忘録をまとめます。Android、Iphoneアプリ開発についても!

PHPでテキストファイルを簡易データベースとして使用するTextDbクラス公開!find()

サクウェブTVはコチラ↓↓↓
サクウェブTV

では、find($conditions) の使い方を説明します。

find($conditions)は指定した条件に合致したレコードを取得します。

今、

f:id:senoway:20130804160245j:plain

このディレクトリ構成で、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を数値で取得する。