【问题标题】:Bind buttonClick() Event to PHP Function将 buttonClick() 事件绑定到 PHP 函数
【发布时间】:2014-01-11 12:52:42
【问题描述】:

我是 PHP 新手,刚刚开始学习这门语言的基础知识。

我创建了一个页面login.php,其中包含一个文本字段和一个密码字段。我想要做的是,在单击提交按钮时,我想调用我在同一页面上定义的 PHP 方法 authenticateUser()。如果用户成功通过身份验证,那么他将被定向到 index.html 页面。如果不是,那么他会留在同一页面上,并且会弹出一条错误消息,指出用户名/密码不正确。所有这些逻辑都在authenticateUser() 函数中定义。出于安全考虑,我没有在此处包含代码。

问题在于按钮位于客户端,而 PHP 脚本位于服务器端。谁能告诉我如何实现这一目标? login.php 的源代码如下。提前谢谢你。

登录.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Login</title>
</head>

<body>
    <?php function authenticateUser($username,$password) { //Code to check the user 's credentials
            }
        ?>
        <form id="form1" name="form1" method="post" action="index.php">
        <input name="txtUsername" type="text" id="txtUsername" size="30" maxlength="100" />
        <input name="txtPassword" type="password" id="txtPassword" size="30" maxlength="100" />
        <input type="submit" name="btnLogin" id="btnLogin" value="Log In" />
        </form>
</body>
</html>

【问题讨论】:

  • 你应该阅读关于 Ajax 的文档。

标签: php html forms button


【解决方案1】:

要么使用 AJAX 请求并分离逻辑,要么将表单提交到同一页面,然后进行检查。例如;

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login</title>
</head>
<body>
<?php 
   if( isset($_POST) ) {
         //Let's assume sanitation and validation on input is done in the function
         authenticateUser($_POST['txtUsername'], $_POST['txtPassword']);
   }
    function authenticateUser($username,$password)
        {
        //Code to check the user's credentials
    }
?>
<form id="form1" name="form1" method="post" action="">
<input name="txtUsername" type="text" id="txtUsername" size="30" maxlength="100" />
<input name="txtPassword" type="password" id="txtPassword" size="30" maxlength="100" />
<input type="submit" name="btnLogin" id="btnLogin" value="Log In" />
</form>

我做了什么;

  • 添加了if( isset($_POST) ) {,查看用户是否发布了任何内容,然后调用该函数
  • 删除了表单中的 action 属性值。

回答下面cmets中的问题

1) 我更喜欢个人喜好。另外,如果此页面从 index.php 重命名,您的脚本将无法按预期工作。将其设为空白将发布到当前页面。

2)假设所有检查都已完成,并且您只想将它​​们重定向到所述页面,您可以执行以下操作;

ob_clean(); //As we'd be sending a header() request after HTML output.
header('Location: index.php');

你可以把它放在 authenticateUser 函数中,或者如果 authenticateUser 返回布尔值 TRUE 则放在其他地方 - 这完全取决于你的逻辑。

此外,请确保为登录用户创建会话并相应地处理会话,同时考虑处理漏洞的措施 - 例如会话劫持。

【讨论】:

  • 非常感谢您的回复。我这里有两个问题。 1) 为什么要从表单中删除 action 属性值? 2) 假设如果用户已成功通过身份验证,我应该在哪里以及如何编写将他重定向到 index.php 的逻辑?
  • 再次感谢您为我的问题提供解决方案。
【解决方案2】:

您正朝着正确的方向前进,您无法在点击时执行该功能。但是,您可以在设置操作时执行该功能,使用isset() 进行测试。

if (isset($_POST['btnLogin'])) {
    authenticateUser($_POST['txtUsername'], $_POST['txtPassword']);
}

如果设置了btnLogin,这将执行该功能,但是您需要对页面进行新的请求(即当您单击按钮时,页面将再次加载,然后它将执行该功能。

您可以使用 ajax 请求来简化请求-响应。

但是,当您使用 POST 数组中的值时,您不需要将它们作为参数传递。它们是全局范围的一部分,因此对函数可见。

【讨论】:

    【解决方案3】:

    简短回答:无法将提交按钮绑定到 PHP 函数。

    原因很简单:PHP 是服务器端,而 HTML/JS 是客户端。客户端根本看不到您的任何 PHP 代码。

    要解决此问题,您可以使用 jQuery 将提交按钮绑定到通过 Ajax 调用 PHP 函数的函数,然后将 PHP 代码移动到单独的文件中。

    【讨论】:

      【解决方案4】:

      我会提交到同一个页面并检查那里的输入。如果通过验证则重定向。

           <?php
                  if(isset($_POST))  //checks if form has been submitted
                  {
                      authenticateUser($_POST['txtUsername'],$_POST['txtPassword']);
                  }
      
                  function authenticateUser($username,$password)
                  {
                      //Code to check the user's credentials
                      //example:
                      if($username === null) 
                      {
                       header('location:index.php'); //redirects to index.php
                      }
                  }
              ?>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
              <html xmlns="http://www.w3.org/1999/xhtml">
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <title>Login</title>
              </head>
              <body>
              <form id="form1" name="form1" method="post" action="login.php">
              <input name="txtUsername" type="text" id="txtUsername" size="30" maxlength="100" />
              <input name="txtPassword" type="password" id="txtPassword" size="30" maxlength="100" />
              <input type="submit" name="btnLogin" id="btnLogin" value="Log In" />
              </form>
          </body>
      </html>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多