掲示板のフォーム画面より、<inputy type="text" name="name">などにより、名前やコメントを入力し、送信(投稿)した際受け取り側のプログラムで、$name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS);とし、filter_input関数を通して、受け取る際、「FILTER_SANITIZE_SPECIAL_CHARS」を指定した場合としなかった場合で、違いがあるのか検証する為、「FILTER_SANITIZE_SPECIAL_CHARS」を指定し、「echo $name;」とした場合と「FILTER_SANITIZE_SPECIAL_CHARS」を指定せずに、「echo $name」した場合を比較してみたのですが、違いが出ませんでした。送信する値の入力側では、「>」や「<」を入力した為、「>」は「<」と「<」は「>」と出力されると思ったのですが、値が置き換わって出力されることはありませんでした。
具体的な、入力側のプログラムが以下の「bbs.php」になります
php
1<?php 2require_once 'config.php'; 3require_once 'function.php'; 4session_start(); 5$page = 0; 6$num = 10; 7if(isset($_GET['page']) && $_GET['page'] > 0){ 8 $page = intval($_GET['page']) -1; 9} 10 11try{ 12 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 13 $stmt = $db->prepare(" 14 SELECT id, name,title,comment,date FROM post_2 ORDER BY date DESC LIMIT :page, :num 15 "); 16 17 $page = $page * $num; 18 19 $stmt->bindValue(':num',$num,PDO::PARAM_INT); 20 $stmt->bindValue(':page',$page,PDO::PARAM_INT); 21 $stmt->execute(); 22 $db_data = $stmt->fetchAll(PDO::FETCH_ASSOC); 23 24 //var_dump($result); 25 //exit(); 26 27 28 29}catch(PDOException $e){ 30 $e->getMessage(); 31} 32 33?> 34 35 36<!DOCTYPE html> 37 38<html> 39<head> 40 <meta charset="utf-8"> 41 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 42 <title>掲示板</title> 43 <meta name="viewport" content="width=device-width, initial-scale=1"> 44 <link rel="stylesheet" type="text/css" media="screen" href="main.css"> 45 <script src="main.js"></script> 46 47</head> 48<body> 49 <h1>掲示板</h1> 50 <form action="write.php" method="post"> 51 <p>名前:<input type="text" name="name"></p> 52 <p>タイトル:<input type="text" name="title"></p> 53 <textarea name="comment" cols="50" rows="5"></textarea> 54 <p>削除パスワード(数字4桁):<input type="text" name="password"></p> 55 <input type="submit"value="書き込む"> 56 </form> 57 <hr> 58 <?php 59 foreach($db_data as $row): 60 $title = $row['title'] ? $row['title'] : '(無題)'; 61 ?> 62 <p>名前:<?= h($row['name']) ?></p> 63 <p>タイトル:<?= h($title) ?></p> 64 <p>本文:<?= h($row['comment']) ?></p> 65 <p> 66 日付:<?= h($row['date']) ?> 67 <form action="delete.php" method="post"> 68 <input type="password" name="delete_password"> 69 <input type="hidden" name="id" value="<?php echo $row['id']?>"> 70 <input type="submit" value="削除"> 71 </form> 72 </p> 73 74 <?php endforeach; 75 76 77 try{ 78 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 79 $stmt = $db->prepare(" 80 SELECT COUNT(id) FROM post_2; 81 "); 82 83 $stmt->execute(); 84 85 }catch(PDOExeption $e){ 86 $e->getMessage(); 87 } 88 89 $page_id = $stmt->fetchColumn(); 90 $max_page = ceil($page_id / $num); 91 92 echo '<p>'; 93 94 for($i = 1; $i <= $max_page; $i++){ 95 96 echo '<a href="bbs.php?page=' . $i . '">' . $i . '</a> '; 97 } 98 echo '</p>'; 99 100 ?> 101 102</body> 103</html>
受け取り側の、「write.php」は以下のコードとなります
php
1<?php 2 3require_once 'function.php'; 4require_once 'config.php'; 5 6$err = []; 7 8if(!empty($_POST)){ 9 10$name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS); 11echo $name; 12PHP_EOL; 13 14 $comment = filter_input(INPUT_POST,'comment'); 15 echo $comment; 16 exit(); 17 $password = filter_input(INPUT_POST,'password'); 18 $title = filter_input(INPUT_POST,'title'); 19 20 if(!$name){ 21 $err['name'] = '名前が入力されていません'; 22 } 23 24 if(!$comment){ 25 26 $err['comment'] = '本文が入力されていません'; 27 28 } 29 30 if(!$password){ 31 32 $err['password'] = 'パスワードが入力されていません'; 33 34 }elseif(!preg_match("/^[0-9]{4}$/",$password)) 35 { 36 $err['password'] = 'パスワードは数字4文字で入力してください'; 37 } 38 39 if(!$title){ 40 41 if(strlen($title) > 255) 42 { 43 $err['comment'] = '本文は255文字以内で入力して下さい'; 44 } 45 46 } 47 48 if(empty($err)){ 49 50 $password = password_hash($password,PASSWORD_DEFAULT); 51 52 try{ 53 54 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 55 $stmt = $db->prepare(" 56 INSERT INTO post_2 (name,title,comment,date,password) 57 VALUES(:name,:title,:comment,now(),:password) 58 "); 59 60 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 61 $stmt->bindValue(':title',$title,PDO::PARAM_STR); 62 $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); 63 $stmt->bindValue(':password',$password,PDO::PARAM_STR); 64 $stmt->execute(); 65 header('Location:bbs.php'); 66 exit(); 67 }catch(PDOException $e){ 68 69 die('エラー:' . $e->getMessage()); 70 71 } 72 73 } 74 75} 76 77?> 78<!DOCTYPE html> 79<html> 80<head> 81 <meta charset="utf-8"> 82 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 83 <title>Page Title</title> 84 <meta name="viewport" content="width=device-width, initial-scale=1"> 85 <link rel="stylesheet" type="text/css" media="screen" href="main.css"> 86 <script src="main.js"></script> 87</head> 88<body> 89 <?php if(count($err) >= 1): ?> 90 <h3>エラー!</h3> 91 92 <?php foreach($err as $value): ?> 93 94 <p> 95 <?=$value?> 96 </p> 97 98 <?php endforeach; ?> 99 100 <?php endif;?> 101</body> 102</html> 103
上記疑問につきまして、ご助言頂けましたら幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/09 03:15
2019/04/09 10:53
2019/04/09 11:12