0

さまざまなチュートリアル、つまりここここを使用して、送信されるフォームでサーバー側の検証を実行する次の PHP スクリプトをまとめることができました。(「クライアント側」の検証を処理するスクリプトが既にあります。

<?php
//email signup ajax call
if($_GET['action'] == 'signup'){

    //sanitize data
    $email = mysql_real_escape_string($_POST['signup-email']);

    //validate email address - check if input was empty
    if(empty($email)){
        $status = "error";
        $message = "You did not enter an email address!";
    }
    else if(!preg_match('/^[^\W][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\.[a-zA-Z]{2,4}$/', $email)){ //validate email address - check if is a valid email address
            $status = "error";
            $message = "You have entered an invalid email address!";
    }
    else {

            $insertSignup = mysql_query("INSERT INTO signups (signup_email_address) VALUES ('$email')");
            if($insertSignup){ //if insert is successful
                $status = "success";
                $message = "You have been signed up!";  
            }
            else { //if insert fails
                $status = "error";
                $message = "Ooops, Theres been a technical error!"; 
            }

    }

    //return json response
    $data = array(
        'status' => $status,
        'message' => $message
    );

    echo json_encode($data);
    exit;
}
?>

私が今やろうとしているのは、別のフィールドを追加することです。この場合は「name」も検証したいと思います。

私が抱えている問題は、上記のコードに別のフィールドを追加する方法がわからないことです。繰り返しになりますが、学習に使用できる例を見つけようとしましたが、使用できる例が見つかりませんでした.

誰かがこれを見て、おそらく私を正しい方向に向けることができるかどうか疑問に思いました.

多くの感謝と親切な敬意

4

3 に答える 3

4

PHP には、入力を検証してサニタイズするための Filter 拡張機能があります

あなたが探している機能は

それもありfilter_input_arrayますが、それを適切に単体テストする簡単な方法がないため、代わりに上記のものを使用し、必要に応じてスーパーグローバルに渡す方が簡単です。

例:

$userInput = array(
    'signup-email' => 'foo at example.com',
    'name' => 'ArthurDent42'
);

$validatedInput = filter_var_array(
    $userInput, 
    array(
        'signup-email' => FILTER_VALIDATE_EMAIL,
        'name' => array(
            'filter' => FILTER_VALIDATE_REGEXP,
            'options' => array(
                'regexp' => "/^[a-z ]{5,10}$/i"
            )
        )
    )
);

var_dump($validatedInput);

出力 (デモ):

array(2) { 
    ["signup-email"]=> bool(false) 
    ["name"]=> bool(false)
}

入力を検証してサニタイズしたら、配列内の値ごとにいくつかのガード句を配置し、false の場合は早期に返します。

if (!$validatedInput['signup-email']) {
    return json_encode(array(
        'status' => 'error',
        'message' => 'The eMail was invalid'
    ));
}

if (!$validatedInput['name']) {
    return json_encode(array(
        'status' => 'error',
        'message' => 'Name must be 5 to 10 letters from A to Z only'
    ));
}

// everything's validated at this point. Insert stuff to database now.

ext/mysql の代わりに PDO または mysqli を使用することに注意してください。

于 2012-09-02T13:52:10.147 に答える
0

HTMLにフィールドを追加します。

<input type="text" name="name" value="" />

PHPの場合:

$name = trim($_POST['name']);

検証します:

if ($name === '') {
    $status = 'error';
    $message = 'need a name!';
}

次に、挿入ステートメントに名前を追加します(PDOプリペアドステートメントを使用することをお勧めします)。

$nameSql = mysql_real_escape_string($name);
$insertSignup = mysql_query("INSERT INTO signups (signup_email_address, name) VALUES ('$email', '$nameSql')");
于 2012-09-02T13:42:04.813 に答える
-1
    $rule['email']= '/^[^\W][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\.[a-zA-Z]{2,4}$`/'
    $rule['name']= 'bla bla';
    $rule['address']= 'bla bla';

   $data =  sanitize($_POST,$rule);
    function sanitize($input_array,$rule){
    $message = array();
     foreach($input_array as $key=> $value){
     $input_array[$key]= mysql_real_escape_string($value);
     if(isset($rule[$key])){
      if(!preg_match($rule[$key],$input_array[$key]){
        $message[$key] = 'error';
        unset($input_array[$key]);//optional
       }
      }
     }
    return array('data'=>$input_array,'message'=>$message);
    }
于 2012-09-02T13:44:23.930 に答える