whileとarrayについてデータベースの全データを出力する方法

このQ&Aのポイント
  • 下記のコードで、データベースには4つのデータがあるにもかかわらず、最新の4つ目のデータしか表示されません。どのようにすれば解決するでしょうか?
  • ツリー構造で、データをすべて出力することが第一目的なのでこの形にこだわりたいと思っています。
  • PHPのwhileループと配列を使用することで、データベースから取得したデータを順に表示することができます。しかし、現在のコードでは最新の4つ目のデータのみが表示されてしまいます。解決策はありますか?
回答を見る
  • ベストアンサー

whileとarrayについて

下記のコードで、出力した結果、データベースには4つのデータがあるにもかかわらず、最新の4つ目のデータしか表示されません。 ツリー構造で、データをすべて出力することが第一目的なのでこの形にこだわりたいと思っています。 どのようにすれば解決するでしょうか? 【コード】 <?php $sql = "SELECT * FROM thread_detail WHERE thread_id = $id"; $date = mysql_query($sql,$link); 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>', '削除'), ); } foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } print $no .'<br>'. $kiji . $edit . $delete . '<br>'; listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<nobr>&nbsp<ul></nobr>'; } print '<li>' . $no .'<br>'. $kiji . $edit . $delete . '<br>' . '</li>'; listchild($logs, $no); } if ($ct > 0) { print '&nbsp</ul>'; } } ?>

  • PHP
  • 回答数1
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.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

kokoko69
質問者

お礼

本当に度重ね、ありがとうございます! To_aru_User様のおかげ、完成が格段に早くなりました。 また、参考ページも拝読させていただきます!!

