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

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

ただいまの
回答率

90.61%

  • PHP

    19904questions

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

正規表現入力チェック

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 189

shaobao

score 25

こんにちは、

今、PHPを独学しています。
商品登録ページ→入力チェックページに至る所を作っております。
入力チェックページでは、金額入力チェックを!preg_match('/¥A[0-9]+¥z/',$price)を使ってチェックしているですが、半角整数字で入力してもエラーが表示されて、次のページへ飛べない状態でした。正規表現の書き方間違っていないと思いますが。。。但し、is_numeric関数を使ってチェックするとちゃんと正しく動作します。
でも、なぜ、preg_matchを使ったら、ダメなのか?!。。。
因みに、PCはMacを使用しています。

ご存知の方がお手数をおかけいたしますが、ご教示お願い致します。
何卒よろしくお願いいたします。

入力ページとチェックページは次の通りです。
まず、pro_add.php

session_start();
require 'lib/functions.php';

//トークンを確認
if(!isset($_SESSION['token'])){
    $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
}

$token = $_SESSION['token'];

require 'header.php';
?>

    <div class="staff_add">
        <p>商品追加</p>
        <?php
        //errorがあったら表示
        if(isset($_SESSION['error'])){
            foreach($_SESSION['error'] as $value){
                echo '<span class="error">' . h($value) . '</span>' . '\n';
            }
        }

        //変数にpostされたデータを代入
        $name = isset($_POST['name']) ? $_POST['name'] : '';
        $price = isset($_POST['price']) ? $_POST['price'] : '';
        ?>
        <form action="pro_add_check.php" method="post">
            <p>商品名を入力してください。</p>
            <p><input type="text" name="name" value="<?php echo h($name); ?>" maxlength="100" required></p>
            <p>価格を入力してください。</p>
            <p><input type="text" name="price" value="<?php echo h($price); ?>" required></p>
            <div>
                <!--<input type="button" onclick="history.back()" value="戻る">-->
                <input type="hidden" name="token" value="<?php echo h($token); ?>">
                <input type="submit" value="確認">
            </div>
        </form>
    </div>

<?php
require 'footer.php';
コード

次、pro_add_check.php

<?php
session_start();
require 'lib/functions.php';
ini_set("display_errors", On);
error_reporting(E_ALL);
//変数初期化
$name = "";
$price = "";
$token = "";

if($_SERVER["REQUEST_METHOD"] == "POST"){

    //トークンをcheck
    if(isset($_POST['token']) && isset($_SESSION['token'])){
        $token = $_POST['token'];

        if($token != $_SESSION['token']){
            die('不正アクセスですが発生!');
        }
    }else{
        die('操作が間違っています。最初からやり直してください。');
    }

    //変数にpostされたデータを代入
    $name = isset($_POST['name']) ? $_POST['name'] : '';
    $price = isset($_POST['price']) ? $_POST['price'] : '';
    var_dump($price);
    $error = [];

    //nameチェック
    if(trim($name) == ''){
        $error[] = '商品名を入力してください';
    }

    //priceチェック
    if(!preg_match('/¥A[0-9]+¥z/',$price)){
        $error[] = '価格をきちんと入力してください。';
    }
    // if(is_numeric($price) == false){
    //     $error[] = '価格をきちんと入力してください。';
    // }

    $_SESSION['error'] = $error;

    //error数の確認
    if(count($error) > 0){
        header('Location:  ./pro_add.php');

    //確認画面を表示
    }else{

require 'header.php';


?>
<div class="staff_add">
        <p>商品を追加</p>
        <form action="pro_add_done.php" method="post">
            <input type="hidden" name="name" value="<?php echo h($name); ?>">
            <input type="hidden" name="price" value="<?php echo h($price); ?>">
            <p>商品名</p>
            <p><?php echo h($name); ?></p>
            <p>価格</p>
            <p><?php echo h($price); ?></p>
            <div>
                <input type="button" onclick="history.back()" value="戻る">
                <input type="hidden" name="token" value="<?php echo h($token); ?>">
                <input type="submit" value="確認">
            </div>
        </form>

    </div>

<?php
    }

}
require 'footer.php';
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

if(!preg_match('/¥A[0-9]+¥z/',$price))ですが、¥バックスラッシュでない円記号になっています。

正しくは、if(!preg_match('/\A[0-9]+\z/',$price))です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/21 16:25

    ご回答いただき、ありがとうございます。
    一応、前に、¥を\に変更して試してみてはあったですが、ダメでした。たぶん自分の誤操作かもしれません。
    今、おしゃった通り、慎重に再度試してみたら、正常でした。
    なんだ、自分は、まだ細かいところに気をつけるべきわ。
    お掛け様で解決できました。
    ありがとうございました。

    キャンセル

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

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

関連した質問

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

  • PHP

    19904questions

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