質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

5回答

8230閲覧

PHPのセッションを利用したフォームについて

maizo

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2014/10/09 16:26

PHPの入力フォームからセッションを利用してエラーチェックがない場合
次の確認画面にページ遷移させたいと思っています。

POSTでやった場合は、エラーチェック後確認画面へページ推移しましたが
入力データを確認画面で確認できなかったのでセッションでやってみようと考えました。
しかし、上手く動作せずに躓いてしまいました。

下記がソースコードです。

どこがソースコードとして悪いのかが現在分かりません。
何卒宜しくお願い致します。

inform.php

<?php //SESSIONの開始 session_start(); //POSTだったらエラーチェック if($_SERVER["REQUEST_METHOD"] == 'POST') { $error = array(); $name = trim($_SESSION['name']); $len = strlen($name); if(empty($_POST['name'])|| $len == 0) { $error[] = "<p>名称は、必須項目です。</p>"; }elseif($len < 50){ $name = preg_replace('/[ ]+$/u', '', $name); $name = mb_convert_kana($name, 'K', 'UTF-8'); $name = str_replace("\t", '', $$name); $name = str_replace('"','”',$name); }else { $error[] = "<p> 名称は、50文字まで入力ok</p>"; } $kana = trim($_SESSION['kana']); $len = strlen($kana); if(empty($_SESSION['kana']) || $len == 0){ $error[] = "<p>フリガナは、必須項目です。入力して下さい。</p>"; } elseif($len < 50) { $kana = preg_replace('/[ ]+$/u', '', $kana); $kana = mb_convert_kana($kana, 'K', 'UTF-8'); $kana = str_replace("\t", '', $kana); $kana = str_replace('"','”',$kana); }else{ $error[] = "<p>フリガナは、50文字まで入力ok</p>"; } $memo = trim($_SESSION['memo']); $len = strlen($memo); if($len < 1000) { $memo = preg_replace('/[ ]+$/u', '', $memo); $memo = mb_convert_kana($memo, 'K', 'UTF-8'); $memo = str_replace("\t", '', $memo); $memo = str_replace('"','”',$memo); }else{ $error[] = "<p>名称は、1000文字まで入力ok</p>"; } $sq = trim($_SESSION['sq']); $len = strlen($sq); if($len < 50) { $sq = preg_replace('/[ ]+$/u', '', $sq); $sq = mb_convert_kana($sq, 'K', 'UTF-8');s $sq = str_replace("\t", '', $sq); $sq = str_replace('"','”',$sq); }else{ $error[] = "<p>名称は、50文字まで入力ok</p>"; } if(!count($error)) { header("Location:http://locathost/php/confirm.php"); exit(); } } if(count($error)) { foreach ($error as $message) { print($message); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"/> <title>カテゴリの登録</title> </head> <body> <h1>登録フォーム</h1>
<div id="form"> <form method="POST" action="<?=basename(__FILE__)?>"> <p> 名称(必須)<br/> <input type="text" name="name" value="<?=$name?>"> </p> <p> フリガナ(必須)<br/> <input type="text" name="kana" value="<?=$kana?>"> </p> <p> メモ<br/> <textarea name="memo" cols="80" rows="4" value="<?=$memo?>"></textarea> </p> <p> 並び順<br/> <input type="text" name="sq" value="<?=$sq?>"> </p> <p> <input type="submit" value="確認" /> <input type="reset" value="リセット" /> </p> </form> </div> </div>
</body> </html>

confirm.php

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>確認画面</title> </head> <body> <form method="POST" action="./done.php"> <?php

//セッションの開始
session_start();

$dt = date('Y-m-d H:i:m');
$registrar = "administrator";
$update = "administrator";

//エスケープ処理
$name = htmlspecialchars($_POST['$name'],ENT_QUOTES);
$kana = htmlspecialchars($_POST['kana'],ENT_QUOTES);
$memo = htmlspecialchars($_POST['$memo'],ENT_QUOTES);
$sq = htmlspecialchars($_POST['$sq'],ENT_QUOTES);

$_SESSION['name'] = $name;
$_SESSION['kana'] = $kana;
$_SESSION['memo'] = $memo;
$_SESSION['sq'] = $sq;

?>

<?php //次の登録完了画面へ飛ばす print "<p>入力はこれでよろしいですか?</p>"; print "<p>名称:$name</p>"; print "<p>フリガナ:$kana</p>"; print "<p>メモ:$memo</p>"; print "<p>更新日時:$dt</p>"; print "<p>更新者:$registrar</p>"; print "<p>登録日時:$dt</p>"; print "<p>登録者:$update</p>"; print "<p>並び順:$sq</p>"; ?>
<input type="hidden" name="name" value="<?=$name?>"> <input type="hidden" name="kana" value="<?=$kana?>"> <input type="hidden" name="memo" value="<?=$memo?>"> <input type="hidden" name="sq" value="<?=$sq?>"> <input type="submit" value="登録" /> <input type="button" onclick="history.back()" value="戻る" />
</form> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

TamaMyu様、返信遅くなり申し訳ありません。
時間が掛かりましたが、なんとか出来ました。

DBの重複は、SELECTで重複チェックをしてその後rowCountを利用して
重複の場合は、エラーメッセージを出力できました。

セッション変数は、セッションにいれてない変数入れている変数がないように全て
セッションに格納してみました。

連想配列、var_dump関数について有難うございます。

最後になりましたが、アドバイス有難うございました。

投稿2014/12/23 15:06

maizo

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コメントありがとうございます。

memoとsqのセッション変数代入がおかしいとありました。
ソースコードをよく見ていると代入してあったりなかったりでおかしかったので
修正しました。

入力エラー表示もbodyの中で出力するようにしてみました。
入力エラー表示でエラーがない場合処理が終了しているのでここで判定する意味は、ないと
記載があるのですが一般的に入力エラーのチェックは、どこでするのでしょうか?

confirm.phpでのパラメータ埋め込みは、不要と記載がありますが
この埋め込みは、以下の部分でしょうか?
$name = htmlspecialchars($_SESSION['name'], ENT_QUOTES);
$kana = htmlspecialchars($_SESSION['kana'], ENT_QUOTES);
$memo = htmlspecialchars($_SESSION['memo'], ENT_QUOTES);
$sq = htmlspecialchars($_SESSION['sq'], ENT_QUOTES);