関連するQ&A

  • 変数について

    下記のような例の場合は、どのようにすれば【意図した結果】のようになりますでしょうか? 【コード】 <?php $post['thread_id'] = 1; $thread_id = $post['thread_id']; $logs = array( array(1, 0, $post['thread_id'], '<a href ="thread.php?id=$thread_id">編集</a>', '削除'), ); foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } print $no .'<br>'. $kiji . $edit . $delete . '<br>'; listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<nobr>&nbsp<ul></nobr>'; } print '<li>' . $no .'<br>'. $kiji . $edit . $delete . '<br>' . '</li>'; listchild($logs, $no); } if ($ct > 0) { print '&nbsp</ul>'; } } 【結果:編集のリンク先】 「thread.php?id=$thread_id」 【意図した結果】 「thread.php?id=1」

    • ベストアンサー
    • PHP
  • phpのif文について

    下記の表現をした際に、必ずif文がelseの方に流れてしまいます。 そこで条件式をいろいろ書き換え試したところ、 if($_SESSION['user_id'] = $employee_id) ↓ if($_SESSION['user_id'] == $employee_id) に書き換えた際にだけ、elseに流れず、 ==の関係が成り立ちます。 その際に変更しているのは、条件式だけで他のコードを変更していません。 どのように変更すれば、正しく条件式が機能しますか? <?php $sql = "SELECT * FROM thread_detail WHERE thread_id = $id"; $date = mysql_query($sql,$link); $logs = array(); while ($post = mysql_fetch_assoc($date)) { $logs[] = array($post['thread_detail_id'], $post['parent_thread_detail'], '<a href="thread.php?id='.$post['thread_id'].'&res='.$post['thread_detail_id'].'">'.$post['post_date'],$post['employee_id'].'</a>', $post['body'],'<a href="thread.php?id='.$post['thread_id'].'&edit='.$post['thread_detail_id'].'">編集</a>', '<a href="remove_thread.php?id='.$post['thread_id'].'&delete='.$post['thread_detail_id'].'"'.'onclick="return confirm(\'本当に削除しますか?\');">削除</a>'); } foreach ($logs as list($no, $oya, $create_date, $employee_id, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } if($_SESSION['user_id'] == $employee_id) { print $create_date. $employee_id .'<br>'. $kiji . $edit . $delete . '<br>'; } else { print $create_date. $employee_id .'<br>'. $kiji . '<br>'; } listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $create_date, $employee_id, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<ul>'; } if($_SESSION['user_id'] == $employee_id) { print '<li>' .$create_date.$employee_id.'<br>'. $kiji . $edit . $delete . '<br>'.'<br>' . '</li>'; } else { print '<li>' .$create_date.$employee_id.'<br>'. $kiji . '<br>'.'<br>' . '</li>'; } listchild($logs, $no); } if ($ct > 0) { print '</ul>'; } } ?>

    • 締切済み
    • PHP
  • array中の表現

    下記コードを使用した結果、このようなエラーがかえってきました。 似たような質問になりますが、よろしくお願いします。 【コード】 array($post['thread_detail_id'], $post['parent_thread_detail'], '<a href="thread.php?id='.$post['thread_id'].'&res='.$post['thread_detail_id'].'">'.$post['post_date'].'</a>', $post['body'],'<a href="thread.php?id='.$post['thread_id'].'&edit='.$post['thread_detail_id'].'">編集</a>', '<a href="remove_thread.php?id='.$post['thread_id'].'&delete='.$post['thread_detail_id'].'" '.onclick="return confirm('本当に削除してもよろしいでしょうか?');".'>削除</a>'); 【エラー】 Parse error: syntax error, unexpected '{', expecting ')' in C:\xampp\htdocs\study.localhost\re_company_bbs\thread.php on line 61

    • ベストアンサー
    • PHP
  • このプログラムの改善点を教えてください!

    このプログラムの改善点を教えてください! <?php print ログインID: $name = $_POST[ID]; echo $name; ?> <br/> <?php print ニックネーム: $name = $_POST[name]; echo $name; ?> <br/> <?php print パスワード: $name = $_POST[password]; echo $name; ?> <br/> <?php if(isset($_POST[sex]) && ($_POST[sex] == 男性 || $_POST[sex] == 女性)){ print 性別: print $_POST[sex]; ?> <br/> <?php if($_POST[blood type]<>){ print 血液型: print $_POST[blood type]; ?> <br/> <?php print 生年月日; print 年; $name = $_POST[year]; ?> <?php print 月; $name = $_POST[month]; echo $name; ?> <?php print 日; $name = $_POST[day]; echo $name; ?> <br/> <?php print メールアドレス(PC); $name = $_POST[address1]; echo $name; ?> <br/> <?php print メールアドレス(携帯); $name = $_POST[address2]; echo $name; ?> <br/> <?php print 郵便番号; $name = $_POST[zip code]; echo $name: ?> <br/> <?php if($_POST[prefecture]<>){ print 都道府県; print $_POST[prefecture]; } ?> <?php print 住所; $name = $_POST[text]; echo $name; ?> <br/> <?php if(isset($_POST[fhobby])){ $fhobby = implode('と',$_POST[fhobby]); print 趣味; } ?> <br/> 早めの回答と詳しい解説をお願いします><

  • while()から得られるインデックス..

    お世話になります。 whileでSQLデータベースから抽出した一覧(list.php)から、htmlのフォームのラジオボタンを使って SQL上のデータを修正したいと考えていますが、うまくいきません。 list.php------------------------------------------- 1 <? 2 $db = mysql_connect('localhost','user','pass'); 3 $db_name = 'db'; 4 $TBL = "test"; 5 $str_sql = "SELECT * FROM {$TBL}"; 6 $rs = mysql_query($str_sql,$db); 7 $cnt =mysql_num_rows($rs);//データの個数 8 ?> 9  10 <form action="record.php" method="post" name="form1"> 11 <table> 12 <? while($arr_record = mysql_fetch_assoc($rs)){?> 13  <tr> 14  <td> 15  <input name="disp[]" type="radio" value="<? print $arr_record[id];?>"<? if($arr_record[disp] == 1){print" checked=\"checked\"";}?> /> 16  <input name="id[]" type="hidden" value="<? print $arr_record[id];?>"> 17  </td> 18 </tr> 19 <? }?> 20 </table><br /><br /> 21 <input type="hidden" name="cnt" value="<? print $cnt;?>"> 22 <input type="submit" name="Submit" value="Submit" /> 23 </form> list.php ここまで---------------------------------- record.php----------------------------------------- 1 <? 2 $cnt = $_REQUEST['cnt'];//データの個数 3 4 for($i=0;$i<=($cnt-1);$i++){ 5 $disp = $_POST['disp'][$i]; 6 $id = $_POST['id'][$i]; 7 8 if($disp == $id){$disp = 1;}else{$disp = 0;} 9 10 $str_sql = "UPDATE {$TBL} SET disp='{$disp}' WHERE id='{$id}'"; 11 mysql_query($str_sql,$db); 12 } 13 ?> record.php ここまで------------------------------- list.php15行目の <input name="disp[]" type="radio" .. /> は、 record.php5行目の $disp = $_POST['disp'][$i]; で[0][1][2][3]..と値を取得できるものと考えておりますが ここが取得できていないようです。 $disp = $_POST['disp'][0]; ↑これだけは、正しく値が取得できるのですが、[1]以降は取得できていません。 record.php6行目の $id = $_POST['id'][$i];は、[0][2][3]..と取得できているため while文や for文の間違いではないと思うのですが・・。 初心者から本を見ながらの独習のため、基礎的な間違いもあるかと思います。 もう2日も悩んでいます。先輩方よろしくお願いします!!

    • ベストアンサー
    • PHP
  • DELETE構文

    今、PostgreSQLの中にあるデータを 削除しようとしていますが、構文がDELETE構文が正しくなく 上手く削除することができせん。 環境→WindowsXP register_globals=offです。 ※フォームの部分は、文字制限の為、省略させて下さい。 画面構成 //ここにPostgreSQLから取得されたデータが //乗っています。 ID[入力欄] Name[入力欄] Score[入力欄] (削除ボタン) 構文 //PostgreSQLに接続 $conn = pg_pconnect("user=postgres password=grjtf dbname=mytbl"); //登録データを削除する if(isset($_POST["action"]) && $_POST["sign"] == '一行削除') { //IDが書かれていた場合 if($_POST["id"]) { //データを削除する $sql3="DELETE FROM mytb(id) WHERE $_POST['id'] = ('{$_POST['id']}')"; //データベースに問い合わせて、クエリを実行する pg_query($conn,$sql3); //成功メッセージ print "データを一件削除しました。<br>"; } else { //失敗メッセージ print "IDが書かれていないため、削除できません。<br><br>"; } }

    • 締切済み
    • PHP
  • POST送信で送信はできるのですが、趣味が出てきません

    POST送信で送信はできるのですが、趣味が出てきません 実行結果がこちらです。 新規登録内容確認 ログインID:****** ニックネーム:setuna パスワード:****** 生年月日:1991年1月9 日. メールアドレス(PC):*******@gmail.com メールアドレス(携帯):*******@gmail.com 郵便番号:***-**** 都道府県:鹿児島県 この内容でいいですか? プログラムがこのような感じです。 <?php print "ログインID:"; $name = $_POST["ID"]; echo $name."<br/>"; print "ニックネーム:"; $name = $_POST["name"]; echo $name."<br/>"; print "パスワード:"; $name = $_POST["password"]; echo $name."<br/>"; if(isset($_POST["sex"]) && ($_POST["sex"] == "男性" || $_POST["sex"] == "女性")){ print "性別:"; print $_POST["sex"]; } if($_POST["blood type"]<>""){ print "血液型:"; print $_POST["blood type"]; } print "生年月日:"; $name = $_POST["year"]; echo $name; print "年"; $name = $_POST["month"]; echo $name; print "月"; $name = $_POST["day"]; echo $name."<br/>"; print "日.<br>"; print "メールアドレス(PC):"; $name = $_POST["address1"]; echo $name."<br/>"; print "メールアドレス(携帯):"; $name = $_POST["address2"]; echo $name."<br/>"; print "郵便番号:"; $name = $_POST["zip_Scode"]; echo $name."<br/>"; if($_POST["prefecture"]<>""){ print "都道府県:"; print $_POST["prefecture"]; } $name = $_POST["text"]; echo $name."<br/>"; if(isset($_POST["Sfhobby"])){ $Sfhobby = implode('と',$_POST["Sfhobby"]); print "趣味:"; } echo $Sfhobby."<br>"; ?> 詳しい回答を待っています!

    • 締切済み
    • PHP
  • whileループの中でフォーム入力を入れられますか?(ループする処理メニュー選択の書き方)

    whileループの中にフォーム入力を入れたphpスクリプトを、ブラウザから指定しても何の動きもありません。 操作メニューをフォーム入力によって指定し、処理が終わればまた戻ってくる構造を、1つのセッションの中で行いたい場合はどのように記述すれば適切でしょうか。 実験したスクリプトは次のものです。 なお、このスクリプトからwhile文を削除した場合の動作は正常でした。 phpのバージョンは4.3.10です。 <?php // // form入力が入っているwhileループの実験 // while ($_POST['select_num'] != 2) { if (!isset($_POST['select_num'])) { $location_next = $_SERVER["PHP_SELF"]; print "<form method=\"post\" action\"{$location_next}\">"; print "<input type=\"radio\" name=\"select_num\" value=\"1\">選択1"; print "<br><br>"; print "<input type=\"radio\" name=\"select_num\" value=\"2\">中止"; print "<br><br>"; print "<input type=\"submit\" name=\"sbmt1\" value=\"OK\">"; print "</form>"; } else { print ("select_num = " . $_POST['select_num']); print "<br>"; } // if文の終了 } // while文の終了 print ("select_num = " . $_POST['select_num']); print "<br>"; print "whileループを終了しました<br>"; ?>

    • ベストアンサー
    • PHP
  • 変数の比較

    <FORM action="<?php echo $PHP_SELF; ?>" method="POST" enctype="application/x-www-form-urlencoded"> <INPUT TYPE="HIDDEN" NAME="action" VALUE="post"> ユーザーID<INPUT TYPE="TEXT" NAME="u_id" SIZE="12"> パスワード<INPUT TYPE=password NAME="passwd" SIZE="12"> <INPUT TYPE="SUBMIT" NAME="Submit" VALUE="認証スタート"> <?php $DBSERVER ="hogehoge"; $DBUSER ="hogehoge"; $DBNAME ="hogehoge"; $DBPASSWORD ="hogehoge"; $con = mysql_connect( $DBSERVER , $DBUSER, $DBPASSWORD ); $selectdb = mysql_select_db($DBNAME,$con); if( $_POST['action'] == "post" ) { $id = $_POST['u_id']; $pass = $_POST['passwd']; $rst = mysql_query( "select * from UserInfo where name = '$id'", $con); print "<BR>"; print $id."<BR>"; print $pass."<BR>"; while( $col = mysql_fetch_row($rst) ) { print "<BR>"; print $col[0]."<BR>"; print $col[1]."<BR>"; print $col[2]."<BR>"; } } if( $pass == $col[2] ) { print "<BR>"; print "パスの一致<BR>"; }else{ print "パスが違います<BR>"; } ?> </FORM> 未だに判りません。 if( $pass == $col[2] )で 値が一緒でも、そうじゃなくても "パスの一致"が表示されます。 $pass = $_POST['passwd']; ちゃんと↑ので値は取得出来ているのは確認できており print $col[2]."<BR>"; で$passと違う文字列が入っていることも確認しましたが、パスの一致が表示されます。 再度の質問ですが、かなり困っています。 御教授お願い致します。

    • ベストアンサー
    • PHP
  • php5.2.9に変更後に不具合について

    php初心者です。 レンタルサバ―なのですが、php4.4.7からphp5.2.9に変更後うまくいかなくて困っています。 header("Location: http://○○○/top.php");がうまく飛びません。 ページを実行すると真っ白の画面になってしまいます。 以前のバージョンですと、問題なく動いていました。 下記を見てください。 どうしたらよいのでしょうか? <?php mysql_query('SET NAMES ujis'); require_once( "function.php" ); session_start(); if ( $_REQUEST[ "SUBMIT" ] != "" ) { if ( ( $_POST[ "VALUE_ID" ] != "" ) && ( $_POST[ "VALUE_PW" ] != "" ) ) { $k_id = $_POST[ "VALUE_ID" ]; $k_pw = $_POST[ "VALUE_PW" ]; $con=mysql_connect('aaa','aaa','aaa') or die("MySQL接続エラー: ".mysql_error()); mysql_select_db('aaa',$con); $sql= "select * from あああ where id='$k_id' and pw='$k_pw'"; $result=mysql_query($sql); $rows=mysql_num_rows($result); if($rows==1){ while($row=mysql_fetch_array($result)){ $d_id = $row["id"]; $d_pw = $row["pw"]; } } } } if ( !isset( $_SESSION[ "D_ID" ] ) ) { $_SESSION[ "D_ID" ] = ""; } $_SESSION[ "D_ID" ] = $d_id; if ( !isset( $_SESSION[ "D_PW" ] ) ) { $_SESSION[ "D_PW" ] = ""; } $_SESSION[ "D_PW" ] = $d_pw; if ( !isset( $_SESSION[ "K_ID" ] ) ) { $_SESSION[ "K_ID" ] = ""; } $_SESSION[ "K_ID" ] = $k_id; if ( !isset( $_SESSION[ "K_PW" ] ) ) { $_SESSION[ "K_PW" ] = ""; } $_SESSION[ "K_PW" ] = $k_pw; if ( ( $_SESSION[ "D_ID" ] == "" ) || ( $_SESSION[ "D_PW" ] == "" ) ) { print( "<br><center>○○○○○○○○<br>" ); print( "<br>○○○○○○○○○○○○○○○○<br>" ); print( "<br>○○○○○○○○<br>" ); print( "<br><a href=\"index.html\">[ BACK ]</a></center>" ); exit(); }elseif( CheckID_PW( $_SESSION[ "K_ID" ], $_SESSION[ "K_PW" ], $_SESSION[ "D_ID" ], $_SESSION[ "D_PW" ] ) == false ) { print( "<br><center>○○○○○○○○<br>" ); print( "<br><center>○○○○○○○○○○○○○○○○<br>" ); print( "<br><center>○○○○○○○○" ); print( "<br><br><a href=\"index.html\">[ BACK ]</a></center></body>" ); } else {header("Location: http://○○○/top.php");} ?>

    • 締切済み
    • PHP

専門家に質問してみよう