PHP Ajax表单集成返回数组

时间:2013-01-27 14:11:21

标签: php jquery ajax

使用PHP和jQuery Ajax构建基本的系统登录。

我想要做的是通过ajax提交表单的部分并返回一个数组。我不太确定我是否有这个权利。

这是PHP

if($access_function == 'access_login_1'){
    $email = $_POST['access_email'];
    $pwd = $_POST['access_pwd'];

    if(!$email || !$pwd){
        $error = 'Empty';
    }
    else {
        $user = get_user($email);
        if($user && $user['pwd'] == $pwd){
            if($user['status'] == 1){
                $action = 1;
            }
            else {
                $order = 'Unauthorised';
            }
        }
        else {
            $error = 'invalid';
        }
    }
    return array('action'=>$action,'error'=>$error,'order'=>$order);
}

get_user函数类似于::

function get_user($email){
    global $cnx;
    $q = $cnx->prepare("SELECT email FROM `users` WHERE email = :email");
    $q->execute(array(':email' => $email)); 
    return $q->fetch();
}

现在jQuery是真正的斗争。我想要的是将序列化的值提交给这个PHP。如果脚本返回1的操作,我想执行另一个脚本,我想要$ error进入一个名为error的div并命令进入一个名为$ order的div

这没效果:

function sendvars(container,linkrul,perform){
    var vars = 'access=1';
    $(container).find('input').each(function(){
        vars += '&' + $(this).attr('name') + '=' + $(this).val();
    });
    $.ajax({type:'POST',url:linkrul,data:vars,success:function(results){
        if(results == 1){  }
        else { $(container).find('.orders').html(results).slideDown(300); }
        }
    });
}

- 哈希不仅仅是在我们测试所有东西的时候。

3 个答案:

答案 0 :(得分:0)

您需要更仔细地考虑从PHP发送到AJAX回调的数据:

  1. 请记住,PHP脚本无法“返回”任何内容,它只是“显示”它。因此,return array('action'=>$action,'error'=>$error,'order'=>$order);不会产生Javascript可以读取的任何输出,除非您以某种方式将其序列化(将其转换为字符串并输出),例如XML或JSON(使用json_encode())。您可以通过直接在浏览器中查看脚本或使用Firebug等调试工具来测试脚本是否输出有用的内容。
  2. jQuery需要知道您输入数据的编码(请参阅documentation on the dataType parameter)。如果是XML,它会将整个XML文档传递给您的回调函数,因此您需要使用.find.each等函数来检查它。可能最简单的方法是让PHP使用header('Content-type: application/json');(告诉jQuery你正在使用JSON)并使用json_encode回显一些数据,这样你的Javascript回调就可以得到一个简单的Javascript对象。< / LI>
  3. 您当前的Javascript假定AJAX调用的结果是整数(result == 1)或HTML .html(results)的blob。更好的方法是传回PHP代码中显示的整个结果结构(即echo json_encode(array('action'=>$action,'error'=>$error,'order'=>$order));)。然后,您可以单独检查并处理结构的每个部分(例如response.action == 1.html(response.order)),并且您的代码在以后的情况下变得更具可读性和灵活性。
  4. 最后,jQuery有一些内置函数可以在这里为你做更多的工作:查看$.post作为AJAX调用的简写,以及.serialize()(或者cousin .serializeArray())用于读取表单元素的当前值,以便发送给AJAX回调。

    (顺便说一下,我确定你已经发现了这一点,但我认为linkrul应该是linkurl

答案 1 :(得分:0)

我会这样做,返回json编码的数组:

if($access_function == 'access_login_1'){
    $email = $_POST['access_email'];
    $pwd = $_POST['access_pwd'];

    if(!$email || !$pwd){
        $resp = array(
           'action' => $someValue,
           'order' => $someValue,
           'error' => 'No Email or password provided' 
         );
    }
    else {
        $user = get_user($email);
        if($user && $user['pwd'] == $pwd){
            if($user['status'] == 1){
                $resp = array(
                   'action' => 1,
                   'order' => $someValue,
                   'error' => 'No Error' 
                );
            }
            else{
                $resp = array(
                    'action' => $someValue,
                    'order' => 'Unauthorised',
                    'error' => 'Order Error'
                );
            }
        }
        else {
               $resp = array(
                    'action' => $someValue,
                    'order' => 'Unauthorised',
                    'error' => 'Invalid'
                );
        }
    }
    echo json_encode($resp);
}

在js:

function sendvars(container,linkrul,perform){
    var vars = 'access=1';
    $(container).find('input').each(function(){
        vars += '&' + $(this).attr('name') + '=' + $(this).val();
    });
    $.ajax({type:'POST',url:linkrul,data:vars,dataType:'JSON',success:function(results){
         if(results.action == 1){ 
            //do something 
         }else if(results.action == someOtherValue){
           $(container).find('.orders').html(results.order).slideDown(300);
         }else{
            alert(results.error); //Or put the error in some div
         }    
        //any other code or if/else statement
    });
}

答案 2 :(得分:0)

这也是一种选择。

<强> HTML

<input type='text' class='email' />
<input type='password' class='pass' />

PHP - checkLogin.php

<?php

$action = 0;
$order  = 0;
$error  = 0;

if(isset($_POST['email'], $_POST['pass'])) {
     if(!empty($_POST['email']) && !empty($_POST['pass'])) {
          $user = get_user($email);
          if($user && $user['pwd'] == $_POST['pass']){
               if($user['status'] == 1){
                    $action = 1;
               } else {
                    $order = 'Unauthorised';
               }
          } else {
            $error = 'invalid';
          }
     } else {
          $error = "Empty";
     }

     $array = array('action'=>$action,'error'=>$error,'order'=>$order);
     echo json_encode($array);
}

<强>的Javascript

function checkLogin(){
    var email = $('.email').val();
    var pass  = $('.pass').val();
    $.post('checkLogin.php', {email:email,pass:pass}, function(response) {
         var result = $.parseJSON(response);
         if(response['action'] == 1) {
              //authorized
         } else if(response['order'] == 'Unauthorised') {
              //unauthorized
         } else {
              //error
         }
    });
}