2

PHPで奇妙な動作が発生しています。基本的に、PHPスクリプト内にクラスを要求したいと思います。私はそれが簡単であることを知っており、以前にそれを行いましたが、そうすると、jquery(1.8.3)ajax応答の動作が変わります。私はWampセットアップを実行していて、PHPのバージョンは5.4.6です。

これが私のindex.htmlのサンプルです

ヘッド(jquery jsインクルードを省略)

<script>
    $(document).ready(function(){
        $('#submit').click(function(){
            var action = $('#form').attr('action');
            var form_data = {
                fname: $('#fname').val(),
                lname: $('#lname').val(),
                phone: $('#phone').val(),
                email: $('#email').val(),
                is_ajax: 1
            };

            $.ajax({
                type: $('#form').attr('method'),
                url: action,
                data: form_data,
                success: function(response){
                    switch(response){
                        case 'ok':
                            var msg = 'data saved';
                        break;
                        case 'ko':
                            var msg = 'Oops something wrong happen';
                        break;
                        default:
                            var msg = 'misc:<br/>'+response;
                        break;
                    }
                    $('#message').html(msg);
                }
            });

            return false;
        });
    });
</script>

<div id="message"></div>
<form id="form" action="handler.php" method="post">
    <p>
        <input type="text" name="fname" id="fname" placeholder="fname">
        <input type="text" name="lname" id="lname" placeholder="lname">
    </p>
    <p>
        <input type="text" name="phone" id="phone" placeholder="phone">
        <input type="text" name="email" id="email" placeholder="email">
    </p>
    <input type="submit" name="submit" value="submit" id="submit">
</form>

そしてhandler.phpファイルに関しては:

<?php
    require('class/Container.php');

    $filename = 'xml/memory.xml';

    $is_ajax = $_REQUEST['is_ajax'];
    if(isset($is_ajax) && $is_ajax){

        $fname = $_REQUEST['fname'];
        $lname = $_REQUEST['lname'];
        $phone = $_REQUEST['phone'];
        $email = $_REQUEST['email'];

        $obj = new Container;
        $obj->insertData('fname',$fname);
        $obj->insertData('lname',$lname);
        $obj->insertData('phone',$phone);
        $obj->insertData('email',$email);
        $tmp = $obj->give();
        $result = $tmp['_obj'];
        /*
            Push data inside array
        */
        $array = array();
        foreach($result as $key => $value){
            array_push($array,$key,$value);
        }

        $xml = simplexml_load_file($filename);
        // check if there is any data in
        if(count($xml->elements->data) == 0){
            // if not, create the structure
            $xml->elements->addChild('data','');
        }
        // proceed now that we do have the structure
        if(count($xml->elements->data) == 1){
            foreach($result as $key => $value){
                $xml->elements->data->addChild($key,$value);
            }
            $xml->saveXML($filename);
            echo 'ok';
        }else{
            echo 'ko';
        }
    }
?>

Containerクラス:

<?php
    class Container{
        private $_obj;

        public function __construct(){
            $this->_obj = array();
        }

        public function addData($data = array()){
            if(!empty($data)){
                $oldData = $this->_obj;
                $data = array_merge($oldData,$data);
                $this->_obj = $data;    
            }
        }

        public function removeData($key){
            if(!empty($key)){
                $oldData = $this->_obj;
                unset($oldData[$key]);
                $this->_obj = $oldData;
            }
        }

        public function outputData(){
            return $this->_obj;
        }

        public function give(){
            return get_object_vars($this);
        }


        public function insertData($key,$value){
            $this->_obj[$key] = $value;
        }
    }
?>

奇妙なことに、私の結果は常にデフォルトのswitchステートメントに該当し、ajax応答は両方の現在のステートメントに適合します。次に、handler.phpファイルの先頭にContainerクラスを貼り付けるだけで、すべてが正常に機能することに気付きましたが、それは私が達成しようとしていることをやや打ち負かします。

Containerクラスを含めるために別の方法を試しましたが、問題はこの現在のシナリオに固有のものではないようです。

私はまだPHPを学んでおり、本当に基本的なものが欠けていると思います。私はまた、私が経験している問題とPHP.netに関してstackoverflowを検索しましたが、成功しませんでした。

よろしく、

4

1 に答える 1

1

私の推測では、クラスファイルの最後に空白があり、出力が「ok」ではなく「ok」になっていると思います。これは、特定のアプリケーションを使用してファイルを編集したか、閉じた後に誤ってスペースを追加した結果である可能性があります?>。phpクラスのクロージング?>をまとめて削除してみてください。これは許可されているだけでなく(phpはとにかくファイルの終わりで自動的に処理を終了します)、多くのスタイルガイドであなたが説明しているようなことを正確に防ぐためにしばしば推奨されます。

このタイプの状況で私が通常行うもう1つのことは、プレーンな文字列を返す代わりに、json文字列を返すことです。これにより、jQueryは自動的にjavascriptオブジェクトに変換されます。これにより、上記のタイプの問題が発生するのを防ぐか、少なくともすぐに通知することもできます。

したがって、phpは次のようにエコーします。

exit( json_encode( array( 'status' => 'ok' ) ) );

そしてjQueryは次のように受け取ります:

    $.ajax({
        type: $('#form').attr('method'),
        url: action,
        data: form_data,
        dataType: 'json',
        success: function(response){
            switch(response.status){
                case 'ok':
                    var msg = 'data saved';
                break;
                case 'ko':
                    var msg = 'Oops something wrong happen';
                break;
                default:
                    var msg = 'misc:<br/>'+response;
                break;
            }
            $('#message').html(msg);
        }
    });

dataTypeajax呼び出しに追加されたパラメーターとresponse.status、PHPで作成したステータスプロパティを確認するために使用することに注意してください。

これにより、応答で複数の値を返すこともできます。PHP側でオブジェクトまたは配列を好きなように構築でき、基本的にjavascript側でjavascriptオブジェクトと同じものを受け取ります。

于 2012-11-29T22:56:39.853 に答える