2

jQuery/Ajax/PHP を使用してデータを送信する単純なフォームがあります。PHP コードは、データベースに送信する前に入力を検証し、入力が無効な場合は応答 div にエラー メッセージを返します。

私のコンピューターと私自身のサーバーでうまく機能します。しかし、クライアントのサーバーにアップロードすると、期待どおりに動作しません。クライアントのサーバーからページにアクセスすると、次のことに気付きました。

  • すべての入力フィールドに値がある場合にのみ、検証結果が応答 div に送信されます。いずれかのフィールドが空の場合、何も起こらず、検証メッセージは返されません。

  • 同じコンピューターを使用して、ローカルホスト上の 1 つ、サーバー上の 1 つ、クライアントのサーバー上の 3 つのコピーにアクセスしているため、マシンの問題ではないようです。

コードは次のとおりです。jQuery:

$(document).ready(function() {
    $('#signup').click(function() {
        var queryString = 'ajax=true';

        var txtName = encodeURIComponent($('#txtName').val());  
        if(txtName.length > 0){
            txtName = txtName.replace(/\%/g, '-');
        }

        var txtEmail = escape($('#txtEmail').val());

        var txtPhone = encodeURIComponent($('#txtPhone').val());
        if(txtPhone.length > 0){
            txtPhone = txtPhone.replace(/\%/g, '-');
        }

        var txtPhoneCode = encodeURIComponent($('#txtPhoneCode').val());        
        if(txtPhoneCode.length > 0){
            txtPhoneCode = txtPhoneCode.replace(/\%/g, '-');
        }

        queryString = queryString + '&txtEmail=' + txtEmail;
        queryString = queryString + '&txtName=' + txtName;
        queryString = queryString + '&txtPhone=' + txtPhone;
        queryString = queryString + '&txtPhoneCode=' + txtPhoneCode;

        $.ajax({
            type: "GET",
            url: 'send.php',
            data: queryString ,
            success: function(msg) {
                $('#response').html(msg);
            }
        });

        return false;
    });
});

PHP ページ:

<?php
if(isset($_GET['ajax']) && ($_GET['ajax'] == 'true')){
    $name = trim($_GET['txtName']); // coming from input text
    $email = trim($_GET['txtEmail']); // coming from input text
    $phone = trim($_GET['txtPhone']); // coming from input text
    $phonecode = trim($_GET['txtPhoneCode']); // coming from a select
    if(strlen($name) == 0){
        echo 'Please enter your name';
    }
    elseif(strlen($email) == 0){
        echo 'Please enter your email';
    }
    elseif(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $email)){
        echo 'Please enter a valid email';
    }
    elseif(strlen($phonecode) == 0){
        echo 'Please select phone code';
    }
    elseif(strlen($phone) == 0){
        echo 'Please enter your phone';
    }
    elseif(!preg_match("/^[0-9]*$/i", $phone)){
        echo 'Please enter a valid phone';
    }
    else{
        require('config.php');
        // send to mysql db
        $email = stripslashes($email);
        $name = urldecode(str_replace('-', '%', $name));
        $phone = urldecode(str_replace('-', '%', $phone));
        $phonecode = urldecode(str_replace('-', '%', $phonecode));
        $dt = gmdate("Y-m-d H:i:s");
        $sql = "insert into subscribers(datecreated, name, email, phone, phonecode) values('$dt', '$name', '$email', '$phone', '$phonecode')";
        $result = mysql_query($sql) or die('Error: Failed to save subscription!');
        // redirect
        echo '<script>setTimeout(function(){ window.location = "thankyou.html#ty"; }, 0);</script>';
    }
}
?>
4

1 に答える 1

3

を設定しているため、サーバーにデータを投稿していませんtype: "GET"

これは、HTTP POST ではなく、HTTP GET 要求が送信されることを意味します。通常、GET 要求はクライアントによってキャッシュされるため、(フィールド値のいくつかの組み合わせが使用されている場合) 要求の応答が既にクライアントのキャッシュにあるため、要求がまったく送信されないことがあります。

代わりに HTTP POST を使用するようにコード (javascript と php の両方) を変更する必要があります。この理由は 2 つあります。

  1. POST 応答はキャッシュされないため、送信するたびに新しい要求が送信されます。
  2. GET は、副作用がある可能性のあるリクエストには使用しないでください。
于 2013-04-21T12:36:04.943 に答える