読者です 読者をやめる 読者になる 読者になる

それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

DBアクセス抽象化で、INSERT と UPDATE でコードを共通化させるハック。

php

困りごと: INSERT と UPDATE の共通化をしたい。

似たようなコードを何度も書くのはめんどくさい。テーブル定義が変わったときにもう鬱陶しい。

共通化したい・・・

function insert( name , date ){
    sql = "INSERT INTO table_name VALUES( #{name} , #{date} );"
    mysql->execute();
}
function update( name , date , id ){
    sql = "UPDATE table name_name=#{name}   modified=#{date}  ) where id = #{id} ;;"
    mysql->execute();
}

解決方法を見つけた。

いろいろな設計を見ててたら、次のようにすると解決した。

さきに、空っぽのレコードを作ってしまう。

function save( name , date , id=null){
    if ( ! id ) {
         sql = "INSERT INTO table name VALUES( );"
         mysql->execute(sql);
         id = mysql->last_insert_id();
     }
    sql = "UPDATE  table_name set   name=#{name}   modified=#{date}  where id = #{id} ;"
    mysql->execute(sql);
}

ものすごいバッドノウハウで臭いカンジがするんだけど。意外とコレでスッキリするんだよなぁ、

どうでもいい話

データ・ベースのアクセスってSQLのbuildingで四苦八苦したり、Prepareと相性が悪くて、なぜかStringを結合したりとかしちゃってるのを見たことがあってですね。

ORMを使えば良いんだろうけど、どのORMを採用するかで宗教戦争になりそうだったり、 SQLでこう書くのを、ORMでどう書くかと翻訳が2段階になって、時間コストが増えたりとかですね。

ORMは遅かったり最適化がうまくできん買ったりめんどくさいですよね

phpのリクエストパラメータをサクっと処理する

php

phpのリクエストを読むのに、ブラケットがめんどくさい

ブラケット書くのがめんどくさい 此の記述がもはや狂気。

<?php

if ( empty($_GET["name"]) ){

}

["name"] を書いて、if ( func( ) ) に加え、 $_GET などと、どれだけ大変なのだ。キーボードの運指が辛い。

かといって、フレームワークのやり方もキレイとは言えるのか?

<?php

$name = Request::input('name', 'default_name');

リクエストをオブジェクトにして取得するのはもう面倒だ。

コレも長過ぎる。そもそも変数名に出来ないところがもうイヤだ。

考えてみた

if のチェックは3項演算子で省略できる。ブラケットとクオート地獄はオブジェクトにキャストしてしまえばいい。さらに、デフォルト値は配列を置換する形式にしておけば、余計な文字列を処理して必要なものだけを取り出せるはずだ。

<?php

if ( $req->name ) {
   echo $req->name
}

こんなふうに書けたら楽なのに。。。

作ってみた。

ポイントは3つ

  1. デフォルト値を尊重する
  2. 配列と配列のマージ・置換処理をする
  3. オブジェクトにキャストする

コレで十分なはずだ。

<?php
$defaults = [
  'limit' => 10,
  'offset' => 0,
  'do_search'=>0,
  'search' => null,
  'station' => null,
  'category_id' => null
];


$req = array_merge($defaults, $_REQUEST);
$req = array_intersect_key($req, $defaults);
$req = (object) $req;

こうしておけば、使うときも楽ですよね

before

<?php 

if(   empty($_GET["limit"]) ||  ($_GET["limit"]) < 0  ){
    $_GET["limit"] = 100;
}
if(   empty($_GET["name"]) ||  strlen($_GET["name"]) < 1  ){
    $_GET["name"] = 'default_name';
}

もう悪夢でしか無い。この記号の多さは。

after

<?php 

$req->limit  = $req->limit >0 ?: 100;
$req->name  = strlen($req->name) >0 ?: 'default_name';

うん、随分楽になる。phpフレームワークさんたちは、これを隠蔽する必要あるのかな・・・

指定したファイルの日付を取得してフォーマットするdateコマンド

date linux

date コマンドでファイルの日付を取得する。

指定したファイルの日付を取得するには

$ date  +'%F %T' -r /etc/aliases
2015-08-02 13:35:20

最終更新日が取得できる。

     -r, --reference=FILE
              display the last modification time of FILE

もちろん stat でも構わない。

$ stat -c %y /etc/aliases
2016-10-16 01:23:47.000000000 +0900

でもファイル日付が合わない。。。。みたいなことがある。

これは、stat は シンボリックリンクデリファレンスせずに、symlink を読み取るので注意が必要。

date -r と同等のstatを行うには次のようにする。

$ stat -L -c %y /etc/aliases
2015-08-02 13:35:20.000000000 +0900

stat は w/x/y/z とおぼえやすい並びになってる

フォーマット 意味
%w time of file birth, human-readable; - if unknown
%x time of last access, human-readable
%y time of last data modification, human-readable
%z time of last status change, human-readable
$ stat -c %w /etc/aliases
2016-10-16 01:23:47.000000000 +0900
$ stat -c %x /etc/aliases
2016-10-16 01:23:47.000000000 +0900
$ stat -c %y /etc/aliases
2016-10-16 01:23:47.000000000 +0900
$ stat -c %z /etc/aliases
2016-10-16 01:24:48.000000000 +0900

でも覚えるのめんどくさいので、date -r は便利だと思う。