MW211 EXIT

devlog
Smarty/連想配列に値がない場合の処理分岐
2011年08月31日
Smartyに指定された連想配列(ここでは$data)に値がない場合に
全体を非表示とする例は以下の通り。
┌──────────────────────────────────────┐
│{if ($data|@count) > 0}                                                     │
│見出表示用タグ                                                              │
│{foreach from=$data key=k item=i}                                           │
│明細表示用タグ                                                              │
│{/foreach}                                                                  │
│{/if}                                                                       │
└──────────────────────────────────────┘

以下もOK。
┌──────────────────────────────────────┐
│{if $data}                                                                  │
│見出表示用タグ                                                              │
│{foreach from=$data key=k item=i}                                           │
│明細表示用タグ                                                              │
│{/foreach}                                                                  │
│{/if}                                                                       │
└──────────────────────────────────────┘
分類:Smarty
SQL/呉越同舟?
2011年08月30日
1対nの関係にある親子テーブルを結合して、子IDで親子両方の名称を取得する場合に
以下のようなSQL文となる(各IDは主キーとする)。
┌──────────────────────────────────────┐
│SELECT 親.名称,                                                             │
│       子.名称                                                              │
│    FROM 親,                                                                │
│         子                                                                 │
│    WHERE 親.親ID = 子.親ID                                                 │
│      AND 子.子ID = {子ID};                                                 │
└──────────────────────────────────────┘
一方、m対nの関係にある場合は上記SQL文では、複数のレコードが該当してしまう。
しかし、子IDに加えて親IDもわかっている場合には、
以下のようなSQL文で一意にレコードを取得できる。
┌──────────────────────────────────────┐
│SELECT 親.名称,                                                             │
│       子.名称                                                              │
│    FROM 親,                                                                │
│         子                                                                 │
│    WHERE 親.親ID = {親ID}                                                  │
│      AND 子.子ID = {子ID};                                                 │
└──────────────────────────────────────┘
全然別の一意情報を結合しただけだが、
1件×1件の直積は1件という単純な法則は結構使えるかも。
分類:SQL
内部結合と外部結合が複合する場合の罠
2011年08月29日
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1,                                                               │
│         表2                                                                │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
内部結合している表1と表2のうち、表1の方に表3を左外部結合したい場合
やってしまいがちなミス。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1,                                                               │
│         表2                                                                │
│    LEFT JOIN 表3 ON 表1.ID = 表3.ID                                        │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
以下が正しい。
表1と表2の結合結果に表3を結合するのではなく、
表1と表3の結合結果に表2を結合するのが正しい。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1 LEFT JOIN 表3 ON 表1.ID = 表3.ID,                              │
│         表2                                                                │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
表2に外部結合する場合は、前述でも順番的に問題ないので、
本来の仕様を勘違いしたままとなりやすい。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表1,                                                               │
│         表2                                                                │
│    LEFT JOIN 表3 ON 表2.ID = 表3.ID                                        │
│    WHERE 表1.ID = 表2.ID;                                                  │
└──────────────────────────────────────┘
分類:SQL
PHP/環境変数による現在地の認識
2011年08月28日
┌───────┬──────────────────────────────┐
│URL名         │http://www.mw211.com/sub/index.php?key=val                  │
├───────┼──────────────────────────────┤
│ファイルパス名│C:\www\htdocs\sub\index.php                                 │
└───────┴──────────────────────────────┘
上記例において、「index.php」にて、それぞれの位置情報を得るPHPの記述。
┌──────────────┬───────────────────────┐
│index.php                   │basename($_SERVER['SCRIPT_NAME'])             │
├──────────────┼───────────────────────┤
│index                       │basename($_SERVER['SCRIPT_NAME'], '.php')     │
└──────────────┴───────────────────────┘
┌──────────────┬───────────────────────┐
│key=val                     │$_SERVER['QUERY_STRING']                      │
└──────────────┴───────────────────────┘
┌──────────────┬───────────────────────┐
│sub/index.php?key=val       │$_SERVER['REQUEST_URI']                       │
├──────────────┼───────────────────────┤
│sub/index.php               │$_SERVER['PHP_SELF']                          │
├──────────────┼───────────────────────┤
│sub/index.php               │$_SERVER['SCRIPT_NAME']                       │
└──────────────┴───────────────────────┘
┌──────────────┬───────────────────────┐
│C:\www\htdocs\sub\index.php │___FILE___                                    │
├──────────────┼───────────────────────┤
│C:\www\htdocs\sub           │realpath('.');                                │
│                            │realpath(NULL);                               │
│                            │dirname(___FILE___);                          │
├──────────────┼───────────────────────┤
│C:\www\htdocs               │realpath('..');                               │
│                            │dirname(realpath('.'));                       │
└──────────────┴───────────────────────┘
分類:PHP
PostgreSQL/出力順の指定
2011年08月27日
PostgreSQLには(MySQLでいうところの)「ORDER BY FIELD」がないので、
以下で代用する。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE 列 IN (1, 3, 2)                                                   │
│    ORDER BY CASE 列                                                        │
│               WHEN 1 THEN 1                                                │
│               WHEN 3 THEN 2                                                │
│               WHEN 2 THEN 3                                                │
│               ELSE        0                                                │
│             END ASC;                                                       │
└──────────────────────────────────────┘
分類:PostgreSQL
PostgreSQL/ダミー条件文
2011年08月25日
(複数の)条件文(WHERE句)をプログラムなどで機械的に作成する場合、
「AND」から始まる単位(「AND ~」)で結合していきたいケースがある。