このソースコードは、エスケープ処理するために記述しました。

それともパラメータの埋め込みというのは、以下の部分でしょうか?

<form method="GET" action="./done.php"> <?php //次の登録完了画面へ飛ばす print "<p>入力はこれでよろしいですか?</p>"; print "<p>名称:$name</p>"; print "<p>フリガナ:$kana</p>"; print "<p>メモ:$memo</p>"; print "<p>更新日時:$dt</p>"; print "<p>更新者:$registrar</p>"; print "<p>登録日時:$dt</p>"; print "<p>登録者:$update</p>"; print "<p>並び順:$sq</p>"; ?> <input type="hidden" name="name" > <input type="hidden" name="kana" > <input type="hidden" name="memo" > <input type="hidden" name="sq" > <input type="submit" value="登録" /> <input type="button" onclick="history.back()" value="戻る" /> </form>

DBのデータ重複チェックですが、テーブルでは、ユニークキーを設定してあります。
SELECTで重複するデータがないかは、調べて実装したいと思います。

今は、入力フォームから確認画面にデータを持っていき、確認画面で入力されたデータを
表示できるようにしたいのですが、例えば、名称とフリガナを入力して
確認画面に遷移してもこの2つの項目のところが空欄になってしまいます。

issetを利用し未定義なのか未定義ではないのか調べる部分で
現状のソースコードではどのように書くべきかわかりません。

<?php //SESSIONの開始 session_start(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"/> <title>カテゴリの登録</title> </head> <body> <?php //POSTだったらエラーチェック if($_SERVER["REQUEST_METHOD"] == 'POST') { //POSTの場合セッション変数にPOSTパラメータを代入 //name,kana,memo,sqをセッションへ $_SESSION['name'] = $_POST['name']; $_SESSION['kana'] = $_POST['kana']; $_SESSION['memo'] = $_POST['memo']; $_SESSION['sq'] = $_POST['sq'];
$error = array(); $name = trim($_POST['name']); $len = strlen($name); if(empty($_POST['name'])|| $len == 0) { $error[] = "<p>名称は、必須項目です。</p>"; }elseif($len < 50){ $name = preg_replace('/[ ]+$/u', '', $name); $name = mb_convert_kana($name, 'K', 'UTF-8'); $name = str_replace("\t", '', $$name); $name = str_replace('"','”',$name); }else { $error[] = "<p> 名称は、50文字まで入力ok</p>"; } $kana = trim($_POST['kana']); $len = strlen($kana); if(empty($_POST['kana']) || $len == 0){ $error[] = "<p>フリガナは、必須項目です。入力して下さい。</p>"; } elseif($len < 50) { $kana = preg_replace('/[ ]+$/u', '', $kana); $kana = mb_convert_kana($kana, 'K', 'UTF-8'); $kana = str_replace("\t", '', $kana); $kana = str_replace('"','”',$kana); }else{ $error[] = "<p>フリガナは、50文字まで入力ok</p>"; } $memo = trim($_POST['memo']); $len = strlen($memo); if($len < 1000) { $memo = preg_replace('/[ ]+$/u', '', $memo); $memo = mb_convert_kana($memo, 'K', 'UTF-8'); $memo = str_replace("\t", '', $memo); $memo = str_replace('"','”',$memo); }else{ $error[] = "<p>名称は、1000文字まで入力ok</p>"; } $sq = trim($_POST['sq']); $len = strlen($sq); if($len < 50) { $sq = preg_replace('/[ ]+$/u', '', $sq); $sq = mb_convert_kana($sq, 'K', 'UTF-8'); $sq = str_replace("\t", '', $sq); $sq = str_replace('"','”',$sq); }else{ $error[] = "<p>名称は、50文字まで入力ok</p>"; } //入力チェック抜けたらconfirm.phpへリダイレクト if(!count($error)) { header("http://localhost/confirm.php"); exit(); }

}
//POSTでは無い。ここでセッション変数が未定義かチェックする
//未定義だったら初期値(空文字)を代入
if(!isset($_SESSION['name'])) {
$_SESSION['name'] = '';
}elseif(!isset($_SESSION['kana'])) {
$_SESSION['kana'] = '';
}elseif(!isset($_SESSION['memo'])) {
$_SESSION['memo'] = '';
}elseif(!isset($_SESSION['sq'])) {
$_SESSION['sq'] = '';
}

//エラーだったときのメッセージを表示
if(count($error)) {
foreach ($error as $message) {
print($message);
}
}
?>
<h1>登録フォーム</h1>

<div id="form"> <form method="POST" action="<?=basename(FILE)?>"> <p> 名称(必須)<br/> <input type="text" name="name" value="<?=$name?>"> </p> <p> フリガナ(必須)<br/> <input type="text" name="kana" value="<?=$kana?>"> </p> <p> メモ<br/> <textarea name="memo" cols="80" rows="4" value="<?=$memo?>"></textarea> </p> <p> 並び順<br/> <input type="text" name="sq" value="<?=$sq?>"> </p> <p> <input type="submit" value="確認" /> <input type="reset" value="リセット" /> </p> </form> </div> </div>
</body> </html>

inform.phpでsq,memoのセッション代入部分を修正して、入力チェックのエラー部分を
bodyの中に記述しました。

他のphpファイルは、まだ触ってないです。

宜しくお願い致します。

投稿2014/11/01 17:00

maizo

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2014/11/04 08:07

入力エラーがない場合はリダイレクトして処理を終了しているので、それ以降は当然、入力エラーがある場合しかありません。 なので判定してもしなくても同じです。「if(count($error))」の判定が不要ということです。 入力エラーチェックはPOSTされてきた直後にすべきものです。 入力エラーの内容をそのまま戻すためにセッション変数を使うため、セッション変数へ入れるのは入力エラーチェックの前になります。 パラメータ埋め込みと言うのは、formの中の「input type="hidden"」のところです。 ここに入れるということはGETやPOSTで送信されるので、セッションに入っている時にやっても意味がありません。 このinput要素自体が不要です。 連想配列にまとめない場合は、例えば「if(!isset($_SESSION['name']))」の判定だけで、すべてのセッション変数が未定義と判定しても実害はありません。 ちなみにelseifを使ってしまうと初期化が中途半端になるのでバグです。全部ifだけでやるか、上記の代表判定の方法になります。 状況がはっきりしないので、回答できませんが、各PHPファイルのsession_startの直後にvar_dumpなどで$_SESSIONを出力して、中身を確認してみてください。どこで何が入っているかがわからないと、何が起きているかわかりません。
guest

