MySQLでselectした結果の配列がおかしい - PHPプロ!Q&A掲示板

2469

  • 0P

MySQLでselectした結果の配列がおかしい

質問日時 / 2010年1月20日 12:56    回答数 / 1件

Questioner:  orpheus  このエントリーをはてなブックマークに追加 

キーワード / PHP    MySQL    SELECTの結果   

MysqlでSELECTしたデータを配列に格納しています。
結果をvar_dumpで出力してみましたが意図しない結果になり困っています。

ソースを載せますので皆さんアドバイスお願いします。

index.php
-----------------
require 'db.php';

$ra="";
$table="sample_tbl";
$columns = array(
'id' => "id",
'name' => "name",
);
$where="id = 1";
$opt = "order by date";

func_select(&$ra,$table,$columns,$where,$opt);

//結果の配列を表示
var_dump($ra);

db.php
-----------------
function func_select(&$ra,$table,$cols=array(),$where='',$opt=''){

global $C;
$a=array();

if(count($cols)>0){
$sql="SELECT ".implode(',',$cols);
if(strlen($table)>0){
$sql.=" FROM ".$table;
}
if(strlen($where)>0){
$sql.=" WHERE ".$where;
}
if(strlen($opt)>0){
$sql.=" ".$opt;
}
$sql.=";";
$rs=mysql_query($sql);
if(!$rs){
echo 'DB error.(u1)';
if($C['debug_mode']){
echo htmlspecialchars($sql);
}
return false;
}
$nors=mysql_num_rows($rs);
if($nors>0){
while($a[]=mysql_fetch_array($rs)){
}
$ra=$a;
}
return $nors;
}else{
return false;
}
}

結果の配列は以下です。今回は1件しか取得されていないので$norsには1が入ります。
array(2) { [0]=> array(4) { [0]=> string(1) "1" ["id"]=> string(1) "1" [1]=> string(11) "著者[性]" ["name"]=> string(11) "著者[性]" } [1]=> bool(false) }

添え字が違うだけの同じ値が格納されてしまっています。
二次元配列になってしまっているし。

なぜなんでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix書いたコードのとおりに動いてますね。 >array(2)

回答一覧

並び替え:

A01
answerershimix [1月20日 15:28] (最終編集:1月20日 15:42)

書いたコードのとおりに動いてますね。

>array(2) { [0]=> array(4) { [0]=& gt; string(1) "1" ["id"]=> string(1) "1" [1]=> string(11) "著者 [性]" ["name"]=> string(11) "著者[性]" } [1]=> bool(false) }

$ra[0]は列名と数字添え字が2つずつの計4つです( [0]=& gt; string(1) "1" ["id"]=> string(1) "1" [1]=> string(11) "著者 [性]" ["name"]=> string(11) "著者[性]" )、また$ra[1]はwhileを抜け出たときのfalseが1つだけ入っています(これがあるので二次元配列になったんですね)。

列名のみ(もしくは数字添え字のみ)を取得したければ、mysql_fetch_arrayにMYSQL_ASSOC(もしくはMYSQL_NUM)を指定してください。指定無しはMYSQL_BOTH(数字添え字の配列と列名の連想配列の両方)です。

また、最後のfalseを消したければ、whileを抜けるときには$a[]に追加しないようにしてください。
  1. while($row = mysql_fetch_array($rs)){
  2.     $a[] = $row;
  3. }



>二次元配列になってしまっているし。

2件以上なら確実に二次元配列になりますから、たとえ1件でも同様に(二次元配列で)返す方がいいと思います。なので(最後のfalseを配列に入れないなら)、
  1. $ra = array();
  2. while($row = mysql_fetch_array($rs)){
  3.     $ra[] = $row;
  4. }
  5.  
  6. return count($ra);
でいいように思います。count($ra)で返せば $nors=mysql_num_rows($rs); は不要です。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)