そんな時便利な、先頭に設置する
あってもなくてもよい(必ず真になる)条件文は以下の通り。
「WHERE TRUE」

例えば以下のような感じ。
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE TRUE                                                              │
│      AND 列1 > 0                                                           │
│      AND 列2 > 0;                                                          │
└──────────────────────────────────────┘
分類:PostgreSQL
PHP/特定の文字を含むかの判定
2011年08月24日
PHPである文字列中に、ある特定の文字(列)を含むかを判定する方法。
┌────────────┐
│substr_count('ABC', 'A')│(「ABC」中に「A」を含むか判定する場合)
└────────────┘
上記が「1以上」(=真)なら、「含む」と判定。
ちなみに、これは(「ABC」中の「A」の)文字数をカウントする関数である。
分類:PHP
PHP/PDOのSELECT文実行
2011年08月23日
PHPのPDOのSELECT文実行で、以下と以下は同じ(みたい)。
┌──────────────────────────────────────┐
│foreach ($dbh->query($sql) as $row) {                                       │
├──────────────────────────────────────┤
│$stmt = $dbh->query($sql);                                                  │
│while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {                             │
└──────────────────────────────────────┘
以下と以下も同じ(みたい)。
┌──────────────────────────────────────┐
│$stmt = $dbh->query($sql);                                                  │
├──────────────────────────────────────┤
│$sth = $dbh->prepare($sql);                                                 │
│$sth->execute();                                                            │
└──────────────────────────────────────┘
分類:PHP、PDO
SQL/テーブル(表)の全レコード削除
2011年08月22日
┌──────────────────────────────────────┐
│DELETE FROM 表;                                                             │
└──────────────────────────────────────┘
上記のように、DELETE文を無条件(条件無し)で実行すれば、全レコードが削除される。

テーブルを空っぽにするという意味においては、以下も同じ。
┌──────────────────────────────────────┐
│TRUNCATE TABLE 表;                                                          │
└──────────────────────────────────────┘

ただし、動作としては、DELETE文はレコード数分実行されるのに対して
TRUNCATE文は、テーブル数分(つまり一回)実行されるイメージなので
後者がおすすめ。
分類:SQL
PHP/セッション数を数える方法
2011年08月21日
セッション数(セッションファイル数)を数える方法は以下の通り。
┌──────────────────────────────────────┐
│count(glob(session_save_path().'/sess_*'))                                  │
└──────────────────────────────────────┘
glob関数って便利だね。

ちなみにセッションファイルは、「'sess_'+セッションID」というファイル名である。
分類:PHP
前へ 1 2 次へ