0

あくまで一例ですが、以下のようにするといいと思います。

inform.phpですが、まず、最初に、
POSTの場合に、セッション変数にPOSTパラメータを代入し、
POSTでない場合に、セッション変数が未定義の場合にセッション変数に初期値(空文字列)を代入してください。ここで未定義のものがあった場合は初期アクセスと判断し、入力チェックはスルーしてください。
その後、入力チェックを行ってください。
入力チェックで問題がなければconfirm.phpにリダイレクトしてください。$errorにエラー内容を入れていると思いますが、count($error)で入力エラー有無が判別できると思います。
初期アクセスと入力エラーはそのままフォームを表示します。

confirm.phpでは、POSTパラメータは来ないので、セッション変数をエスケープして画面を表示するだけです。

done.phpでは元々エスケープしていたはずです。bindValueでエスケープされます。HTMLのエスケープとは異なります。htmlspecialcharsなどは使用してはいけません。ただし、何か画面に表示する場合は別途必要になります。
ここもconfirm.phpと同様に、POSTパラメータは来ないので、セッション変数を使用します。

なお、同じセッション変数に代入しているようです。これでは後のもので上書きされてしまうので、パラメータごとに別のセッション変数に代入する必要があります。連想配列にして1つのセッション変数に入れる方法もあります。

投稿2014/10/21 00:28

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2014/10/21 13:04

誤って回答を投稿していたようです。これは無視してください。
guest

0

ご回答ありがとうございます。

done.phpは、以下のようになっています。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>登録完了画面</title> </head> <body> <?php
//DBの設定情報 require_once realpath(__DIR__) . 'DbManager.php';

//DB命令
try {

$dt = date('Y-m-d H:i:m'); $db = getDb(); $registrar = "administrator"; $update = "administrator"; $stt = $db->prepare('INSERT INTO カテゴリ(`ID`,`名称`,`カナ`,`メモ`,`登録日時`,`登録者`,`更新日時`,`更新者`,`並び順`) VALUES(NULL,:name, :kana, :memo,:datetime,:registrar, :datetime, :update, :sq)'); $stt->bindValue(':name', $_POST['name']); $stt->bindValue(':furigana', $_POST['kana']); $stt->bindValue(':memo', $_POST['memo']); $stt->bindValue(':datetime', $dt); $stt->bindValue(':registrar', $registrar); $stt->bindValue(':datetime', $dt); $stt->bindValue(':update', $update); $stt->bindValue(':alignment_sq', $_POST['sq']); $stt->execute(); if($stt->rowCount() > 0) { header('Location:http://localhost/php/inform.php'); exit(); }else{ echo "重複してるから登録できません。"; } $db = NULL;

//例外処理のエラー時の処理
} catch(PDOException $e) {
die("エラーメッセージ:{$e->getMessage()}");

}
?>

<p><a href="view.php">一覧表示</a></p> </body> </html>

view.phpは、以下のようになっております。

<?php //DB接続情報 require_once realpath(__DIR__) . 'DbManager.php'; ?> <html> <head> <title>カテゴリテーブル中身表示</title> <h1>カテゴリ中身表示</h1> </head> <body> <table border="1"> <tr> <th>ID</th><th>名称</th><th>カナ</th><th>メモ</th><th>登録日時</th><th>登録者</th><th>更新日時</th><th>更新者</th><th>並び順</th> </tr> <?php

try {
//DBへの接続の確率
$db = getDb();
//SELECT命令の実行
$stt = $db->prepare('SELECT * FROM カテゴリ');
$stt->execute();

//結果セットの内容を順に出力 while($row = $stt->fetch(PDO::FETCH_ASSOC)) {

?>
<tr>
<td><?php e($row[ID]); ?></td>
<td><?php e($row[名称]); ?></td>
<td><?php e($row[カナ]); ?></td>
<td><?php e($row[メモ]); ?></td>
<td><?php e($row[登録日時]); ?></td>
<td><?php e($row[登録者]); ?></td>
<td><?php e($row[更新日時]); ?></td>
<td><?php e($row[更新者]); ?></td>
<td><?php e($row[並び順]); ?></td>

</tr>
<?php } $db = NULL; }catch(PDOException $e) { die("エラーメッセージ: ($e->getMessage()}"); } ?> </table> </body> </html>

セッションについてですが、BODYタグより上に記述したり修正をしてみます。

宜しくお願い致します。

投稿2014/10/11 03:06

maizo

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2014/10/12 06:48

session_startについては、PHPファイルの先頭に`<?php `と書いて、その直後に記述する必要があります。
maizo

2014/10/14 14:50

コメントありがとうございます。 <?phpの直後にsession_startを記述してみます。
guest

0

セッション変数への格納をするところと、参照するところがつながっていないと思います。
confirm.phpからの遷移先はdone.phpとなっているようですが、このソースはどうなっているでしょうか?

inform.phpでconfirm.phpへのリダイレクトをしているようですが、この時はまだセッション変数への格納をしていないようなので、POSTされたパラメータは消えてしまいます。confirm.phpには何のデータも送られないと思います。

あと別の問題として、session_startはHTTPボディの出力より前にないと動かないと思います。
具体的に言うとconfirm.phpでsession_startより前にHTMLを出力しているので、セッションが消えてしまうと思います。
セッション変数への格納時も、エスケープしてしまうと後の処理で困るのではないかと思います。

投稿2014/10/09 22:13

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2014/10/12 07:01

inform.phpを入力画面、confirm.phpを確認画面、done.phpを完了画面と解釈した場合、以下のような形にした方がいいかもしれません。 inform.php:セッション変数が有効な場合はセッション変数を参照し、無効な場合は初期値にする。HTMLフォームにてconfirm.phpにPOSTパラメータを送信する。 confirm.php:POSTパラメータを参照してセッション変数に格納する。HTMLフォームではPOSTパラメータは送信しない。 done.php:セッション変数を参照してデータベースに登録する。
maizo

2014/10/15 11:20

コメントありがとうございます。 inform.php:セッション変数が有効な場合はセッション変数を参照し、無効な場合は初期値にする。HTMLフォームにてconfirm.phpにPOSTパラメータを送信する。 >こちらに関してですが、セッション変数が有効の場合という条件文は、issetを利用するのですか??また、無効の場合は初期値にするとありますが、この初期値はPOSTに代入したものが初期値なのでしょうか? confirm.php:POSTパラメータを参照してセッション変数に格納する。HTMLフォームではPOSTパラメータは送信しない。 done.php:セッション変数を参照してデータベースに登録する。 >confirm.php:POSTパラメータを参照してセッション変数に格納する。HTMLフォームではPOSTパラメータは送信しない。 done.php:セッション変数を参照してデータベースに登録する。 上記のconfirm.phpとdone.phpですが、POSTパラメ-タの参照とセッション変数の代入はどのようにするのでしょうか?
TaMaMhyu

2014/10/15 12:13

初期値というのは入力画面の初期状態のことで、基本的に空欄のことです。なので、入力項目すべて空欄を初期値とする画面であれば、セッション変数が空でなければ入力項目に設定すると言うことになると思います。ここで言うセッション変数が空でないというのは、confirm.phpから戻ってきた場合になります。逆に空と言うことはinform.phpの初回表示と言うことです。セッション変数が空かどうかは未定義か空文字列なので、empty関数でも判断可能かと思います。
TaMaMhyu

2014/10/15 12:22

confirm.phpでは、 $_SESSION['…'] = $_POST['…']; のような処理をすべての入力項目で先にやっておいて、それから入力チェックやHTML用のエスケープなどをして画面を出します。 done.phpではすべての入力項目を単に$_SESSION['…']からデータベースに持って行きます。 あと、セッション変数が不要になったら消す処理が必要になります。 残ったままでは戻ったりすると前のデータが出てしまいます。 本当はセキュリティ対策などいろいろしなければならないのですが、ここでは割愛します。
maizo

2014/10/19 14:30

コメントありがとうございます。 inform.phpで全て入力チェックを行い、confirm.phpで入力した内容を画面で確認だけする場合は以下のコードで宜しいでしょうか? confirm.php <?php //セッションの開始 session_start(); $_SESSION['name'] = $_POST['name']; $_SESSION['name'] = $_POST['kana']; $_SESSION['name'] = $_POST['memo']; $_SESSION['name'] = $_POST['sq']; $dt = date('Y-m-d H:i:m'); $registrar = "administrator"; $update = "administrator"; //エスケープ処理 $name = htmlspecialchars($_POST['$name'],ENT_QUOTES); $kana = htmlspecialchars($_POST['kana'],ENT_QUOTES); $memo = htmlspecialchars($_POST['$memo'],ENT_QUOTES); $sq = htmlspecialchars($_POST['$sq'],ENT_QUOTES); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>確認画面</title> </head> <body> <form method="POST" action="./done.php"> <?php //次の登録完了画面へ飛ばす print "<p>入力はこれでよろしいですか?</p>"; print "<p>名称:$name</p>"; print "<p>フリガナ:$kana</p>"; print "<p>メモ:$memo</p>"; print "<p>更新日時:$dt</p>"; print "<p>更新者:$registrar</p>"; print "<p>登録日時:$dt</p>"; print "<p>登録者:$update</p>"; print "<p>並び順:$sq</p>"; ?> <input type="hidden" name="name" value="<?=$name?>"> <input type="hidden" name="kana" value="<?=$kana?>"> <input type="hidden" name="memo" value="<?=$memo?>"> <input type="hidden" name="sq" value="<?=$sq?>"> <input type="submit" value="登録" /> <input type="button" onclick="history.back()" value="戻る" /> </form> </body> </html> confirm.phpで先にPOSTをSESSIONに保存してみました。 その後HTMLタグを削除するためにエスケープ処理を行いました。 エスケープ処理の記述方法ですが、$name = htmlspecialchars($_POST['$name'],ENT_QUOTES); のように$nameへPOSTを格納するのか$_SESSION = htmlspecialchars($_POST['$name'],ENT_QUOTES); と記述するべきなのか迷いました。 セッション変数が不要になり破棄する処理ですが、こちらは、DBへ格納後に 破棄するのが一般的ですか? inform.phpの入力画面ですが、現在以下のようになっております。 <?php //SESSIONの開始 session_start(); //POSTだったらエラーチェック if($_SERVER["REQUEST_METHOD"] == 'POST') { $error = array(); $name = trim($_SESSION['name']); $len = strlen($name); if(empty($_POST['name'])|| $len == 0) { $error[] = "<p>名称は、必須項目です。</p>"; }elseif($len < 50){ $name = preg_replace('/[ ]+$/u', '', $name); $name = mb_convert_kana($name, 'K', 'UTF-8'); $name = str_replace("\t", '', $$name); $name = str_replace('"','”',$name); }else { $error[] = "<p> 名称は、50文字まで入力ok</p>"; } $kana = trim($_SESSION['kana']); $len = strlen($kana); if(empty($_SESSION['kana']) || $len == 0){ $error[] = "<p>フリガナは、必須項目です。入力して下さい。</p>"; } elseif($len < 50) { $kana = preg_replace('/[ ]+$/u', '', $kana); $kana = mb_convert_kana($kana, 'K', 'UTF-8'); $kana = str_replace("\t", '', $kana); $kana = str_replace('"','”',$kana); }else{ $error[] = "<p>フリガナは、50文字まで入力ok</p>"; } $memo = trim($_SESSION['memo']); $len = strlen($memo); if($len < 1000) { $memo = preg_replace('/[ ]+$/u', '', $memo); $memo = mb_convert_kana($memo, 'K', 'UTF-8'); $memo = str_replace("\t", '', $memo); $memo = str_replace('"','”',$memo); }else{ $error[] = "<p>名称は、1000文字まで入力ok</p>"; } $sq = trim($_SESSION['sq']); $len = strlen($sq); if($len < 50) { $sq = preg_replace('/[ ]+$/u', '', $sq); $sq = mb_convert_kana($sq, 'K', 'UTF-8');s $sq = str_replace("\t", '', $sq); $sq = str_replace('"','”',$sq); }else{ $error[] = "<p>名称は、50文字まで入力ok</p>"; } if(!count($error)) { $_SESSION['name'] = $_POST['name']; $_SESSION['name'] = $_POST['kana']; $_SESSION['name'] = $_POST['memo']; $_SESSION['name'] = $_POST['sq']; header("Location:http://locathost/php/confirm.php"); exit(); } } if(count($error)) { foreach ($error as $message) { $_SESSION['name'] = $_POST['name']; $_SESSION['name'] = $_POST['kana']; $_SESSION['name'] = $_POST['memo']; $_SESSION['name'] = $_POST['sq']; print($message); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"/> <title>カテゴリの登録</title> </head> <body> <h1>登録フォーム</h1> <div id="form"> <form method="POST" action="<?=basename(FILE)?>"> <p> 名称(必須)<br/> <input type="text" name="name" value="<?=$name?>"> </p> <p> フリガナ(必須)<br/> <input type="text" name="kana" value="<?=$kana?>"> </p> <p> メモ<br/> <textarea name="memo" cols="80" rows="4" value="<?=$memo?>"></textarea> </p> <p> 並び順<br/> <input type="text" name="sq" value="<?=$sq?>"> </p> <p> <input type="submit" value="確認" /> <input type="reset" value="リセット" /> </p> </form> </div> </div> </body> </html> inform.phpでセッション変数が空かどうかは、入力チェックを行う項目の数だけ 記述するのでしょうか? 例えば、以下のような感じでしょうか? if(empty($_SESSION['name']) { header("Location:http://locathost/php/inform.php"); exit(); } if(empty($_SESSION['kana]) { header("Location:http://locathost/php/inform.php"); exit(); } if(empty($_SESSION['memo']) { header("Location:http://locathost/php/inform.php"); exit(); } if(empty($_SESSION['sq']) { header("Location:http://locathost/php/inform.php"); exit(); } inform.phpでは、入力項目全て空欄を初期値としたいですが、confirm.phpで 戻るボタンをクリックしたら入力項目のデータを引き継ぐように行いたいです。 POSTからSESSIONを利用してコードを書き直すときに inform.phpの以下の部分をどのように書きなおすべきなのか分かりません。 if(count($error)) { foreach ($error as $message) { print($message); } } if(!count($error)) { header("Location:http://locathost/php/confirm.php"); exit(); } 何卒宜しくお願い致します。
TaMaMhyu

