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';
        }
    }
?>

容器类:

<?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 响应同时适合当前的语句。然后我注意到,如果我只是将 Container 类粘贴到 handler.php 文件的顶部,一切正常,但它有点挫败了我试图实现的目标。

我尝试了不同的方法来包含 Container 类,但它似乎不是特定于当前场景的问题。

我还在学习 PHP,我的猜测是我错过了一些非常基本的东西。我还在stackoverflow上搜索我遇到的问题以及PHP.net,但没有成功。

问候,

4

1 回答 1

1

我的猜测是您的类文件末尾有空格,这导致输出为“ok”而不是“ok”。这可能是使用某些应用程序编辑文件或在关闭后意外添加空格的结果?>。尝试一起删除 php 类中的关闭?>。这不仅是允许的(无论如何,php 都会在文件末尾自动结束处理),而且在许多样式指南中经常鼓励这样做,以防止出现您所描述的那种事情。

对于这种情况,我通常会做的另一件事是返回一个 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);
        }
    });

请注意在 ajax 调用中添加的dataType参数,以及response.status用于检查我们在 PHP 中创建的状态属性。

这也允许您在响应中返回多个值。您可以在 PHP 端构建您喜欢的对象或数组,并且您基本上会收到与 javascript 端的 javascript 对象相同的内容。

于 2012-11-29T22:56:39.853 回答