エリベリンデラボ

2009年12月18日

php型の比較表(と文字列の自動変換による判定の不具合)

カテゴリー: php — タグ: — elibelinde labs @ 12:35 このエントリーを含むはてなブックマーク

http://jp2.php.net/manual/ja/types.comparisons.php

今度時間のあるときにじっくり眺めてみるためのメモ。

~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・

時間はないけどじっくり眺める必要ができたので追記(09/12/19)

0 == “string”
がなぜtrueになるのか悩みました。

0 が 文字列に自動変換でも false
0 が bool(false) でも false
もちろん0 が 数値のまま でもfalse

なはずなのに,実際の処理では trueとして判定されます。

答えはこちらでした。

整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。これらの ルールは、 switch 文にも適用されます。
http://www.php.net/manual/ja/language.operators.comparison.php

とのことでした。
0 が自動変換されているとばっかり思っていたのですが,文字列と整数型の比較では「文字列が数値」に変換されるそうです。
「”1″ が 1」 になったり 「”0” が 0」 になるのは感覚的に良く分かるのですが
「”その他の文字列”が 0 」になるというのはあらためて知っておくべきだと思いました。

最初は標題の比較票http://jp2.php.net/manual/ja/types.comparisons.php
の「0 == “php”」のtrue にどうしても納得が行かず( “文字列” は勝手には変換されないだろうと思い込んで )調べていたら「
比較演算子のページに上記がありましたのですっきりしました。

このおかげではまったのは

< ?php

$array = array(
  0=>array(
    array(
      "child_key"=>"child_val",
      "child_key2"=>"child_val2",

    )
  ),
  2=>array(
    array(
      "child_key"=>"child_val3",
      "child_key2"=>"child_val4",

    )
  ),
  3=>array(
    array(
      "child_key"=>"child_val5",
      "child_val2"=>"child_val6",

    )
  ),
);

?>

みたいな配列をforeachで順番に処理して最初のキーに決まった文字列が入ってくることがあるからその場合はじく

< ?php
foreach($array as $key => $val){

  if($key != "string"){//最初のキーが文字列の場合はじく ←ここの判定
      if($val[clild_key2] == "条件"){

        //処理 なんちゃら

        ~~~

        //処理 かんちゃら
      }
  }
}
?>

場合にキーが0である最初のループだけ文字列じゃないのに処理されなくて悩みました。

もう少し解説すると

「”string” != “string” で判定がfalse」
の場合のみ false を期待した処理でしたが

文字列以外のループでは
0 != 0(”string”が変換される) で判定がfalse
1 != 0(”string”が変換される) で判定がtrue
2 != 0(”string”が変換される) で判定がtrue
以下true

と,0 の場合も falseなのでifを通過しません。

基本的なことかもしれませんが,発見までしばらく各所でvar_dump地獄に陥りました。
switchでも同じことが起こるそうなので気づかないとはまるかもしれません。

ちなみに === と !== で型まで比較(というより自動変換をさせない)すれば当初の期待通りに動きます。
(0 !== “string” はtrue )
あとはdatatype で判定するのも手ですが,
配列のキーに必ず数値が来る保証がないので厳密な比較を行うのがちょっと不安といった心持があります。
(post処理をはさんだりすると)phpでは厳密なプログラミングをするのに工夫が必要な場があります。

まあ,ゆるいのが長所であり短所なのは周知のことですし,私もそんなphpが好きです。

cakephp1.2で複数レコードのvalidation

カテゴリー: cakephp — タグ: , — elibelinde labs @ 12:34 このエントリーを含むはてなブックマーク

メモです

”とりあえず”実現するには

1.saveAll()を使う。
http://teknoid.wordpress.com/2008/10/27/editing-multiple-records-with-saveall/
ちなみにsaveAll() は第二引数 $option に validation => only を渡すと
レコードの更新は行わない

2.controllerで自分で判定して配列でviewに渡してviewで処理

3.あとはmodelのinvalidateをいじる

参考:http://groups.google.co.jp/group/tickets-cakephp/browse_thread/thread/abd52e0ed25fde19

成功例:http://www.mail-archive.com/cake-php@googlegroups.com/msg62391.htmlとあるけどまだ検証していません

phpのperl互換正規表現について

カテゴリー: php — タグ: — elibelinde labs @ 07:50 このエントリーを含むはてなブックマーク

大したことではありませんが,調べたことをメモします。

その1)バックスラッシュ「\」とマッチさせる

「\\\\」で検索する。
「\」自体をパターンで表すと「\\」なので,「\\」を使って[\\]にマッチさせるので,「\\\\」になる。
例)
php preg_match()で一定の文字列から「\」を削除する

< ?php
$str = "moj\\ire\\tsu";
preg_match("/\\\\/","",$str);
?>

その2)デリミタにはalphanumericおよび\以外の文字ならなんでも使える

探していたrewirete[メモ]

カテゴリー: cakephp, メモ — タグ: — elibelinde labs @ 02:41 このエントリーを含むはてなブックマーク

http://cakebaker.wordpress.com/2006/08/17/take-over-the-control-of-some-urls-from-cakephp/

.htaccess file in app/webroot. The original .htaccess file:

<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</ifmodule>

And after the modification:

<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/stats/(.*)$
RewriteRule ^.*$ – [L]
</ifmodule>
# Begin CakePHP
<fmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</ifmodule>

及びxserverでのssl
http://plus-sys.jugem.jp/?eid=162

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{HTTP_HOST} ^svXXX.xserver.jp
RewriteRule ^(.*)$ /~アカウントID/ドメイン名/index.php?url=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

2009年12月17日

Fatal error: Can’t use method return value in write context in

カテゴリー: php — タグ: — elibelinde labs @ 22:11 このエントリーを含むはてなブックマーク

Fatal error: Can’t use method return value in write context in
の原因と対策について

empty()は関数の戻り値を判定できません。
変数以外を入れると標題のエラーとなります。


< ?php
if(empty(returnSomething($nothing))){
  someAction();
}
?>

これだとエラー


< ?php

$something =  returnSomething($nothing);

if(empty($something)){
  someAction();
}
?>

このように一度変数に入れてあげると解決

CɂȂver.b2.0 ŐV̌tbcł܂

Powered by WordPress