2014/10/20 07:40

inform.phpで入力チェックするのであれば、セッション変数への格納はinform.phpでPOSTされた時のみになります。confirm.phpではセッション変数を参照するだけです。 セッション変数にエスケープしたものを格納してしまうとデータベースにエスケープしたものを格納することになってしまいます。エスケープ(HTMLとSQL)は直前で行うべきです。 データベースへの格納が成功したらセッション変数破棄になると思います。 inform.phpで入力チェックする場合、セッション変数は入力チェック時は使用しません。格納するだけです。入力チェックより前に格納するべきです。入力エラーの内容を画面に戻すためです。 inform.phpで入力チェックする場合、セッション変数がどうなっているかは判断する必要はないと思います。POSTで呼び出された時にその内容をセッション変数に格納し、POSTでない時はセッション変数に初期値を格納し、一律セッション変数から画面に出力(エスケープしながら)すればできると思います。この処理によって、入力画面の初期表示と入力エラーが出し分けできます。
TaMaMhyu

2014/10/20 07:49

1点見落としました。inform.phpで入力チェックすると、confirm.phpからの戻りはセッション変数の状態を見る必要があります。ですが、POSTでない場合に、セッション変数未定義(isset関数の結果がfalse)なら初期値(空文字列)、そうでなければ(isset関数の結果がtrue)そのままとすることで、処理がまとめられると思います。 $_SESSION['パラメータ名'] = isset($_SESSION['パラメータ名']) ? $_SESSION['パラメータ名'] : '初期値'; こんな感じで書けると思います。
TaMaMhyu

2014/10/20 07:51

if (!isset($_SESSION['パラメータ名'])) $_SESSION['パラメータ名'] = '初期値'; こっちのほうが良かったですね。
maizo

2014/10/20 15:20

