• 締切済み

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
  • 回答数3
  • ありがとう数2

みんなの回答

回答No.3

ANo. 1 です。 そもそも mysql_fetch_array にこだわる必要はあるのですか? mysql_fetch_array は SQL で引っ張ってきたデータを連想配列に代入する関数のようですね。 私なら単純に mysql_fetch_row を使いますが。。。 あと、while 文の中身も理解できませんでした。  1. mysql_fetch_array で取得した連想配列を変数 $array に代入。  2. mysql_fetch_array で取得した連想配列を配列 $array に配列要素として追加。  3. 1.~2. で得られた $array を配列 $tmp に配列要素として追加。 を繰り返しているように見えるのですが。。。違いますか? 単に下記のように job 番号をインデックスとした配列に各 job での num の合計数を代入すれば 良いように思えますが。 $job_data[ job 番号 ] = num の合計数 Smarty を使ったことがないので、Smarty に渡すためにどのような配列を作成すれば 良いのかはわかっていません。 以下は参考までに。手元に PHP + MySQL 環境が無いので未検証です。 ==== テーブル定義 ==== テーブル名: org 列名:  job  num ==== テーブル定義ここまで ==== ==== コード ==== //job 番号の最大値用 $max_job = 0; //DB への問い合わせ準備 $sql = "SELECT job, COUNT(num) as total_num FROM org GROUP BY job"; $res = db_query($sql, $conn); //データの取得 while ($row = mysql_fetch_array($res, MYSQL_NUM)) { //mysql_fetch_row と同じ  //job 番号の更新  if($max_job < $row[0]){   $max_job = $row[0];  }  //取得したデータを配列に格納  $job_data[$row[0]] = $row[1]; } //データの入っていない要素に 0 を代入 for($i=1; $i<=$max_job; $i++){  if(is_null($job_data[$i]){   $job_data[$i] = 0;  } } //データを Smarty に渡す? return $job_data; ==== コードここまで ==== ※コードにはインデントとして全角スペースを入れています。実際に使うときは TAB にでも置換してください。

回答No.2

ANo. 1 です。 SQL 文は、列の名前を job と num だとして、 $sql = "SELECT job, SUM(num) as total_num FROM org GROUP BY job"; だと、どうでしょうか? 「うまくいかない」という内容(エラーなど)を書いてきてもらえると アドバイスできますよ。

wwwa-ara
質問者

お礼

ありがとうございます。 どちらでも、 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in 以降ファイルパス になってしまいますね。元のコードの場合にprint_r関数で出力すると、 Array ( [job] => 1 [num] => 25 [0] => Array ( [job] => 1 [num] => 25 ) ) というふうに続きますが、1つもデータがないところに関してはそもそも値を引っ張って来れないので、出力もされません。 もう少しいろいろと試してみます。お礼が遅くなりました。ありがとうございます。

回答No.1

DB を読み終わった後に、配列を最初から最後まですべてチェックして null を 0 に置き換えてやればよいのでは? あるいは、最初に配列のすべての要素の値を 0 で初期化してから DB を 読み込んでやればどうですか? あと、気になった点を1つ。 テーブルの列 NUM は仕事の数なのですよね? で、SQL 文で仕事の総数を出そうとしているのですよね? (違ったら以下は気にしないでください) NUM が常に 1 ならば問題ないのですが、そうでないのなら、 $sql = "SELECT job, SUM(NUM) as num FROM org GROUP BY job"; になるような気がするのですが・・・

wwwa-ara
質問者

お礼

ありがとうございます。 $sql = "SELECT job, SUM(NUM) as num FROM org GROUP BY job"; このコードを試してみたのですが、ちょっとうまくいかないみたいで。配列の値をチェックしてNULL値に0を置き換えてやるという方法を模索してみます。 ありがとうございます。

関連するQ&A

  • phpのmysql_fetch_arrayに該当する関数はありますか?

    以下のようなphp、MySQLのセレクト文は perlだとどのようになるのでしょうか? $sql="SELECT abc,xyz FROM table "; $res=mysql_query($sql,$con) or die("データベースを検索できませんでした。 mysql_error(); "); $i=0; while($row=mysql_fetch_array($res)) { $abc[$i]=$row['abc']; $xyz[$i]=$row['xyz']; $i++; }

    • ベストアンサー
    • Perl
  • mysql_fetch_array の速度について

    DBに入れたアクセスログの集計で困ったことがあります。 phpMyAdmin でSQLを作成し実行すると、1秒で済むのですがPHPにして、ブラウザからアクセスすると5分以上かかります。ちなみにアクセスログの行数は10万行ほど。 問題のPHPのコードは下記です。 -- $sql = 'SELECT path, COUNT(path)AS cnt FROM `logs` ' . ' WHERE `path` LIKE \'/news.php?id=%\' ' . ' AND TO_DAYS(NOW()) - TO_DAYS(date) <= 7' . ' GROUP BY path ' . ' ORDER BY `cnt` DESC ' . ' LIMIT 0 , 3'; $res = mysql_query($sql,$dbh) or die(mysql_error()); while ($row = mysql_fetch_array($res)) { echo $row[path]; echo "(".$row[$cnt].")<br>"; } -- mysql_fetch_array のところが問題なのかなと考えております。 お分かりになる方、是非アドバイスをお願いします。

    • 締切済み
    • 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
  • mysql_fetch_arrayとテンプレートの使い方

    データベースからランダムに取り出した3つのデータがあります。 取り出したデータにはそれぞれid、name、ageのデータが入っています。 $rs = mysql_query("select * FROM table order by Rand() LIMIT 0,3;",$con); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $tpl->assign(array( id => $rec[id], name => $rec['name'], age => $rec[age] )); } これだと1種類のデータが3つ連続して表示されてしまいました。 3種類のデータを全部表示するにはどのようにしたらよいのでしょうか? テンプレート(?)の使い方がよく分かっていないので検討違いのことをしている気がしますがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MYSQLとPHPによって取得する多次元配列

    はじめてご質問させていただきます。 現在以下のようなテーブルが3つあります。 [ tbl1 ] | tbl1Key | title | | 1 | a | | 2 | b | | 3 | c | | 4 | d | [tbl2] | tbl2Key | tbl1Key | tbl3Key | | 1 | 2 | 2 | | 2 | 3 | 1 | | 3 | 3 | 4 | | 4 | 1 | 3 | [tbl3] | tbl3Key | value | | 1 | aaa | | 2 | bbb | | 3 | ccc | | 4 | ddd | 上記のデータソースを元に以下のような結果を得たいと考えています。 array( array( 'tbl1Key'=>1, 'title'=>'a', 'values' => array( array( 'tbl3Key'=>3, value='ccc' ) ), array( 'tbl1Key'=>2, 'title'=>'b', 'values' => array( array( 'tbl3Key'=>2, value='bbb' ) ), array( 'tbl1Key'=>3, 'title'=>'c', 'values' => array( array( 'tbl3Key'=>1, value='aaa'), array( 'tbl3Key'=>4, value='ddd' ) ), array( 'tbl1Key'=>4, 'title'=>'d', 'values' = > array( array( 'tbl3Key'=> , value='' ) ) ) この場合phpによって $sql = ("select * from `tbl1`"); $res = mysql_query( $sql, $con ); $data = array(); while( $row =mysql_fetch_object( $res ) ) { $sql = ("select * from `tbl3` inner join `tbl2` on `tbl3`.`tbl3Key`=`tbl2`.`tbl3Key` where `tbl2`.`tbl1Key`={$row->tbl1Key}"); $res2 = mysql_query( $sql, $con ); $tmp = array(); while( $r = mysql_fetch_object( $res2 ) ) { $tmp[] = $r->value; } $row->values = $tmp; $data = $row; } まずtbl1のデータをすべて取り、配列dataに格納する段階で、tbl1と関連付けされたtbl3のvalueを取得し配列tblに格納、それを新しい要素として配列dataにプッシュしている状況です。 こういったテーブルでいうところの1カラムのみ配列で返すような事は、こういったループを使って以外にも可能なのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • mysql_fetch_array取得結果を2行で

    mysql_fetch_arrayで取得した結果を、 2行で表示させるには、どうすればよいでしょうか? ※そのままだと横に長くなり過ぎるので、 複数行にして、テーブル横幅を抑えたい、です。 <現状> mysql_connect("localhost", "mysql_user", "mysql_password") or die("Could not connect: " . mysql_error()); mysql_select_db("mydb"); $result = mysql_query("SELECT * FROM mytable"); $body .= "<table> <tr> <th>ID</th> <th>氏名</th> </tr>"; while ($row = mysql_fetch_array($result)) { $body .= "<tr> <td></td> <td>".$row[name]."</td> <td>".$row[preid]."</td>

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

    はじめまして、お世話になります。 php/SQL共に初心者レベルなのですが、ご指導ください。 mysql_fetch_array のSQLの結果が複数件ある場合なのですが、 参考書通り $sql = "select * from category where parent_id = '0' order by category_name"; $result = mysql_query( $sql ); while ( $category = mysql_fetch_array( $result ) ) echo "<a href=result.php?category_id=${category['category_id']}>${category['category_name']}</a> | "; とコーディングしたものの、 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/アカウント名/public_html/アカウント名/topbar.php on line 26 とエラーが表示され困っています。 参考書にもエラーの詳細など記載れていませんし、他の媒体での色々と答えを探してはみたものの意味がわかりません。 解る方いらっしゃいましたら是非ご指導ください。 宜しくお願いします。

    • 締切済み
    • PHP
  • 空だと思ったのに・・・

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

    • ベストアンサー
    • PHP
  • fetch_array文

    データベースから取得した値をHTMLにて 出力する際に同じ値がある場合、1つのみ 表示する事は可能でしょうか? データベース 1.西武ライオンズ 2.西武ライオンズ 3.巨人 4.巨人 while($row = mysql_fetch_array($result)){ print "<td>".$row["id"]."<td>"; print "<td rowspan=\"2\">".$row["team"]."</td>"; } 値を配列に格納し、array_uniqueで出来るかと思ったのですが 出来ず…。 希望出力 1. 西武ライオンズ 2. 巨人 お分かりになる方がいらっしゃいましたら ご教授お願い致します。

    • 締切済み
    • PHP
  • mysql_fetch_assocについて

    お世話になります。 MySQLからデータを取得してWEBで表示するために mysql_fetch_assoc関数を使っています。 SQL文を作って、mysql_query関数で実行させ、 結果をmysql_fetch_assocの引数にしているのですが 作成するSQL文に”DESC”を追加すると何も表示されなくなります。 (mysql_num_rowsでデータ数は取得できているのでSQL自体は有効の ようです) SQL文から”DESC"を取ると、mysql_fetch_assocの結果も正常に表示 されるのですが、どうしても降順に並べ替えて表示したいので 解決方法をご存知の方ご教授ください。よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう