1

使用 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.ini 文件。如果脚本返回 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); }
        }
    });
}

-- 散列不只是在我们测试所有东西时。

4

3 回答 3

0

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

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

最后,jQuery 有一些内置函数可以在这里为您完成更多工作:签出$.post作为 AJAX 调用的简写,以及.serialize()(或其表亲.serializeArray())读取表单元素的当前值您可以发送到 AJAX 回调的表单。

(顺便说一句,我相信你已经发现了这一点,但我想linkrul应该是linkurl

于 2013-01-27T14:37:24.323 回答
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
    });
}
于 2013-01-27T14:41:47.383 回答
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
         }
    });
}
于 2013-01-27T14:49:50.993 回答