フォーム(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 太郎 男
となってしまいます。
これを解決するには、どのようにすればよろしいのでしょうか?
No.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 したかが重要なので、その辺の情報を記述した方がいいと思います。
非常に分かりやすい解説ありがとうございます。
まさにおっしゃる通りで、
$smarty = new Smarty;
while( $row = mysql_fetch_assoc( $result ) ) {
$smarty->append( 'row', $row );
}
と多次元配列にしてしてあげることで解決できました。
本当、ありがとうございました!
No.1
- 回答日時:
smartyはよくわかりませんので的外れな回答だったら申し訳ないですが
whileで表示する方は、各データを順次読みながら表示していますが
foreachでまわしても$rowは1レコード分しか保持していないのでは?
whileでデータを保持するなら
$rows[]=$row;
的な処理で全データを保持する処理が前段階で必要な気がします。
回答ありがとうございます。
$smarty = new Smarty;
while( $row = mysql_fetch_assoc( $result ) ) {
$smarty->append( 'row', $row );
}
とすることで解決できました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- MySQL 【MySQL】本当に困っているので、助けてください。よろしくお願いします。 3 2023/06/03 14:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBで検索結果に該当するデータ...
-
文字化けが解決できません。お...
-
アラートでyes noを作りたいです。
-
mysql_insert_id()の使い方
-
checkboxクリック時、SQLを実行...
-
phpでの更新ができません。
-
mysqlテーブルから一つレコード...
-
mysqlから取得した配列をカンマ...
-
smartyでMySQLから連想配列取り...
-
SELECT結果から動的にコンボボ...
-
実行時エラー3131 FROM 句の構...
-
MySQLでデータベースにデータin...
-
VBAをつかってクエリの情報を抽...
-
<VB.NET>INSERT文でDBにデータ...
-
ResultSetインターフェイスでの...
-
テキストボックスに入れた内容...
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
日またぎの計算
-
csvをDBへ読み込んだら、NULLが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで[]の使い方について
-
エクセルVBAについて
-
DBで検索結果に該当するデータ...
-
アラートでyes noを作りたいです。
-
phpでmysqlを使ってデータベー...
-
checkboxクリック時、SQLを実行...
-
dbに登録したデータをphpのプル...
-
PHP+MySQLでの配列のinsert文に...
-
pg_queryの結果を2回とりだす...
-
検索結果($_POST)が2ページ目...
-
PHPについてなのですが未定義の...
-
VBA初心者です。
-
sortable ギブアップです…助け...
-
PEAR::DBで取得したデータで処...
-
DBのデータを表示させたい
-
データベース表示結果のデザイン
-
PHP 勤務時間の合計を出したい
-
mySQLからデータを取り出す
-
PHP と MySQL でテーブルの行数...
-
連想配列、オブジェクト配列の...
おすすめ情報