- ベストアンサー
whileとarrayについてデータベースの全データを出力する方法
- 下記のコードで、データベースには4つのデータがあるにもかかわらず、最新の4つ目のデータしか表示されません。どのようにすれば解決するでしょうか?
- ツリー構造で、データをすべて出力することが第一目的なのでこの形にこだわりたいと思っています。
- PHPのwhileループと配列を使用することで、データベースから取得したデータを順に表示することができます。しかし、現在のコードでは最新の4つ目のデータのみが表示されてしまいます。解決策はありますか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
とりあえずこれで直ると思います。 while ($post = mysql_fetch_assoc($date)) { $logs = array( array($post['thread_detail_id'], $post['parent_thread_detail'], $post['body'],'<a href ="thread.php?id='.$post['thread_id'].'">編集</a>', '削除'), ); } ↓ $logs = array(); while ($post = mysql_fetch_assoc($date)) { $logs[] = array($post['thread_detail_id'], $post['parent_thread_detail'], $post['body'],'<a href ="thread.php?id='.$post['thread_id'].'">編集</a>', '削除'), ); } (蛇足) $sql = "SELECT * FROM thread_detail WHERE thread_id = $id"; これだと $id は未定義になりますが、実際のコードではたぶん外部から受け取った値を使っていますよね?この埋め込み方だと「SQLインジェクション」という攻撃が簡単に成立します。データベースのデータを外部から全消去したり盗んだりたいていのことが出来ます。 Wikipedia - SQLインジェクション http://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3 これを防ぐには ・整数であれば明示的にキャストする ・専用の関数を使ってエスケープを行う ・プレースホルダを使う などの方法がありますが、3番目のプレースホルダを利用する方法が最も推奨されます。プログラマのミスで脆弱性を作り込む可能性が一番低いからです。ところが、「mysql_*」系の関数ではこの機能がサポートされていません。おまけに、PHP5.5以降ではこの関数自体が非推奨として、公式マニュアルでデカデカと警告されています。今からコードを書くのであれば、この関数を使用している参考書やWebサイトは参考にしてはいけません。 PHP Manual - mysql_query http://www.php.net/manual/ja/function.mysql-query.php 現在はPDOクラスかMysqliクラスが用いられることが多いです。 PHP Manual - PHP Data Objects http://www.php.net/manual/ja/book.pdo.php PHP Manual - MySQL 改良版拡張モジュール http://www.php.net/manual/ja/book.mysqli.php 以下で詳しく解説しています。 Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 どちらもオブジェクト指向に対する理解が少しは必要なので、全くなじみが無ければここから軽く勉強してください。 Qiita - PHPオブジェクト指向入門 http://qiita.com/mpyw/items/41230bec5c02142ae691 そのほか読んでおいてほしい記事↓ Qiita - $_GET, $_POSTなどを受け取る際の処理 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea
お礼
本当に度重ね、ありがとうございます! To_aru_User様のおかげ、完成が格段に早くなりました。 また、参考ページも拝読させていただきます!!