コメントありがとうございます。 inform.php confirm.php done.phpを修正してみました。 inform.php <?php //SESSIONの開始 session_start(); //POSTだったらエラーチェック if($_SERVER["REQUEST_METHOD"] == 'POST') { $error = array(); $name = trim($_POST['name']); $len = strlen($name); if(empty($_POST['name'])|| $len == 0) { $error[] = "<p>名称は、必須項目です。</p>"; }elseif($len < 50){ $name = preg_replace('/[ ]+$/u', '', $name); $name = mb_convert_kana($name, 'K', 'UTF-8'); $name = str_replace("\t", '', $$name); $name = str_replace('"','”',$name); }else { $error[] = "<p> 名称は、50文字まで入力ok</p>"; } $kana = trim($_POST['kana']); $len = strlen($kana); if(empty($_SESSION['kana']) || $len == 0){ $error[] = "<p>フリガナは、必須項目です。入力して下さい。</p>"; } elseif($len < 50) { $kana = preg_replace('/[ ]+$/u', '', $kana); $kana = mb_convert_kana($kana, 'K', 'UTF-8'); $kana = str_replace("\t", '', $kana); $kana = str_replace('"','”',$kana); }else{ $error[] = "<p>フリガナは、50文字まで入力ok</p>"; } $memo = trim($_POST['memo']); $len = strlen($memo); if($len < 1000) { $memo = preg_replace('/[ ]+$/u', '', $memo); $memo = mb_convert_kana($memo, 'K', 'UTF-8'); $memo = str_replace("\t", '', $memo); $memo = str_replace('"','”',$memo); }else{ $error[] = "<p>名称は、1000文字まで入力ok</p>"; } $sq = trim($_POST['sq']); $len = strlen($sq); if($len < 50) { $sq = preg_replace('/[ ]+$/u', '', $sq); $sq = mb_convert_kana($sq, 'K', 'UTF-8'); $sq = str_replace("\t", '', $sq); $sq = str_replace('"','”',$sq); }else{ $error[] = "<p>名称は、50文字まで入力ok</p>"; } if(!count($error)) { //POSTでなければセッション変数に空白を格納 if(!isset($_SESSION['name'])){ $_SESSION['name'] = ""; header("Location:http://locathost/php/confirm.php"); exit(); } if(!isset($_SESSION['kana'])){ $_SESSION['name'] = ""; header("Location:http://locathost/php/confirm.php"); exit(); } if(!isset($_SESSION['memo'])){ $_SESSION['name'] = ""; header("Location:http://locathost/php/confirm.php"); exit(); } if(!isset($_SESSION['sq'])){ $_SESSION['name'] = ""; header("Location:http://locathost/php/confirm.php"); exit(); } else { //POSTなのでセッション変数に内容を格納 $_SESSION['name'] = $_POST['name']; $_SESSION['name'] = $_POST['kana']; $_SESSION['name'] = $_POST['memo']; $_SESSION['name'] = $_POST['sq']; } } } if(count($error)) { foreach ($error as $message) { print($message); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"/> <title>カテゴリの登録</title> </head> <body> <h1>登録フォーム</h1> <div id="form"> <form method="POST" action="<?=basename(FILE)?>"> <p> 名称(必須)<br/> <input type="text" name="name" value="<?=$name?>"> </p> <p> フリガナ(必須)<br/> <input type="text" name="kana" value="<?=$kana?>"> </p> <p> メモ<br/> <textarea name="memo" cols="80" rows="4" value="<?=$memo?>"></textarea> </p> <p> 並び順<br/> <input type="text" name="sq" value="<?=$sq?>"> </p> <p> <input type="submit" value="確認" /> <input type="reset" value="リセット" /> </p> </form> </div> </div> </body> </html> コメントの中でinform.phpで入力チェックするときにif (!isset($_SESSION['パラメータ名'])) $_SESSION['パラメータ名'] = '初期値';のような書き方が良いと書いてあります。 この書き方の場合は、$_SESSION['パラメータ名']がセットされてない時に初期値をセッション変数に代入するということでしょうか? おそらくこの場合の初期値は、空欄だと考えています。 3つのパラメータ名(変数?)にセッション変数を入れるときは、シンプルに1行にコードを書くことができるのでしょうか? それとも上記で私が書いたように1つの変数ごとにconfirm.phpへのリダイレクトと セッション変数への初期値の代入を記載するべきでしょうか? 次にconfirm.phpです。 <?php //セッションの開始 session_start(); //セッションの参照 $_SESSION['name'] = $_POST['name']; $_SESSION['name'] = $_POST['kana']; $_SESSION['name'] = $_POST['memo']; $_SESSION['name'] = $_POST['sq']; $dt = date('Y-m-d H:i:m'); $registrar = "administrator"; $update = "administrator"; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>確認画面</title> </head> <body> <form method="POST" action="./done.php"> <?php //次の登録完了画面へ飛ばす print "<p>入力はこれでよろしいですか?</p>"; print "<p>名称:$name</p>"; print "<p>フリガナ:$kana</p>"; print "<p>メモ:$memo</p>"; print "<p>更新日時:$dt</p>"; print "<p>更新者:$registrar</p>"; print "<p>登録日時:$dt</p>"; print "<p>登録者:$update</p>"; print "<p>並び順:$sq</p>"; ?> <input type="hidden" name="name" value="<?=$name?>"> <input type="hidden" name="kana" value="<?=$kana?>"> <input type="hidden" name="memo" value="<?=$memo?>"> <input type="hidden" name="sq" value="<?=$sq?>"> <input type="submit" value="登録" /> <input type="button" onclick="history.back()" value="戻る" /> </form> </body> </html> こちらは、セッション開始後にPOSTをセッション変数に入れたつもりです。 コメント中に出てくるセッションの参照というのは、POSTをセッションに代入することを指すのでしょうか? <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>登録完了画面</title> </head> <body> <?php //DBの設定情報 require_once realpath(DIR) . 'DbManager.php'; //DB命令 try { $dt = date('Y-m-d H:i:m'); $db = getDb(); $registrar = "administrator"; $update = "administrator"; //エスケープ処理 $name = htmlspecialchars($_POST['$name'],ENT_QUOTES); $kana = htmlspecialchars($_POST['kana'],ENT_QUOTES); $memo = htmlspecialchars($_POST['$memo'],ENT_QUOTES); $sq = htmlspecialchars($_POST['$sq'],ENT_QUOTES); $stt = $db->prepare('INSERT INTO カテゴリ(ID,名称,カナ,メモ,登録日時,登録者,更新日時,更新者,並び順) VALUES(NULL,:name, :kana, :memo,:datetime,:registrar, :datetime, :update, :sq)'); $stt->bindValue(':name', $_POST['name']); $stt->bindValue(':kana', $_POST['kana']); $stt->bindValue(':memo', $_POST['memo']); $stt->bindValue(':datetime', $dt); $stt->bindValue(':registrar', $registrar); $stt->bindValue(':datetime', $dt); $stt->bindValue(':update', $update); $stt->bindValue(':sq', $_POST['sq']); $stt->execute(); //名称とフリガナの重複チェック if($stt->rowCount() > 0) { header('Location:http://localhost/php/inform.php'); exit(); }else{ echo "重複してるから登録できません。"; } $db = NULL; //セッションの破棄 session_destroy(); //例外処理のエラー時の処理 } catch(PDOException $e) { die("エラーメッセージ:{$e->getMessage()}"); } ?> <p><a href="view.php">一覧表示</a></p> </body> </html> 最後にdone.phpですが、DBのテーブルへ値を代入する前にエスケープ処理を行い DBへの格納後セッションを破棄しました。 いくつか不明な点があったので質問させて頂きました。 宜しくお願い致します。
TaMaMhyu

