プロが教える店舗&オフィスのセキュリティ対策術

データ(テーブル名:os)
id,name_a,name_b
1,マイクロ,ソフト
2,マッキン,トッシュ
3,リ,ナックス

というテーブルがあり
<?php
$sql = mysql_query("SELECT * FROM os WHERE name_b LIKE 'ソフト'");
while($ck = mysql_fetch_assoc($sql)){
}
?>

とした場合
whileの中では、echo $ck[name_a]; とすればこの場合「マイクロ」と表示されますが
whileの外でも表示させたい場合はどうすれば効率がいいでしょうか?

一つは、whileの中で$a = $ck[name_a]; $b = $ck[name_b]・・・と入力すればいいのですが
フィールド数が結構な数ある為に効率が悪いです。

また、
list($ck2[],$ck2[],…) = $assoc;
というようにlistを使ってもつらつらと書かなければなりません。

もしくは、mysql_fetch_assocをrowに書き換えて
for($i=0;$i<count($ck);$i++){
$ck2[$i] = $ck[$i];
}
としてしまうか、
現在htmlで作業しているのですが
<?php
while(){
?>
<?php echo $ck[name_a]; ?>
<?php
}
?>
がいいかな。と思ったりするのですが
なにぶん素人の考えなので、実際に仕事等で利用されている方は
どのようにして使用しておられるのか教えて頂けると幸いです。

宜しくお願いします。

A 回答 (1件)

こうやって配列にため込んで再利用してみては?



<?PHP
$sql="SELECT * FROM os WHERE name_b LIKE 'ソフト'";
$res=mysql_query($sql);
while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
$a[]=$row;
}
print_r($a);
?>

SQLの戻り値データが一つしかなく、フィールド名(もしくは任意の別名)の
配列におさめればいいのであれば

<?PHP
$sql="SELECT * FROM os WHERE name_b LIKE 'ソフト'";
$res=mysql_query($sql);
while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
extract($row);
}
print $name_a;
?>

でもよいですが、extractは致命的なバグにつながる可能性も秘めているので
お勧めはできません。
またSELECT * は避けた方がいいです。可能な限りフィールド名を列記してください。

SELECT id,name_a,name_b FROM ・・・
    • good
    • 0
この回答へのお礼

回答、有難う御座います。

お陰様で自分が求めていた処理を施せるようになりました。

配列を二次元化するなんて考えもしませんでした。
勉強になります。

extractはとても便利な関数なんですね。
GETやPOST等の信頼出来ないデータは使用しない方がいい旨が
少し調べた所記載されていたので
多次元配列とextractを使いわけながら使用していきたいと思います。

後、「*」も了解しました。
フィールド長がかなりあったので手抜きしていたのですが、
これからは列記していくことにします。

解りやすい回答、有難う御座いました。

お礼日時:2011/02/03 10:59

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