ある課題に取り組んでいて簡易掲示板を作っています。
テキスト保存のものを作った後、MySQL保存に変えたものを作っています。
php5.2.4(指定による)
mysqlのサーバー情報は伏せてあります。
jsでパスワードの入力を求め、その値をPHP側の check_password に格納したいです。
jsで変数check_password を作り、その変数内でpromptを書いています。(これが正しいのかどうかも判断出来ません)(107行目から)
動作としては、「本当に削除しますか」と表示し「yes」ならパスワードの入力を求めます。
そこまでは動作出来ています。(編集ではすぐパスワードを求めます)
その後パスワードをPHPに渡すところが出来ません。
jsから直接値を渡せないこと、AJAXを使えばなんとか出来そうと言うところまでは来ましたが、どの様に書けば望んだ動作がなされるのかわかりません。
色々探し回りましたが、まだ理解が追いついていません。
どの様に書けばよろしいでしょうか?
渡せたかどうかを見るためにcheck_passwordをvar_dumpしています。(154行目)
php
1<?php 2ini_set( "display_errors", 1 ); 3error_reporting( E_ALL ); 4//変数の定義 5$name = filter_input( INPUT_POST, "name" ); //投稿者の名前 6$comment = filter_input( INPUT_POST, "comment" ); //投稿したコメント 7$delete_no = filter_input( INPUT_POST, "delete_no" ); //削除指定番号 8$edit_no = filter_input( INPUT_POST, "edit_no" ); //編集指定番号 9$edit_decision = filter_input( INPUT_POST, "edit_decision" ); //投稿と編集の判別用のhidden送信 10$password = filter_input( INPUT_POST, "password" ); //送信するpassword 11$check_password = filter_input( INPUT_POST, "check_password" ); //照合するパスワード 12$date = date( "Y-m-d H:i:s" ); //投稿日時 13$replace_search = array( "\r\n", "\r", "\n" ); //置き換えのための改行コードの検索 14$replace = array( "<<改行win>>", "<<改行mac>>", "<<改行unix>>" ); //改行コードを置き換える文字 15$replace_name = str_replace( $replace_search, $replace, $name ); //改行を置き換えた名前 16$replace_comment = str_replace( $replace_search, $replace, $comment ); //改行を置き換えられたコメント 17$nothing_message = "";//番号がない時のmessageの初期化 18//MySQL接続情報 19$servername = ""; 20$username = ""; 21$serverpassword = ""; 22$dbname = ""; 23//編集時の表示用名前とコメントの初期化 24$edit_name = ""; 25$edit_comment = ""; 26$edit_num = ""; 27$decision_no = ""; 28//messageの初期化 29$edit_message = ""; 30$edit_nothing_message = ""; 31$num_message = ""; 32$delete_message = ""; 33//書き込み内容のsql文 34$insert_sql = "INSERT INTO toko( 35name, comment, date, password 36) VALUES ( 37'$replace_name', '$replace_comment', '$date', '$password' 38)"; 39 40//データベースに接続 41try { 42 $db = new PDO( "mysql:dbname=$dbname;host=$servername;charset=utf8mb4", $username, $serverpassword, [ 43 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 44 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 45 ] ); 46 //投稿機能 47 if ( !empty( $name ) && !empty( $comment ) && empty( $edit_decision ) ) { 48 $insert = $db->query( $insert_sql ); //書き込みsql実行 49 //リロードし二重書き込み防止 50 header( 'Location: keijiban_mysql.php', true, 303 ); 51 exit; 52 } 53 //削除機能 54 if ( !empty( $delete_no ) ) { 55 //削除指定番号の行のデータ取得のsql文 56 $delete_select = $db->prepare( "SELECT * FROM toko WHERE num = '$delete_no'" ); 57 $delete_select->execute(); //実行 58 $delete_select = $delete_select->fetch( PDO::FETCH_ASSOC ); //データ取得 59 $delete_num = $delete_select['num']; 60 if( !empty( $delete_num ) ){ 61 $delete_sql = "DELETE FROM toko WHERE num='$delete_no'"; 62 $delete = $db->query( $delete_sql ); 63 $delete_message = '削除されました'; 64 }else{ 65 $delete_message = "<span class='akaji'>".'該当する番号はありません'."</span>"; 66 } 67 } 68 //編集番号指定 69 if ( !empty( $edit_no ) ) { 70 $decision_no = $edit_no;//判定用の変数定義 //編集指定番号の行のデータ取得のsql文 71 $edit_select = $db->prepare( "SELECT * FROM toko WHERE num = '$edit_no'" ); 72 $edit_select->execute(); //実行 73 $edit_select = $edit_select->fetch( PDO::FETCH_ASSOC ); //データ取得 74 $edit_name = $edit_select[ 'name' ]; //テーブル内の取り出したnameの定義 75 $edit_comment = $edit_select[ 'comment' ]; //テーブル内の取り出したcommentの定義 76 $edit_num = $edit_select[ 'num' ];//テーブル内の取り出したnumの定義 77 if ( !empty( $edit_num ) ){ 78 $edit_message = $edit_no . '番の投稿を編集します'; 79 } else { 80 $edit_nothing_message = "<span class='akaji'>".'該当する番号はありません'."</span>"; 81 } 82 } 83 84 85 //編集機能 86 if ( !empty( $name ) && !empty( $comment ) && !empty( $edit_decision ) ) { //名前とコメントと編集判定が送信されたら 87 88 //編集のSQL文 89$update = "UPDATE toko SET name = :name, comment = :comment WHERE num = :num"; 90 $update = $db->prepare($update); 91 $params = array(':name' => $replace_name, ':comment' => $replace_comment, ':num' => $edit_decision); 92 $update->execute($params); 93 } 94} catch ( PDOException $e ) { 95 print( "エラー:" . $e->getmessage() ); 96 die(); 97 //リロードし二重書き込み防止 98 header( 'Location: keijiban_mysql.php', true, 303 ); 99 exit; 100} 101?> 102<!doctype html> 103<html lang="ja"> 104<head> 105<meta charset="utf-8"> 106<title>簡易掲示板MySQL保存版</title> 107<script> 108 //削除時の確認 109 window.addEventListener('DOMContentLoaded', function(){ 110 document.querySelector('#delete_button').addEventListener('click',function(e){ 111 if(confirm("本当に削除しますか?")){//本当に削除しますか?と表示しyes,noの選択肢を出す 112 var check_password = prompt("パスワードを入力してください");//yesならパスワード入力を求める 113 }else{ 114 alert('キャンセルされました');//「キャンセルされました」 と表示 115 e.preventDefault();//キャンセルの実行(defaultの動作を妨害) 116 } 117 }); 118 }); 119 120//編集と削除時のパスワードの入力 121 window.addEventListener('DOMContentLoaded', function(){ 122 document.querySelector('#edit_button').addEventListener('click',function(e){ 123 if(!prompt("パスワードを入力してください")){ 124 alert('キャンセルされました'); 125 e.preventDefault(); 126 } 127 }); 128 }); 129 130//PHPへ値を渡す 131 $.ajax ( { 132 type: 'POST', 133 url: 'keijiban_mysql.php', 134 data: { 135 'check_password' : check_password, 136 }, 137 success: function(data) { 138 alert(data); 139 } 140 }); 141</script> 142<style> 143.akaji { 144 color : red; 145} 146.komoji { 147 font-size: 0.8em; 148} 149</style> 150</head> 151<body> 152<?php 153 var_dump($check_password); 154 //XSS対策 155 function h( $str ) { 156 return nl2br( htmlspecialchars( $str, ENT_QUOTES, 'UTF-8' ) ); 157 } 158//改行の置き換え 159$replace_seach = array( "<<改行win>>", "<<改行mac>>", "<<改行unix>>" ); //改行の置き換え文字の検索 160$replace = array( "\r\n", "\r", "\n" ); //改行コードへの置き換え 161 162?> 163<!--投稿フォーム--> 164<form method="post" > 165 <label for="name">お名前<span class="akaji">【必須】</span></label> 166 <?php 167 if ( !empty( $edit_no ) ) { 168 echo $edit_message; 169 } 170 ?> 171 <br> 172 <input type="hidden" name="edit_decision" value="<?php 173 echo $decision_no; 174 ?>" > 175 <input type="text" name="name" id="name" required="required" value="<?php 176 echo $edit_name; 177 ?>" > 178 <br> 179 <label for="comment">コメント<span class="akaji">【必須】</span></label><br> 180 <textarea name="comment" cols="30" rows="3" id="comment" required="required"> 181 <?php 182 echo $edit_comment; 183 ?> 184 </textarea><br> 185 <label for="possword">パスワード<span class="akaji">【必須】</span></label><br> 186 <input type="password" name="password" id="password" required="required"> 187 <br> 188 <input type="submit" value=<?php 189 if(!empty( $edit_no ) ){ 190 echo '編集'; 191 } else { 192 echo '投稿'; 193 } 194 ?> > 195</form> 196<br> 197<!--削除番号指定用フォーム--> 198<form method="post" name="delete"> 199 <label for="delete_no">削除対象番号</label> 200 <?php 201 if( !empty( $delete_no ) ) { 202 echo $delete_message; 203 } 204 ?> 205 <br> 206 <input type="number" name="delete_no" id="delete_no" required="required"><br> 207 <input type="submit" value="削除" name="btn" id="delete_button"> 208</form> 209 <br> 210<!--編集番号指定用フォーム--> 211<form method="post"> 212 <label for="edit_no">編集対象番号(半角)</label> 213 <?php 214 if ( !empty( $edit_no ) ) { 215 echo $edit_nothing_message; 216 } 217 ?> 218 <br> 219 <input type="number" name="edit_no" id="edit_no" required="required"><br> 220 <input type="submit" value="送信" id="edit_button"> 221</form> 222<br> 223 224<?php 225//投稿内容の表示 226 try { 227 //テーブルの行数取得 228 $sql = 'select count(*) from toko'; 229 $count = $db->query( $sql ); 230 $count = $count->fetchColumn(); 231 $select = "SELECT * FROM toko"; //テーブルデータの取得のクエリ 232 $select = $db->query( $select ); //クエリの実行 233//投稿がない場合「投稿はまだありません」と表示する 234 if ( $count == 0 ) {//行数が0だったら 235 echo "<p>投稿はまだありません</p>";//投稿はまだありませんと表示する 236 } else {//その他の場合 237 foreach ( $select as $row ) { //ループして表示 238 echo "<span class='komoji'>No</span>:" . h( $row[ 'num' ] ) . "  " . 239 "<span class='komoji'>名前</span>: " . h( $row[ 'name' ] ) . "<br>" . 240 h( $row[ 'comment' ] ) . "<br>" . 241 "<span class='komoji'>".h( $row[ 'date' ] ) . "</span><br>"; 242 } 243 } 244 245 } catch ( PDOException $e ) { 246 print( "表示エラー:" . $e->getmessage() ); 247 die(); 248 } 249 250?> 251</body> 252</html> 253
回答1件
あなたの回答
tips
プレビュー