電子書籍の厳選無料作品が豊富!

フォーム(POST)を使ってMySQLにデータを挿入し、
mysql_fetch_assocにて連想配列で取り出して、
whileで表示する場合、

========================================
$sql = "SELECT * hogehoge";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
echo $row["userid"];
echo $row["name"];
echo $row["sex"];
}
========================================
とすれば、MySQLから値を取りだして表示できます。

ただ、それをsmartyに置き換えて以下のようにすると、

========================================
{foreach from=$row item=hoge}
<tr>
<td>{$row.userid}</td>
<td>{$row.name}</td>
<td>{$row.sex}</td>
</tr>
{/foreach}
========================================

同じ値が$rowの値の数だけ返されてしまいます。

例だと、

1 太郎 男
2 花子 女
3 一郎 男
4 陽子 女
5 良子 女

と表示したいものが、

1 太郎 男
1 太郎 男
1 太郎 男

となってしまいます。
これを解決するには、どのようにすればよろしいのでしょうか?

A 回答 (2件)

No.1 の方の回答とほぼ同じ内容ですが



mysql_query の戻り値は
http://www.php.net/manual/ja/function.mysql-quer …
をみると resource となっていますよね。

なので、このリソースから検索結果がダラダラとストリーム的に取得できるわけです。

while の例では、このリソースから1行分取得した結果を、mysql_fetch_assocを使ってカラム名の配列にしているわけですよね。

Smarty の foreach の場合は $row が assign されているのかな?
そこら辺の記述が抜けているので、想像ですが、1件目しか表示されていないので

$smarty = new Smarty;
$row = mysql_fetch_assoc( $result );
$smarty->assign( 'row', $row );

$smarty->dislpay('なんかテンプレート');

のような記述にしていませんか?
これでは、行に関して順次処理していないので、Smarty 側の変数 row は1行目のカラムの配列しか入りませんよね?

なので、

$smarty = new Smarty;
while( $row = mysql_fetch_assoc( $result ) ) {
$smarty->append( 'row', $row );
}

$smarty->dislpay('なんかテンプレート');

のように append メソッドで追加してみてはどうでしょうか?

また、その場合はSmarty側の変数 row は
$row = array(
array( 'userid' => 1, 'name' => '太郎', 'sex' => '男' ),
array( 'userid' => 2, 'name' => '花子', 'sex' => '女' ),
:
);
のような構造になりますから、テンプレート側の記述は

{foreach from=$row item=hoge}
<tr>
<td>{$hoge.userid}</td>
<td>{$hoge.name}</td>
<td>{$hoge.sex}</td>
</tr>
{/foreach}

のような記述になります。
これは PHP でいうところの

$template = <<<EOL
<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
</tr>

EOL;

foreach( $row as $hoge ) {
printf( $template, $hoge['userid'] ,$hoge['name'], $hoge['sex'] );
}

という解釈と同じような意味になります。

Smartyの場合は、どのような構造のオブジェクトを assign したかが重要なので、その辺の情報を記述した方がいいと思います。
    • good
    • 0
この回答へのお礼

非常に分かりやすい解説ありがとうございます。
まさにおっしゃる通りで、

$smarty = new Smarty;
while( $row = mysql_fetch_assoc( $result ) ) {
$smarty->append( 'row', $row );
}

と多次元配列にしてしてあげることで解決できました。
本当、ありがとうございました!

お礼日時:2011/01/06 13:59

smartyはよくわかりませんので的外れな回答だったら申し訳ないですが



whileで表示する方は、各データを順次読みながら表示していますが
foreachでまわしても$rowは1レコード分しか保持していないのでは?

whileでデータを保持するなら
$rows[]=$row;
的な処理で全データを保持する処理が前段階で必要な気がします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
$smarty = new Smarty;
while( $row = mysql_fetch_assoc( $result ) ) {
$smarty->append( 'row', $row );
}
とすることで解決できました!

お礼日時:2011/01/06 14:00

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