• ベストアンサー

空だと思ったのに・・・

$sql = mysql_query("SELECT * FROM mytable"); $row = mysql_fetch_array($sql, MYSQL_NUM); として、空っぽのtableを見に行ったのに count($row) が1になってるんですけど、これってどういうことなんでしょう? is_null($row[0]) でtrueが返ってきてるようなので、nullが入っているということなんでしょうか?でも、nullって変数とか配列に入るものなんでしょうか?格納できる時点でnullじゃないような気がするんですけど、詳しい解説をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (770/5733)
回答No.3

ANo.2です。 「セットから行の数を取得する」について。 セットと言うのはSQLを実行した結果、返されてきたデータの集まりだと思ってください。 「結果セット」とも呼ぶ事があるようです。 データの集まりと言うのは、例えばこんな感じです。 101,りんご 102,なし 103,みかん 上のようなデータであれば、データが3件(3行、3レコード、など呼び方は色々)ありますから、mysql_num_rows は 3 を返します。 もしデータが1件もなければ、これを私は「空っぽ」と呼んでいますが、0件なので mysql_num_rows は 0 を返します。 データの件数を調べる、あるいは、データがあったかなかったか(「空っぽ」かどうか)を調べるのに mysql_num_rows で確認できます。 補足。 Excelのシートを想像していただけるとわかりやすいと思うのですが、Excelですと、上の見出しに「A、B、C、・・・」とありこれが「列」、左の見出しに「1、2、3、・・・」とありこれが「行」となっています。 上のデータをExcelに入力すると、 1行目のA列に「101」、1行目のB列に「りんご」、 2行目のA列に「102」、2行目のB列に「なし」、 3行目のA列に「103」、3行目のB列に「みかん」、 と言う表になります。 見た目の表としては、もう少しわかりやすいように1行目には列見出しを自分で入力して「果物コード」「果物名」など書くと思いますが、今は、それはおいときます。 この表は、3行2列のデータですので、もし MySQL のデータベースにこのようなテーブルがあった場合、これを単純に SELECT した結果セットを展開すると、以下のようになってきます。 1回目の $row = mysql_fetch_array では、$row[0]="101"、$row[1]="りんご"。 2回目の $row = mysql_fetch_array では、$row[0]="102"、$row[1]="なし"。 3回目の $row = mysql_fetch_array では、$row[0]="103"、$row[1]="みかん"。 こうした時に、$row は [0]と[1]の2列(2項目)を配列の要素として持っていて、それが3行(3レコード)ある事になります ですので、count($row) は 2 を、mysql_num_rows は 3 を返してきます。 正しくはどうなっているのかわかりませんが、私は次のように思っています。 データが1レコードもなかった場合は、mysql_fetch_array関数 が array関数と同じような働きで $row = array(null) と同じ結果を返すのかも知れません。 これを count($row) とすると、ANo.1のご回答にあったように $row[]=null をしたのと同じく 1 を返してくるのだと思います。 $row[0]=null と言う配列要素を1つだけもつ配列として 1 を返すのだと思います。 ちなみに、テーブルのデータが1レコードで用をなすものの場合は mysql_fetch_array は1回だけ実行すればいいのですが、複数レコードでなっているものの場合はループで mysql_fetch_array を繰り返す事になります。

shaka001
質問者

補足

解説ありがとうございました。

その他の回答 (3)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.4

mysql_fetch_arrayの返値については、マニュアルを確認すべきでしょう。 http://jp.php.net/manual/ja/function.mysql-fetch-array.php 「もし行が存在しない場合は FALSE を返します。」 php のデータベース接続関数の一行ずつ取得する物は(PDO,SQLiteなども)、行がないときおおむねfalseを返すみたいです。データベースによってはfetch_all とつく関数を持っていれば、こっちの関数はarray()空配列を返しますけど、mysql では一行ずつ取得するしかないようです。 while($row = mysql_fetch_array($result, MYSQL_NUM)){ 行処理 } などで、行が無くなれば、falseになってループを抜けることが出来るということですね。 よって、行が存在しないとき$row[0] は存在しないので、未定義変数としてis_null はtrueになります。$row の中身を型も含めて知りたいなら、var_dump($row) してみるとよいです。 count については、 http://jp.php.net/manual/ja/function.count.php 「変数に含まれる要素数」 配列の時のみ、空配列=0、空でない配列はその要素数 他のデータ型は、"" 空文字列も含めて文字列や、false,true,数値など定義されていれば要素数1を返します nullと未定義変数は、要素無しとして0が返ります。

shaka001
質問者

お礼

解説ありがとうございました

  • dell_OK
  • ベストアンサー率13% (770/5733)
回答No.2

「空っぽ」についてですが、レコードが1件もないかどうかは mysql_num_rows で確認できます。 count は配列の要素数を返しますので、今回の場合ですと、レコードがあった場合はテーブルmytableの列数になります。 レコードがなかった場合は、mysql_fetch_arrayとしては結果をないデータ(null)として要素1つの配列に展開しているようです。

shaka001
質問者

お礼

回答ありがとうございます。 mysql_num_rowsというのは、「セットから行の数を取得する」とありましたが、これってどういう意味なんでしょうか?

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

ためしに $array[] = null; print count($array); これを実行してみてください。 1 って出ます。 つまり、返ってきたデータそのものが空だとしても、count関数は、配列が存在していればそのcountを返します。 また、nullですが、これは他の言語の経験があるかたがPHPを触ると必ずぶち当たる疑問です PHPのNULLは、「NULL型」という特殊な存在です。 つまり、nullが入っているわけではなく、対象となるものはNULL型であり、値は入っていない という意味です。

shaka001
質問者

お礼

回答ありがとうございます。 空のテーブルを見にいって $sql = mysql_query("SELECT * FROM mytable"); $row = mysql_fetch_array($sql, MYSQL_NUM); とした時と $array[] = null; print count($array); は同じ動きだったんですね。

関連するQ&A

専門家に質問してみよう