• ベストアンサー

空だと思ったのに・・・

$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% (742/5653)
回答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% (742/5653)
回答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

  • mysql_fetch_arrayでレコードが入っていないものも取得したい。

    こんにちは。mysql_fetch_array()でテーブルに入っていないレコードも取得したいのですが、どのようにすればよろしいでしょうか。 テーブルはこんな感じです。 仕事 NUM  1   1  2   1  4   1  5   1 その上で、PHPはこのようになっています。 //データの選択 $sql = "SELECT job, COUNT(*) as num FROM org GROUP BY job"; $res = db_query($sql, $conn); //データの出力 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $array = array( "job"=>$row["job"], "num"=>$row["num"] ); array_push($array, array( "job"=>$row["job"], "num"=>$row["num"] )); $tmp[] = $array; } return $tmp; このPHPのあと、Smartyに値を渡し、.tplで「A職(○件)」というようなことをやっています。 このときにフィールド「仕事」のレコード「3」は1つもデータが登録されていない状態です。そのためか、現状ではNULL値として扱われるようで、配列$rowに値を渡せず、.tplのほうではデータが表示されません。そこで、レコード「3」にデータを登録せずに、NULL値ではなく、例えば0などの値を渡したいと思います。 どのようなコードを書けば値を渡せるのでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • PHP javascript の関係に関して

    現在、MySQLよりPHPを用いてデータを取得し、PHPのある変数にデータを格納しています。 その結果を、javascriptの中でデータとして使用したいと考えていますが、そもそもPHPで格納されている変数をjavascriptの中で使用する事は可能なのでしょうか。。。 //例ですが、   $sql = "select aaa from AAA"; if (!mysql_select_db('db', $con)) { echo 'Could not select database'; exit; } mysql_query("set names sjis"); $result = mysql_query($sql,$con); $row = mysql_num_rows($result); $count = 1; for($i=0;$i<$row;$i++) { $array = mysql_fetch_array($result); $tmp_aaa[$count] = $array[0]; $count++; } <script type="text/javascript"> <!-- msgtxt = new Array(); for (i=0; i<3; i++){ msgtxt[i] = new Array(); } $count = 0; for($i=0;$i<$row_naiyou;$i++) { $msgtxt[$count] = $tmp_aaa[$count]; $count++; } というような形です。 javascript自体、php> ?>の中に囲まれていれば問題ないのでしょうか? 初歩的な質問で申し訳ありませんが、教えて下さい。

    • 締切済み
    • PHP
  • phpの配列の宣言を自動でしたい

    $result = sqlite_query($sql,$con); // クエリを実行 $row = sqlite_num_rows($result); // 取得したレコード件数を変数$rowに格納する $a[1]=a; $a[2]=b; ~~ $a[rowの数値まで]=z; 上のように$a[$row]=~~;と配列の受け口を作り、そこにデータベースのデータを入れたいのですが、どうすればいいのでしょうか? $array = sqlite_fetch_array($result);とは別の配列にしたいです int seiseki[$row]でもだめでした どなたかお願いします

    • ベストアンサー
    • PHP
  • forで無限ループになっていないかどうか

    各アイテムの最新3件だけデータベースに残したいと思い、下記のようにしてみました。 動作を確認したところ問題なかったのですが、何か(無限ループする可能性があるなど)問題があるようでしたら、ご指摘いただけないでしょうか。 よろしくお願いいたします。 for ($num = 1; $num < 21; $num++){ // アイテムが20件ある場合 $sql = "SELECT COUNT(id) AS cnt FROM item where item_id=$num ;"; $res = mysql_query($sql, $conn) or die; $row = mysql_fetch_array($res, MYSQL_ASSOC); $count = $row["cnt"]; if($count<3){ // アイテムが3件より少なかったら何もしない } else{ $delete_count=$count-3; $sql = "delete from item where item_id=$num order by date limit $delete_count;"; $res = db_query($sql, $conn); } }

    • ベストアンサー
    • PHP
  • mysqlの検索結果からある範囲の行数を取り出すには

    mysqlの検索結果からある範囲の行数を取り出すにはどうすればいいのでしょうか?たとえば検索結果から100~200行の間の行数を取り出すには、   ・   ・ $count=1; $result=mysql_query($sql); $rows=mysql_num_rows($result); while ($row=mysql_fetch_array($result)) { ・・・・ if( $count <= 99 ){ $count++; continue;} として99行目まで読み飛ばす処理をする以外に方法がありますか。 もっと効率よく取り出す方法があったら教えてください。

    • ベストアンサー
    • PHP
  • mysql_fetch_array関数について

    お世話になります。 mysql_fetch_array(結果セット,受け取り配列タイプ) についてなのですが。 たとえばSQLの結果が複数件ある場合。 while($dtRec=mysql_fetch_array("select * from ***",MYSQL_ASSOC){ $result = $dtRec['aaaaa']; } 解説書には一件づつ受け取る結果の配列を 数値による配列で受け取るなら「MYSQL_NUM] フィールド名をキーとした配列で受け取るなら 「MYSQL_ASSOC」を指定、 両方なら「MYSQL_BOTH」を指定すると 書いてあるのですが、配列の意味が分かりません。 $resultにはEOFになるまで毎回、$dtRec['aaaaa'] の内容が格納されるのではないでしょうか? それとも、$resultにexplode関数のように 配列で件数分格納されるのでしょうか? 現在は、自分で配列に格納しようとしているので・・ (うまくいってません) いくら解説書を読んでも、MYSQL_NUM 、MYSQL_ASSOCの意味がよく理解 できません。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • COUNT(*)の使い方

    COUNT(*)の使い方が分からないので質問します。 直接のSQLでCOUNT(*)を使ってレコード数を表示させることはできましたが PHPでのSQLではCOUNT(*)をPHPのソースの変数に代入する方法が分かりません。 $sql = 'SELECT ip, COUNT(*) FROM webdb'; $ret = mysql_query($sql); $rowval = mysql_fetch_row($ret); この場合、$rowval[1] がテーブルwebdbのレコード数だと 思いましたが、間違っているところはございませんか?

    • ベストアンサー
    • MySQL
  • レンタルサーバーで PHP+MySQL のサイトを作ってます。

    レンタルサーバーで PHP+MySQL のサイトを作ってます。 極稀に、一部のクエリーが原因で、 MySQLのプロセスが大量にSleep状態で長時間滞留してしまう事態が生じ、 サーバーに高負荷をかけてしまいます。 これを解消するために、 $sql = "SHOW PROCESSLIST"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result,MYSQL_NUM)){ $id = $row['0']; $time = $row['5']; if($time > 60) mysql_query("KILL {$id}"); } こんな感じのコードをcronで数分毎に実行し、問題のプロセスを停止させようと思ったのですが... どうなんでしょう? アドバイスを頂けないでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。

    SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。 (カラム名を連想配列のキーにします。) また、値をHTMLエスケープ処理したいと考えています。 下記のソースを書いてみましたが、配列$all[]にうまく入りません。 $qresult = mysql_query($qstring); $all = array(); while (list ($key, $val) = mysql_fetch_assoc($qresult)){  $all[$key] = htmlentities($val, ENT_QUOTES,EUCJP); } また、3行目をeach(mysql_fetch_assoc($qresult))に変更してもみましたが、 「Variable passed to each() is not an array or object」エラーが出ます。 mysql_fetch_assocの戻り値は連想配列では無いのでしょうか。 $qresult = mysql_query($qstring); $all = array(); while ($rec = mysql_fetch_assoc($result)){  $all[] = $rec; } 上記だと問題なく取得出来るのですが。。。 何が悪いのでしょうか。

    • ベストアンサー
    • PHP
  • SQLのどこがおかしいでしょうか?

    PHP4、MySQLです。 for($i=1;$i<34;$i++){ $sql = "select count(group) as cnt".$i." "; $sql.= "from stock "; $sql.= "where group=".$i." "; //print "sql= ".$sql."<br>"; $result = mysql_query($sql,$db) or die("失敗しました".mysql_error ()); $Row = mysql_fetch_array($result, MYSQL_ASSOC); $cnt.$i = $Row['cnt".$i."']; } としています。どこがおかしいでしょうか? 教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP