- 締切済み
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などの値を渡したいと思います。 どのようなコードを書けば値を渡せるのでしょうか。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- irija_bari
- ベストアンサー率73% (70/95)
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 にでも置換してください。
- irija_bari
- ベストアンサー率73% (70/95)
ANo. 1 です。 SQL 文は、列の名前を job と num だとして、 $sql = "SELECT job, SUM(num) as total_num FROM org GROUP BY job"; だと、どうでしょうか? 「うまくいかない」という内容(エラーなど)を書いてきてもらえると アドバイスできますよ。
- irija_bari
- ベストアンサー率73% (70/95)
DB を読み終わった後に、配列を最初から最後まですべてチェックして null を 0 に置き換えてやればよいのでは? あるいは、最初に配列のすべての要素の値を 0 で初期化してから DB を 読み込んでやればどうですか? あと、気になった点を1つ。 テーブルの列 NUM は仕事の数なのですよね? で、SQL 文で仕事の総数を出そうとしているのですよね? (違ったら以下は気にしないでください) NUM が常に 1 ならば問題ないのですが、そうでないのなら、 $sql = "SELECT job, SUM(NUM) as num FROM org GROUP BY job"; になるような気がするのですが・・・
お礼
ありがとうございます。 $sql = "SELECT job, SUM(NUM) as num FROM org GROUP BY job"; このコードを試してみたのですが、ちょっとうまくいかないみたいで。配列の値をチェックしてNULL値に0を置き換えてやるという方法を模索してみます。 ありがとうございます。
お礼
ありがとうございます。 どちらでも、 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つもデータがないところに関してはそもそも値を引っ張って来れないので、出力もされません。 もう少しいろいろと試してみます。お礼が遅くなりました。ありがとうございます。