CakePHP1.3 findメソッドの比較演算子を凄く誤解してた件

テーブルから1件のレコードを条件付きで取得しようと下記のように記述しました。

//hogeが1のレコードを条件付きで1件取得したいができない
$data = $this->Model->find( 'first', array('conditions' => array('Model.hoge' == '1')));


しかし、うまくいきません。
実行クエリを出力してみたら、where句にconditionsパラメータの値が全く反映されていません…
ですが、下記のようにするとうまくいきます。

//hogeが1のレコードを条件付きで1件取得できる
$data = $this->Model->find( 'first', array('conditions' => array('Model.hoge' => '1')));


あれ、conditionsパラメータ中の => って実行するクエリの演算子じゃなかったの!?
ってよく見たら => は配列演算子で >= Mysql演算子ですね…
http://dev.mysql.com/doc/refman/4.1/ja/comparison-operators.html




なんか凄くアホっぽいのでもう寝ます…




ちなみに、>=演算子を使いたい場合は下記のように実行すればすんなりできました。

//hogeが1以上の条件のレコードを1件取得できる
$data = $this->Model->find( 'first', array('conditions' => array('Model.hoge >= ' => '1')));

PHP5.3 eregとかのPOSIX正規表現関数が「この機能を使用しないことを強く推奨します。」とか言われちゃってる件

正規表現の代表的な関数 ereg の項目を見ていたらこんな記述が
http://phpspot.net/php/man/php/function.ereg.html

この関数は PHP 5.3.0 で 非推奨となりました。 この機能を使用しないことを強く推奨します。

えっ…





たった今使おうとしてたYO!
とりあえず下まで読んでみると以下のような記載が

かわりに PCRE 拡張モジュール を使うことが推奨されています。 

補足:PCRE 拡張モジュールについて
http://phpspot.net/php/man/php/pcre.installation.html

なるほど代わりの関数があるのか、というか4.2以降で既にあった事をしらなんだ…
というわけでPHP4.2以降であれば ereg は使わずに preg_match(戻り値が全然違うことに注意!)を使うようにしましょうと、環境をPHP 5.3以降にしてもちゃんと動いてくれるからね。
http://phpspot.net/php/man/php/function.preg-match.html

その他のPOSIX 正規表現関数と呼ばれる関数群は、PHP 5.3以降すべて非推奨となっています。
http://phpspot.net/php/man/php/ref.regex.html






めでたく解決。






と、ここまで言っておきながら下まで読んでみると
http://phpspot.net/php/man/php/function.preg-match.html

ある文字列が他の文字列内に含まれているかどうかを調べるためだけに preg_match() を使うのは避けた方が良いでしょう。 
strpos() か strstr() 関数を 使う方が速くなります


…………


結局、strposで処理させました。

CakePHP1.3&1.2 実行したクエリを確認したい件

cakephpで実行したクエリを確認したい場合


●1.2系であれば設定ファイルをいじくればいいのだが
http://asaton.seesaa.net/article/31945048.html



●1.3系ではうまくいかない…
調べてみると、1.3系からは以下のように設定するようだ。
http://copo.jp/mizu/?p=104



●1.3系で、debugモードが初期値であればもっと手っ取り早い方法も。
コントローラ中のオートレンダリングを有効にして

	public $autoRender = true;

viewのないパスに飛ばしてやればよい。

見慣れたアレな画面の下に実行クエリが表示されます。

cakephp1.3+Mysql5 deleteAllはやっぱりauto_incrementを初期化してくれない件

単純に、テーブルの中身を全部消したい場合以下のようにします。

	//(引数はこのように設定しないとダメ)
	$this->Model->deleteAll('1 = 1', false);

なるほど、これで全部消えますがauto_increment属性のキー項目が残念ながら初期化されません。
(insertを実行した場合、1から始まるではなく中途半端な数字から始まります)



そこで、auto_incrementを初期化するため下記のようにしました。

	//(引数はこのように設定しないとダメ)
	$this->Model->deleteAll('1 = 1', false);
	$sql = "ALTER TABLE Models AUTO_INCREMENT = 1";
	$execQuery = $this->Model->query($sql);


これで次回インサート時にもauto_incrementは1からはじまるようになりました。







でも、いちいち実行後にalterするのがめんどくさい!
というのであれば、下記のようにすればいいのかもです。


●1

	//(今度は第3引数【コールバック関数有無】を有にする】)
	$this->Model->deleteAll('1 = 1', false, true);


●2
と、もうひとつ、コールバック関数に下記のとおり設定します。
(cake/libs/model/app_model.php

class AppModel extends Model {

	function afterDelete(){
	
		$sql = "ALTER TABLE ".$this->useTable." AUTO_INCREMENT = 1";
		$execQuery = $this->query($sql);
		//print_r($this);
	}

}


これで、どのテーブルを消しても常にauto_incrementは初期化されるようになります。








と、ここまで書いておいてなんですがトランザクションとか関係ねーYO!っていうなら
$sql = "TRUNCATE TABLE テーブル名";
$execQuery = $this->Model->query($sql);


が一番高速で楽なんでしょうねぇ。
以上、念のために色々メモっておきました。

html css divタグが改行されるのを改行させない件

忘備録

たとえば

	<div>こん</div><div>ばんわ</div>

と書くと、改行されてしまいます。

こん
ばんわ




これを改行(つづけて、「こんばんわ」と表示する)せずに表示する場合は下記のようにします。

	<div style="display: inline-block; _display: inline;">こん</div><div style="display: inline-block; _display: inline;">ばんわ</div>

こん
ばんわ




勿論、style属性はclassなりidをふるなりしてcssに外出し表記したほうがよい。
inline-block、_displayと2つあるのは、Ie系とMozila系に対応するためらしい、Operaでもちゃんと表示されてました。