編集機能にバリデーションをかけたい
1. やりたいことや目的、概要
お問い合わせフォームの編集画面(edit.php)から編集完了(update.php)後のデータの受け渡しができるようにしたい。(解決済)
https://qiita.com/yopisan/questions/9a7f5dd295a64bbe17c3
⇩
しかし編集画面からidの引き渡しができたと思いテストをしたところ、お問い合わせフォームで(contact。php)でできていたバリデーションが編集画面ではかからずに通ってしまいます。
必須項目は以下になります(contact.php)
2. 試したこと、または試そうと考えていること
edit.phpの44行目をvalidate.phpに変えたりしてみたが特にバリデーションはかからず。
header("Location: db_open.php");
他にもformactionのURLをvalidate.phpとするも編集ができず
どこをどうすればいいのかわからずなためどなたかご教授願います
4. 該当コード
edit.php
<!DOCTYPE html>
<html lang="ja">
<?php
session_cache_limiter('none');
//セッション接続
session_start();
$err['name'] = '';
$err['kana'] = '';
$err['phone'] = '';
$err['address'] = '';
$err['question'] = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$result = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($result['name'] === '') {
$err['name'] = 'err';
} elseif (10 < mb_strlen($result['name'], 'UTF-8')) {
$err['name'] = 'err';
}
if ($result['kana'] === '') {
$err['kana'] = 'err';
} elseif (10 < mb_strlen($result['kana'], 'UTF-8')) {
$err['kana'] = 'err';
}
if ($result['phone'] === '') {
true;
} elseif (!preg_match('/^[0-9]+$/', $result['phone'])) {
$err['phone'] = 'err';
}
if ($result['address'] === '') {
$err['address'] = '';
} elseif (!preg_match('/^[0-9a-z_.\/?-]+@([0-9a-z-]+\.)+[0-9a-z-]+$/', $result['address'])) {
$err['address'] = 'err';
}
if ($result['question'] === '') {
$err['question'] = 'err';
}
if (empty($err['name']) && empty($err['kana']) && empty($err['phone']) && empty($err['address']) && empty($err['question'])) {
$_SESSION['form'] = $result;
header("Location: update.php");
exit;
}
}
session_destroy();
//DB接続
include "db_open.php";
$dbh = db_open();
//データ取得&表示
$stmt = $dbh->prepare('SELECT * FROM cafe.contacts WHERE id=:id');
$id = $_GET['id'];
$stmt->bindValue(':id', (int)$id, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="base.css">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
</head>
<body>
<!--header-->
<!-- <script src="index.js"></script> -->
<?php include "layouts/header.php"; ?>
<?php session_start() ?>
<!--header-->
<div class="form-wrapper">
<div class="error">
<h1>
<?php
if(isset($_SESSION["texts"])){
foreach($_SESSION["texts"] as $error){
echo $error."<br>";
}
}?>
</h1>
</div>
<div class="form">
<div class="form-title">
<h1 style="text-align:center;">お問い合わせ編集 </h1>
</div>
<div class="form-main">
<div class="back">
<h2>下記の編集項目をご記入の上送信ボタンを押してください</h2>
</div>
<p>送信頂いた件につきましては、当社より折り返しご連絡を差し上げます。<br>
なお、ご連絡までに、お時間を頂く場合もございますので予めご了承ください。<br>
<span>*</span>は必須項目となります。</p>
<input type="hidden" id="id" name="id" value="<?php echo $result['id']; ?>">
<form action="db_open.php" method="POST">
<div class="form-contents">
<div class="form-content">
<h3>氏名<span>*</span></h3>
<input type="text" name="name" value="<?php echo $result['name']; ?>">
<?php if ($err['name'] === 'err') : ?>
<p class="error">
<font color=red>氏名は、必須入力です。10文字以内でご入力ください</font>
</p>
<?php endif; ?>
</div>
<div class="form-content">
<h3>フリガナ<span>*</span></h3>
<input type="text" name="kana" value="<?php echo $result['kana']; ?>">
<?php if ($err['kana'] === 'err') : ?>
<p class="error">
<font color="red">フリガナは、必須入力です。10文字以内でご入力ください。</font>
</p>
<?php endif; ?>
</div>
<div class="form-content">
<h3>電話番号</h3>
<input type="text" name="phone" value="<?php echo $result['phone']; ?>">
<?php if ($err['phone'] === 'num') : ?>
<p class="error">
<font color="red">電話番号は0-9の数字でのご入力ください。</font>
</p>
<?php endif; ?>
</div>
<div class="form-content">
<h3>メールアドレス<span>*</span></h3>
<input type="text" name="address" value="<?php echo $result['address']; ?>">
<?php if ($err['address'] === 'err' || $err['address'] === 'address') : ?>
<p class="error">
<font color="red">メールアドレスは、正しくご入力ください。</font>
</p>
<?php endif; ?>
</div>
</div>
<div class="back">
<h2>お問い合わせ内容をご記入ください<span>*</span></h2>
</div>
<textarea name="question" class="inputQuestion"><?php echo $result['question']; ?></textarea>
<?php if ($err['question'] === 'err') : ?>
<p class="error">
<font color="red">お問い合わせ内容は、必須入力です。</font>
</p>
<?php endif; ?>
<input type="submit" value="送 信" class="form-submit" formaction="validate.php" >
</div>
</form>
</div>
</div>
<!--footer-->
<?php include "layouts/footer.php"; ?>
<!--footer-->
</body>
</html>
update.php
<?php
//セッション接続
session_start();
$post = $_SESSION;
// var_dump ($post);
$id = $post[':id'];
$name = $post[':name'];
$kana = $post[':kana'];
$phone = $post[':phone'];
$address = $post[':address'];
$question = $post[':question'];
//URLからの接続禁止
$referer = $_SERVER['HTTP_REFERER'];
$url = "edit.php";
if (!strstr($referer, $url)) {
header("Location: contact.php");
exit;
}
session_destroy();
//DB接続
include "db_open.php";
$dbh = db_open();
//更新
$sql = "UPDATE contacts
SET name=:name,kana=:kana,phone=:phone,address=:address,question=:question
-- SET name='坂本',kana='サカモト',phone='098932535',address='sakamoto@sakamorto',question='コンニチは';
Where id=:id";
try {
$stmt = $dbh->prepare($sql);
$stmt->bindValue(":name", $name, PDO::PARAM_STR);
$stmt->bindValue(":kana", $kana, PDO::PARAM_STR);
$stmt->bindValue(":phone", $phone, PDO::PARAM_STR);
$stmt->bindValue(":address", $address, PDO::PARAM_STR);
$stmt->bindValue(":question", $question, PDO::PARAM_STR);
$stmt->bindValue(":id", $id, PDO::PARAM_INT);
$stmt->execute();
echo "編集が完了しました。" . "<br/>";
echo "<a href='contact.php'>一覧に戻る</a>";
} catch (Exception $e) {
echo "エラーが発生しました:" . ($e->getMessage()) . "<br>";
exit;
}
?>
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>Lesson Sample Site</title>
</head>
<body>
</body>
</html>
お問い合わせフォーム
contact.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="base.css">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<?php include 'layouts/header.php'; ?>
<?php session_start() ?>
<div class="form-wrapper">
<div class="error">
<h1>
<?php
if(isset($_SESSION["texts"])){
foreach($_SESSION["texts"] as $error){
echo $error."<br>";
}
}?>
</h1>
</div>
<div class="form">
<div class="form-title">
<h1 style="text-align:center;">お問い合わせ </h1>
</div>
<div class="form-main">
<div class="back">
<h2>下記の項目をご記入の上送信ボタンを押してください</h2>
</div>
<p>送信頂いた件につきましては、当社より折り返しご連絡を差し上げます。<br>
なお、ご連絡までに、お時間を頂く場合もございますので予めご了承ください。<br>
<span>*</span>は必須項目となります。</p>
<form action="db_open.php" method="POST">
<div class="form-contents">
<div class="form-content">
<h3>氏名<span>*</span></h3>
<input type="text" name="name"
value="<?php
if(!empty($_SESSION["name"])){
echo $_SESSION["name"];
}
?>" placeholder="山田太郎" class="inputName">
</div>
<div class="form-content">
<h3>フリガナ<span>*</span></h3>
<input type="text" name="kana"
value="<?php
if(!empty($_SESSION["kana"])){
echo $_SESSION["kana"];
}
?>" placeholder="ヤマダタロウ" class="inputKana">
</div>
<div class="form-content">
<h3>電話番号</h3>
<input type="text" name="phone"
value="<?php
if(!empty($_SESSION["phone"])){
echo $_SESSION["phone"];
}
?>" placeholder="09012345678" class="inputPhone">
</div>
<div class="form-content">
<h3>メールアドレス<span>*</span></h3>
<input type="text" name="address"
value="<?php
if(!empty($_SESSION["address"])){
echo $_SESSION["address"];
}
?>" placeholder="test@test.co.jp" class="inputAddress">
</div>
</div>
<div class="back">
<h2>お問い合わせ内容をご記入ください<span>*</span></h2>
</div>
<textarea name="question" class="inputQuestion"><?php
if(!empty($_SESSION["question"])){
echo $_SESSION["question"];
}?></textarea><br>
<input type="submit" value="送 信" class="form-submit" formaction="validate.php" >
</form>
</div>
</div>
</div>
<section id=db>
<?php
//DB接続
include "db_open.php";
try {
$dbh = db_open();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$sql = "SELECT * FROM cafe.contacts";
$stmt = $dbh->prepare($sql);
$stmt->execute();
} catch (PDOException $Exception) {
die('接続エラー:' . $Exception->getMessage());
}
?>
<table>
<tr>
<th>システムID</th>
<th>氏名</th>
<th>フリガナ</th>
<th>電話番号</th>
<th>メールアドレス</th>
<th>お問い合わせ</th>
<th>送信日時</th>
</tr>
<?php
$row = filter_input_array(INPUT_POST, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
?>
<tr>
<td><?= $row['id'] ?></td>
<td><?= $row['name'] ?></td>
<td><?= $row['kana'] ?></td>
<td><?= $row['phone'] ?></td>
<td><?= $row['address'] ?></td>
<td><?= nl2br($row['question']) ?></td>
<td><?= $row['created_at'] ?></td>
<td><a href="edit.php?id=<?php echo (int)$row['id']; ?>">編集</a></th>
<td><a href="dele.php?id=<?php echo (int) $row['id']; ?>" onclick="return confirm('本当に削除しますか?')">削除</a></td>
</tr>
<?php
}
$pdh = null;
?>
</table>
</section>
<?php include 'layouts/footer.php'; ?>
<!-- <script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> -->
</body>
</html>
confirm.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="base.css">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<?php
session_start();
$referer = $_SERVER['HTTP_REFERER'];
$url = "contact.php";
if(!strstr($referer,$url)){
header("Location: contact.php");
exit;
}
unset($_SESSION["texts"]);
$_POST = $_SESSION;
?>
<?php include 'layouts/header.php'; ?>
<div class="form-wrapper">
<div class="form">
<div class="form-title">
<h1 style="text-align:center;">お問い合わせ</h1>
</div>
<div class="confirm-group">
<form>
<p class=confirm-text>
下記の内容をご確認の上送信ボタンを押してください<br>
内容を訂正する場合は戻るを押してください。
</p>
<div class="confirm-contents">
<div class="confirm-content">
<h1>氏名</h1>
<h2><?php echo htmlspecialchars($_POST["name"], ENT_QUOTES, 'UTF-8'); ?></h2>
</div>
<div class="confirm-content">
<h1>フリガナ</h1>
<h2><?php echo htmlspecialchars($_POST["kana"], ENT_QUOTES, 'UTF-8'); ?></h2>
</div>
<div class="confirm-content">
<h1>電話番号</h1>
<h2><?php echo htmlspecialchars($_POST["phone"], ENT_QUOTES, 'UTF-8'); ?></h2>
</div>
<div class="confirm-content">
<h1>メールアドレス</h1>
<h2><?php echo htmlspecialchars($_POST["address"], ENT_QUOTES, 'UTF-8'); ?></h2>
</div>
<div class="confirm-content">
<h1>お問い合わせ内容</h1>
<h2><?php echo nl2br(htmlspecialchars($_POST["question"], ENT_QUOTES, 'UTF-8')); ?></h2>
</div>
</div>
<div class="buttons">
<input type="submit" value="送 信" class="confirm-submit" formaction="complete.php">
<input type="submit" value="戻 る" class="confirm-return" formaction="contact.php">
</div>
</form>
</div>
</div>
</div>
<?php include 'layouts/footer.php'; ?>
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</body>
</html>
complete.php
<?php
session_start();
$referer = $_SERVER['HTTP_REFERER'];
$url = "confirm.php";
if(!strstr($referer,$url)){
header("Location: contact.php");
exit;
}
$post = $_SESSION;
session_destroy();
include "db_open.php";
try {
$dbh = db_open();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO contacts (name,kana,phone,address,question)
VALUES (:name, :kana, :phone, :address, :question)";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(":name", $post['name'], PDO::PARAM_STR);
$stmt->bindParam(":kana", $post['kana'], PDO::PARAM_STR);
$stmt->bindParam(":phone", $post['phone'], PDO::PARAM_STR);
$stmt->bindParam(":address", $post['address'], PDO::PARAM_STR);
$stmt->bindParam(":question", $post['question'], PDO::PARAM_STR);
$stmt->execute();
} catch (PDOException $e) {
echo '接続失敗' . $e->getMessage();
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="base.css">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<?php include 'layouts/header.php'; ?>
<section>
<div class="form" style= "margin-top:50px; margin-bottom:50px;">
<div class="form-title">
<h1 style="text-align:center;">お問い合わせ</h1>
</div>
<form action="db_open.php"method="post">
<div class="complete-main">
<p class=complete-text>
お問い合わせ頂きありがとうございます。<br>
送信頂いた件につきましては、当社より折り返しご連絡を差し上げます。<br>
なお、ご連絡までに、お時間を頂く場合もございますので予めご了承ください。
</p>
<div class="top">
<a href="index.php">トップへ戻る</a>
</div>
</form>
</div>
</div>
</section>
<?php include 'layouts/footer.php'; ?>
<script type="text/javascript" src="index.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</body>
</html>
DB接続
db_open.php
<?php
function db_open() :PDO{
$db='mysql:dbname=cafe;host=localhost;charset=utf8';
$db_user='php_user';
$db_password='ykb02566';
$db_opt=[
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES=>false,
];
$dbh = new PDO($db,$db_user,$db_password,$db_opt);
return $dbh;
}
?>
バリデーション
validate.php
<?php
session_start();
foreach($_POST as $key => $val){
$_SESSION[$key] = $val;
}
$error = 0;
$errorText = [];
if(empty($_SESSION["name"])) {
array_push($errorText,"名前を入力してください。");
$error++;
};
if(mb_strlen($_SESSION["name"]) >10) {
array_push($errorText,"名前は10文字以内で入力してください。");
$error++;
};
if(empty($_SESSION["kana"])) {
array_push($errorText,"フリガナを入力してください。");
$error++;
};
if(mb_strlen($_SESSION["kana"]) > 10) {
array_push($errorText,"フリガナは10文字以内で入力してください。");
$error++;
};
if(is_numeric($_SESSION["phone"]) == false && $_SESSION["phone"] !="") {
array_push($errorText,"電話番号は0~9の数字で入力してください。");
$error++;
};
if(empty($_SESSION["address"])) {
array_push($errorText,"メールアドレスを入力してください。");
$error++;
};
if(!empty($_SESSION["address"]) && !preg_match("/.@./",$_SESSION["address"])) {
array_push($errorText,"正しいメールアドレスを入力してください。");
$error++;
};
if(empty($_SESSION["question"])) {
array_push($errorText,"お問い合わせ内容を入力してください。");
$error++;
};
if($error == 0 ){
header("Location:confirm.php");
} else {
unset($_SESSION["texts"]);
foreach($errorText as $text){
$_SESSION["texts"][] = $text;
}
header("Location:contact.php");
}
?>
0