困惑于AJAX的基础知识

时间:2010-05-09 05:43:31

标签: php javascript ajax

现在,我只是使用基本表单来检查密码。我希望它检查密码并基本保留在page.html上,以便我可以使用JavaScript来提醒错误的密码或其他内容。我真的不确定该怎么做。它似乎会带我到check.php。我对整个过程不太确定,任何帮助表示赞赏!谢谢!

page.html中

<form action="check.php" method="post">
    <input type="password" name="password" />
    <input type="submit" value="Submit" />

</form>

check.php

   <?php
    $password = $_POST['password'];
    if ( $password != "testing" ) {
        die();
    }
?>

4 个答案:

答案 0 :(得分:10)

PHP运行在Web服务器上,该服务器通常在物理上不同的计算机(服务器端)运行,而不是运行webbrowser(客户端)。这些机器通常通过网络连接。 HTTP是一种网络协议。 webbrowser发送HTTP请求。 Web服务器检索HTTP请求,其URL指示应将其转发到PHP以进行进一步处理。 PHP检索HTTP请求并执行处理并返回HTTP响应。通常是普通的香草HTML页面的味道。 Web服务器将HTTP响应发送回Web浏览器。

JavaScript在webbrowser上运行,对PHP一无所知,因为它在Web服务器上运行。 PHP反过来也对JavaScript一无所知(尽管它可以生成一些JS代码,而这些代码又通过HTTP发送到webbrowser)。在JS和PHP之间进行通信的唯一方法是HTTP。让JS触发HTTP请求并检索HTTP响应的方法之一是使用XMLHttpRequest。这是Ajax背后的核心技术。

我在您的问题历史中看到您已经熟悉jQuery。它是一个JS库,具有许多方便的函数来触发ajaxical请求。在这种特定情况下,您希望使用$.post。 E.g。

$('#formId').submit(function() {
    $.post('check.php', $(this).serialize(), function(valid) {
        if (valid) {
            alert('Valid!');
        } else {
            alert('Invalid!');
        }
    });
    return false; // Important! This blocks form's default action.
});

使用check.php

<?php
    echo $_POST['password'] != "testing";
?>

然而,这不是unobtrusive。如果用户已禁用JS,则所有操作都将失败。最好的办法是检查PHP是否有jQuery触发了ajaxical请求并进行相应处理:

if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    // Ajax.
} else {
    // No ajax.
}

或者,您可以让jQuery也可以访问不同的URL或添加额外的参数。


更新:以下是不使用jQuery时JavaScript的外观:

document.getElementById('formId').onsubmit = function() {
    var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            if (xhr.responseText) {
                alert('Valid!');
            } else {
                alert('Invalid!');
            }
        }
    }
    xhr.open('POST', 'check.php', true);
    xhr.send(serialize(this));
    return false; // Important! This blocks form's default action.
}

function serialize(form) {
    var query = '';
    for(var i = 0; i < form.elements.length; i++) {
        var e = form.elements[i];
        if (!e.disabled && e.name 
            && ((e.type != 'checkbox' && e.type != 'radio') || e.checked)
            && (e.type != 'submit' || e == document.lastClicked))
        {
            if (query.length) query += '&';
            query += e.name + '=' + encodeURIComponent(e.value);
        }
    }
    return query;
}   

document.onclick = function(e) {
    e = e || event;
    document.lastClicked = e.target || e.srcElement;
}

臃肿和冗长,是的;)

答案 1 :(得分:2)

如果您想要保持在同一页面上,则必须使用ajax。我建议使用jqueryjquery's post function

基本上,您创建了一个在单击登录按钮时调用的javascript函数。该函数将向check.php发送请求。 Check.php将输出一条状态消息(可能为1表示成功,0表示失败)将返回到原始脚本。从那里你可以输出一条消息说无效密码,或者设置一个cookie,如果它是正确的。

答案 2 :(得分:2)

您尝试做的简单解决方案(基本上是AJAX)是:

  • 修改您的php脚本,以便在成功或失败时输出唯一的内容。
  • 使用JavaScript将数据提交到php脚本,而不是普通的表单POST。
  • 如果密码无效,请让JavaScript向用户发出警报,如果密码有效,则将其指向适当的页面。

当然,这些都是广泛的。实际上,你需要你的php脚本在发出AJAX请求(由JavaScript发出请求)时提供一种响应,并在常规表单POST请求页面时提供另一种响应 - 你确实希望它在没有JavaScript - 对吧?您可能希望JavaScript更新页面内容而不是警告框。您需要PHP脚本设置会话变量,以便他们访问的下一页知道他们已登录。

广泛招数。

阅读jQuery AJAX documentation可能有所帮助。

答案 3 :(得分:0)

在设计网站时,如果没有它,一切正常后,请务必添加JavaScript。原因是双重的。首先,有些人在没有打开的情况下浏览。另一个原因是,那些破解者总是可以查看和编辑JavaScript。

此方法要求您具有单独的PHP文件,以验证密码是否成功。原始页面上的所有内容(HTML和JS)都应该只发送密码并可能等待请求。要使事物保持在同一页面上,您可以使用AJAX发送输入密码并打印出它收到的响应。如果你不想要头脑上的开销,jQuery使AJAX变得简单。

通过HTTPS使用POST比使用GET和HTTP更好。当然,跟踪会话变量,您可能还想限制从第一次收到表单到实际提交表单的时间。