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

やったこと

webサービスを作るときに考えたことを垂れ流します

ajaxで「false」の値を送信してもPHPでは「true」と判定される

クライアント側とサーバ側の「Boolean」の値に注意してください。

例えば、下記のようにjquery ajaxでクライアントからサーバにBooleanの値を送信します。

  var name="hogege";
  var is_dead = false; //★falseの値をセット
  $.ajax({
    url  : "./post.php",
    type : "POST",
    data : {'name':name, 'is_dead':is_dead},
    dataType : 'json'
  })

このメッセージをサーバ側PHPで受信して評価します。

$is_dead =  $_POST['is_dead'];

if ($is_dead == true){
  $logger->debug("dead!");
}else{
  $logger->debug("not dead!");
}

このとき「$is_dead」は「false」ではなくて「true」と判別されてしまいます。

ajaxのメッセージには「"true"」「"false"」という文字列が入っていて、PHP側は"true"という文字列も"false"という文字列も、共に真と評価してしまいます。

たとえPHP側で下記のようにBoolean型にキャストしても無駄です。結局これも真と評価されてしまいます。

$is_dead =  (Boolean)$_POST['is_dead'];

ちゃんと評価するためには、おとなしく"true"や"false"の文字列が入っているかどうかをチェックしましょう。すなわち下記のようにするのが良さそうです。

$is_dead =  $_POST['is_dead'];

if ($is_dead == "true"){
  $logger->debug("dead!");
}else{
  $logger->debug("not dead!");
}