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

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

ただいまの
回答率

89.20%

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

受付中

回答 5

投稿 ・編集

  • 評価
  • クリップ 2
  • VIEW 6,005

maizo

score 13

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>

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/22 23: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'] = '';
    }

    未定義部分だけこのように現在記述しています。

    宜しくお願いします。

    キャンセル

  • 2014/10/22 23: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&#039;);
    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へのリンクだけ表示したいと
    今は考えています。

    データベースの項目で名称とフリガナだけ重複チェックをしたいのですが
    重複チェックの部分が上手く記述できていません。

    挿入失敗ですが、データベースの中に同じデータが入っていたら重複ということで挿入失敗になると思います。

    連想配列ですか、初めて聞いた言葉です。少し調べてみます。

    宜しくお願い致します。

    キャンセル

  • 2014/10/24 16:32

    セッション変数に入っているパラメータと入っていないパラメータがあると言うのはバグなので、代表で1つ未定義ならすべて未定義とみなしてよいかと思います。
    連想配列でまとめた場合はそれをisset関数に掛けるだけなので、悩む必要はなくなります。

    memoとsqのセッション変数への代入がおかしいと思います。memoは代入していないようですし、sqはmemoになっているようです。

    isset関数は1変数ごとに使うので、中に&&が入るとおかしなことになります。

    入力エラー表示がDOCTYPEより前にあるのはおかしいので、bodyの中で出力する必要があります。
    ちなみに入力エラー表示するところにエラーの有無の条件が書かれていますが、エラーがない場合はすでに処理が終了しているので、ここで判定する意味はありません。

    confirm.phpのフォームにname,kana,memo,sqのパラメータを埋め込む必要はないはずです。

    データベースの重複チェックですが、基本的にはSELECTで重複するデータが存在するか確認する必要があると思います。
    データベースのテーブルにユニークを設定することもした方がいいですが、これだけでは重複でエラーになったかを正確には判別できないと思います。(データベース固有のエラーコードなど参照すればできるかもしれませんが…)

    連想配列というのは添字(キー)が任意値になっている配列です。
    PHPの場合、普通の配列も実際にはキー(添字)が整数になっている連想配列です。
    var_dump関数などで配列を出力してみるとわかると思います。
    すでに使っている、$_POSTとか$_SESSIONも連想配列です。

    キャンセル

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/12 15:48

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

    キャンセル

  • 2014/10/14 23:50

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

    キャンセル

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 22:04

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

    キャンセル

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/04 17:07

    入力エラーがない場合はリダイレクトして処理を終了しているので、それ以降は当然、入力エラーがある場合しかありません。
    なので判定してもしなくても同じです。「if(count($error))」の判定が不要ということです。
    入力エラーチェックはPOSTされてきた直後にすべきものです。
    入力エラーの内容をそのまま戻すためにセッション変数を使うため、セッション変数へ入れるのは入力エラーチェックの前になります。

    パラメータ埋め込みと言うのは、formの中の「input type="hidden"」のところです。
    ここに入れるということはGETやPOSTで送信されるので、セッションに入っている時にやっても意味がありません。
    このinput要素自体が不要です。

    連想配列にまとめない場合は、例えば「if(!isset($_SESSION['name']))」の判定だけで、すべてのセッション変数が未定義と判定しても実害はありません。
    ちなみにelseifを使ってしまうと初期化が中途半端になるのでバグです。全部ifだけでやるか、上記の代表判定の方法になります。

    状況がはっきりしないので、回答できませんが、各PHPファイルのsession_startの直後にvar_dumpなどで$_SESSIONを出力して、中身を確認してみてください。どこで何が入っているかがわからないと、何が起きているかわかりません。

    キャンセル

0

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

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

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

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

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



投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る