質問: 0 ) {//行数が0だったら echo "投稿はまだありません";//投稿はまだありませんと表示する } else {//その他の場合 foreach ( $select as $row ) { //ループして表示 echo "No:" . h( $row[ 'num' ] ) . " " . "名前: " . h( $row[ 'name' ] ) . "" . h( $row[ 'comment' ] ) . "" . "".h( $row[ 'date' ] ) . ""; } } } catch ( PDOException $e ) { print( "表示エラー:" . $e->getmessage() ); die(); } ?> ```
回答: passeordでいいんか? posswordもあるけど? タイプミスや文法エラーを検出できるエディタを活用することを強くおすすめしたい。 使えない場合は、気になる箇所を文字列検索してタイプミスを目視で発見できるよう頑張る。 どんなエディタがいいかは、色んな人がいろんなところで記事にしているから自分で探すこと。 (自分に合う合わないもあるから、いくつか並行して試してみるとヨサゲ) そもそも、delete_noやedit_noを送信する削除/編集フォームに、 なぜpasswordを送信するinput要素を置かないのか。 かつ、 なぜpasswordだけajax利用で送信しようとしているけど、 phpでの処理待受できる構造になってないので、 この場面ならajaxをあやふやに使うんじゃなくて、 そもそも、delete_noやedit_noを送信するフォームに、 passwordを送信するinput要素を置いてみるのを試すこと。 ajaxは止める。 もしかして delete_noやedit_noを送信する削除/編集フォーム送信後に、 確認画面を作ろうとしている? だとするとそれをajax駆使して別途パスワード送信するのはピンとこない。 すべての処理を一つのphpに封じ込めて作ろうとして 処理の分岐や構造がわからなくなって破綻し始めているように見える。 一度、処理ごとにhtmlとphpを全部バラして作ってみて、 それがうまく機能するようになってからまとめ直すやり方を おすすめしたい。 例えば、 ▼投稿フォーム兼投稿データ表示画面 ▼投稿結果表示画面(からリダイレクトして投稿フォーム兼投稿データ表示画面に戻るとか) ▼削除フォーム画面 ▼削除確認画面 ▼更新フォーム画面 ▼更新確認画面 くらいに機能単位で分割して組み立てれば、他の処理に惑わされず作りたい機能に集中できるはず。 teratailにいろんな回答者が居て、 これまで質問者さんが掲げた質問を表層的に捉えて簡単に回答して、 それを全部取り入れると「船頭多くして船山に登る」になってしまっているのかもしれない。 取り入れるかどうか、組み込むかどうか、設計書レベルから見直しすることを勧めたい。 ``` $insert_sql = "INSERT INTO toko( name, comment, date, password ) VALUES ( '$replace_name', '$replace_comment', '$date', '$password' )"; ``` 外部から与えられる値を格納した変数を、 直接SQL文内で展開するのは、 SQLインジェクションの問題を孕むから止めような。 そして、複数行に渡るSQLを記述するなら、 ヒアドキュメント構文使おうぜ。 ``` $insert_sql = <<prepare( "SELECT * FROM toko WHERE num = '$edit_no'" ); ``` ここも、せっかくのprepareが台無し。 ``` $edit_select = $db->prepare( "SELECT * FROM toko WHERE num = :edit_no" ); ``` とかする。 もちろん、bindValue()でバインドしてからexecute()すること。 ``` $delete_select = $delete_select->fetch( PDO::FETCH_ASSOC ); //データ取得 $delete_num = $delete_select['num']; if( !empty( $delete_num ) ){ ``` この箇所、fetch()失敗していたら`$delete_select`はFALSEになるよね。 `$delete_select`がFALSEかどうかを判定し、その後に`$delete_select['num']`を判定するようにしたいところ。 SELECT文以外のSQLを実行する箇所、トランザクション処理していないの、こわい。 簡易掲示板だから、扱うテーブルが一つで、データ構造の主従関係とか想定しなくていいから、 この場では大した問題にならないかもしれないけど、 複数のテーブルを扱うような場面に遭遇したときにテーブルAに書き込んでテーブルBに書き込むときにエラーが出たりしたときは、 一連の処理を「なかったこと」にすることも必要になる。 そのための練習も兼ねてbeginTransaction()とか駆使してみるといいよ。 tryブロックの外で`$insert_sql`だけ定義して、 他のSQL文はifブロック内の局所変数っていうあべこべさ。 そして、 後の処理で使うかどうかわからないけど冒頭で片っ端からPOST受信データを変数に突っ込んでるのも気になる。 処理の分岐判定に必要なパラメータだけ最初に解釈して、 更新処理なら更新処理に必要なもの、 削除処理なら削除処理に必要なものっていうふうに局所的にやったほうが 全体の見通し風通しが良くなる気がする。