2014/10/21 00:54

あくまで一例ですが、以下のようにするといいと思います。 inform.phpについて: まず最初に、 POSTの場合、セッション変数にPOSTパラメータを代入してください。 POSTでない場合、セッション変数が未定義の場合に初期値(空文字列)を代入し、未定義があった場合は初期アクセスと判断して入力チェックはスルーしてください。 その後、入力チェックしてください。 入力チェックに問題がなければconfirm.phpにリダイレクトしてください。`$error`に入力エラーを入れているようなので、`count($error)`で入力エラー有無を判断できると思います。 初期アクセスと入力エラーはそのままフォームを表示してください。 confirm.phpについて: リダイレクトでアクセスされるので、POSTパラメータはありません。 セッション変数をエスケープして画面を表示してください。 セッション変数を使うので、フォームにパラメータを入れる意味はありません。 inform.phpやdone.phpへの遷移は、別のフォームやただのリンクにしてGETアクセスにしてください。inform.phpでPOSTの場合は別の処理にしているためです。 セッション変数が未定義の時にinform.phpにリダイレクトするとなお良いと思います。不正アクセスやブックマークアクセスの場合にこうなります。 done.phpについて: confirm.phpと同様にPOSTパラメータは使用しません。セッション変数を使用してください。 ここでは元々エスケープしていたはずです。`bindValue`でエスケープされます。HTMLのエスケープとは異なります。 画面に表示するときは別途エスケープが必要になります。 データベース挿入成功時にセッションを破棄せずinform.phpにリダイレクトしているように見受けられます。処理を間違えていないでしょうか? ちなみに挿入失敗は重複とは限らないのではないでしょうか? SELECTで事前に確認する必要があると思います。 なお、同じセッション変数にPOSTパラメータを代入しているようです。これでは後のもので上書きされてしまうので、パラメータごとに別のセッション変数に代入する必要があります。連想配列にして1つのセッション変数に入れる方法もあります。
maizo

2014/10/22 13:54

コメントありがとうございます。 confirm.phpのセッション変数が未定義の場合初期値を代入するところで躓いています。 この入力フォームでは、名称とカナを必須項目にするのですが セッションの未定義部分では、kanaとnameが同時に入力されているかつ、memoとsqをorとしたほうがいいのでしょうか? 未定義チェックでコードの書き方が分からないです。count($error)で入力エラーをチェックする部分は、記述することができました。 inform.phpのソースコードは、下のようになっています。 <?php //SESSIONの開始 session_start(); //POSTだったらエラーチェック if($_SERVER["REQUEST_METHOD"] == 'POST') { //POSTの場合セッション変数にPOSTパラメータを代入 //name,kana,memo,sqをセッションへ $_SESSION['name'] = $_POST['name']; $_SESSION['kana'] = $_POST['kana']; $_SESSION['memo'] = $_POST['sq']; $error = array(); $name = trim($_POST['name']); $len = strlen($name); if(empty($_POST['name'])|| $len == 0) { $error[] = "<p>名称は、必須項目です。</p>"; }elseif($len < 50){ $name = preg_replace('/[ ]+$/u', '', $name); $name = mb_convert_kana($name, 'K', 'UTF-8'); $name = str_replace("\t", '', $$name); $name = str_replace('"','”',$name); }else { $error[] = "<p> 名称は、50文字まで入力ok</p>"; } $kana = trim($_POST['kana']); $len = strlen($kana); if(empty($_POST['kana']) || $len == 0){ $error[] = "<p>フリガナは、必須項目です。入力して下さい。</p>"; } elseif($len < 50) { $kana = preg_replace('/[ ]+$/u', '', $kana); $kana = mb_convert_kana($kana, 'K', 'UTF-8'); $kana = str_replace("\t", '', $kana); $kana = str_replace('"','”',$kana); }else{ $error[] = "<p>フリガナは、50文字まで入力ok</p>"; } $memo = trim($_POST['memo']); $len = strlen($memo); if($len < 1000) { $memo = preg_replace('/[ ]+$/u', '', $memo); $memo = mb_convert_kana($memo, 'K', 'UTF-8'); $memo = str_replace("\t", '', $memo); $memo = str_replace('"','”',$memo); }else{ $error[] = "<p>名称は、1000文字まで入力ok</p>"; } $sq = trim($_POST['sq']); $len = strlen($sq); if($len < 50) { $sq = preg_replace('/[ ]+$/u', '', $sq); $sq = mb_convert_kana($sq, 'K', 'UTF-8'); $sq = str_replace("\t", '', $sq); $sq = str_replace('"','”',$sq); }else{ $error[] = "<p>名称は、50文字まで入力ok</p>"; } //入力チェック抜けたらconfirm.phpへリダイレクト if(!count($error)) { header("http://localhost/confirm.php"); exit(); } } //POSTでは無い。ここでセッション変数が未定義かチェックする //未定義だったら初期値(空文字)を代入 if(isset($_SESSION['name'] && $_SESSION['kana'])) { } //エラーだったときのメッセージを表示 if(count($error)) { foreach ($error as $message) { print($message); } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"/> <title>カテゴリの登録</title> </head> <body> <h1>登録フォーム</h1> <div id="form"> <form method="POST" action="<?=basename(FILE)?>"> <p> 名称(必須)<br/> <input type="text" name="name" value="<?=$name?>"> </p> <p> フリガナ(必須)<br/> <input type="text" name="kana" value="<?=$kana?>"> </p> <p> メモ<br/> <textarea name="memo" cols="80" rows="4" value="<?=$memo?>"></textarea> </p> <p> 並び順<br/> <input type="text" name="sq" value="<?=$sq?>"> </p> <p> <input type="submit" value="確認" /> <input type="reset" value="リセット" /> </p> </form> </div> </div> </body> </html>
maizo

2014/10/22 14:01

セッション変数が未定義なのかチェックする部分は、下記のように 1つずつ条件文を書かないとチェックできないでしょうか? if(!isset($_SESSION['name'])) { $_SESSION['name'] = ''; }elseif(!isset($_SESSION['kana'])) { $_SESSION['kana'] = ''; }elseif(!isset($_SESSION['memo'])) { $_SESSION['memo'] = ''; }elseif(!isset($_SESSION['sq'])) { $_SESSION['sq'] = ''; } 未定義部分だけこのように現在記述しています。 宜しくお願いします。
maizo

