dポイントプレゼントキャンペーン実施中!

$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じゃないような気がするんですけど、詳しい解説をお願いします。

A 回答 (4件)

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 を繰り返す事になります。

この回答への補足

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

補足日時:2008/08/08 21:20
    • good
    • 0

mysql_fetch_arrayの返値については、マニュアルを確認すべきでしょう。


http://jp.php.net/manual/ja/function.mysql-fetch …
「もし行が存在しない場合は 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が返ります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/08 21:22

「空っぽ」についてですが、レコードが1件もないかどうかは mysql_num_rows で確認できます。


count は配列の要素数を返しますので、今回の場合ですと、レコードがあった場合はテーブルmytableの列数になります。
レコードがなかった場合は、mysql_fetch_arrayとしては結果をないデータ(null)として要素1つの配列に展開しているようです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/06 21:01

ためしに


$array[] = null;
print count($array);
これを実行してみてください。
1 って出ます。
つまり、返ってきたデータそのものが空だとしても、count関数は、配列が存在していればそのcountを返します。

また、nullですが、これは他の言語の経験があるかたがPHPを触ると必ずぶち当たる疑問です
PHPのNULLは、「NULL型」という特殊な存在です。
つまり、nullが入っているわけではなく、対象となるものはNULL型であり、値は入っていない という意味です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/06 20:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!