2014/10/22 14:26

confirm.phpについて confirm.phpは、下記のように記述してみました。 <?php //セッションの開始 session_start(); //セッション変数のエスケープ $name = htmlspecialchars($_SESSION['name'], ENT_QUOTES); $kana = htmlspecialchars($_SESSION['kana'], ENT_QUOTES); $memo = htmlspecialchars($_SESSION['memo'], ENT_QUOTES); $sq = htmlspecialchars($_SESSION['sq'], ENT_QUOTES); $dt = date('Y-m-d H:i:m'); $registrar = "administrator"; $update = "administrator"; //セッション変数未定義だったらinform.phpへリダイレクト if(!isset($_SESSION['name'])) { header("http://localhost/inform.php"); exit(); }elseif(!isset($_SESSION['kana'])) { header("http://localhost/inform.php"); exit(); }elseif(!isset($_SESSION['memo'])) { header("http://localhost/inform.php"); exit(); }elseif(!isset($_SESSION['sq'])) { $header("http://localhost/inform.php"); exit(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>確認画面</title> </head> <body> <form method="GET" action="./done.php"> <?php //次の登録完了画面へ飛ばす print "<p>入力はこれでよろしいですか?</p>"; print "<p>名称:$name</p>"; print "<p>フリガナ:$kana</p>"; print "<p>メモ:$memo</p>"; print "<p>更新日時:$dt</p>"; print "<p>更新者:$registrar</p>"; print "<p>登録日時:$dt</p>"; print "<p>登録者:$update</p>"; print "<p>並び順:$sq</p>"; ?> <input type="hidden" name="name" > <input type="hidden" name="kana" > <input type="hidden" name="memo" > <input type="hidden" name="sq" > <input type="submit" value="登録" /> <input type="button" onclick="history.back()" value="戻る" /> </form> </body> </html> done.phpへの遷移は、GETに記述しました。 セッションのエスケープですがこのような記述で宜しいでしょうか? done.phpは、下記のようにしました。 <?php //セッションの開始 session_start(); //DBの設定情報 require_once realpath(DIR) . 'DbManager.php'; //DB命令 try { $dt = date('Y-m-d H:i:m'); $db = getDb(); $registrar = "administrator"; $update = "administrator"; //エスケープ処理 //$name = htmlspecialchars($_SESSION['$name'],ENT_QUOTES); //$kana = htmlspecialchars($_SESSION['kana'],ENT_QUOTES); //$memo = htmlspecialchars($_SESSION['$memo'],ENT_QUOTES); //$sq = htmlspecialchars($_SESSION['$sq'],ENT_QUOTES); $stt = $db->prepare('INSERT INTO カテゴリ(ID,名称,カナ,メモ,登録日時,登録者,更新日時,更新者,並び順) VALUES(NULL,:name, :kana, :memo,:datetime,:registrar, :datetime, :update, :sq)'); $stt->bindValue(':name', $_SESSION['name']); $stt->bindValue(':kana', $_SESSION['kana']); $stt->bindValue(':memo', $_SESSION['memo']); $stt->bindValue(':datetime', $dt); $stt->bindValue(':registrar', $registrar); $stt->bindValue(':datetime', $dt); $stt->bindValue(':update', $update); $stt->bindValue(':sq', $_SESSION['sq']); $stt->execute(); //セッションの破棄 session_destroy(); //名称とフリガナの重複チェック if($stt->rowCount() > 0) { header('Location:http://localhost/php/inform.php'); exit(); }else{ echo "重複してるから登録できません。"; } $db = NULL; //例外処理のエラー時の処理 } catch(PDOException $e) { die("エラーメッセージ:{$e->getMessage()}"); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>登録完了画面</title> </head> <body> <p>登録完了です。ありがとうございます。</p> <p><a href="view.php">一覧表示</a></p> </body> </html> bindValueでエスケープされるようなので一時的にHTMLエスケープ処理は、コメントに しました。 セッションを破棄しないで inform.phpにリダイレクトしていましたが リダイレクトの前にセッションを破棄しました。 done.phpでは、登録が完了した旨と次のview.phpへのリンクだけ表示したいと 今は考えています。 データベースの項目で名称とフリガナだけ重複チェックをしたいのですが 重複チェックの部分が上手く記述できていません。 挿入失敗ですが、データベースの中に同じデータが入っていたら重複ということで挿入失敗になると思います。 連想配列ですか、初めて聞いた言葉です。少し調べてみます。 宜しくお願い致します。
TaMaMhyu

2014/10/24 07:32

セッション変数に入っているパラメータと入っていないパラメータがあると言うのはバグなので、代表で1つ未定義ならすべて未定義とみなしてよいかと思います。 連想配列でまとめた場合はそれをisset関数に掛けるだけなので、悩む必要はなくなります。 memoとsqのセッション変数への代入がおかしいと思います。memoは代入していないようですし、sqはmemoになっているようです。 isset関数は1変数ごとに使うので、中に&&が入るとおかしなことになります。 入力エラー表示がDOCTYPEより前にあるのはおかしいので、bodyの中で出力する必要があります。 ちなみに入力エラー表示するところにエラーの有無の条件が書かれていますが、エラーがない場合はすでに処理が終了しているので、ここで判定する意味はありません。 confirm.phpのフォームにname,kana,memo,sqのパラメータを埋め込む必要はないはずです。 データベースの重複チェックですが、基本的にはSELECTで重複するデータが存在するか確認する必要があると思います。 データベースのテーブルにユニークを設定することもした方がいいですが、これだけでは重複でエラーになったかを正確には判別できないと思います。(データベース固有のエラーコードなど参照すればできるかもしれませんが…) 連想配列というのは添字(キー)が任意値になっている配列です。 PHPの場合、普通の配列も実際にはキー(添字)が整数になっている連想配列です。 var_dump関数などで配列を出力してみるとわかると思います。 すでに使っている、$_POSTとか$_SESSIONも連想配列です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問