【问题标题】:let user change their own password?让用户更改自己的密码?
【发布时间】:2012-11-03 19:40:23
【问题描述】:

我刚开始学习 php 和 sql,所以请放轻松,我知道我在某些地方会出错。我正在尝试允许用户登录并能够更改他们的密码。我尝试了一个我认为应该可以工作的脚本,但我想我做错了什么,因为它只会链接到 php 函数页面,根本不会更改密码。这是我的脚本:

HTML 表单:

<form method="POST" action="includes/changepassword.php">
<p><input type="password" name="oldpasswd" id="oldpasswd" maxlength="30" placeholder="Old Password"></p>
<p><input type="password" name="newpsswd1" id="newpsswd1" maxlength="30" placeholder="New Password"></p>
<p><input type="password" name="newpsswd2" id="newpsswd2"maxlength="30" placeholder="Confirm Password"></p>
<input type="submit" name="submit" id="submit" value="change password">

更改密码.php 文件:

 <?php
require_once("session.php"); 
require_once("functions.php");
require('_config/connection.php');
function changepassword ($oldpasswd, $newpasswd1, $newpasswd2) {
    /*
     * RETURNS
     * 0 - if password changed
     * 1 - if new passwords are not equal
     * 2 - if user authentification problems
     */


        $oldpasswd = ($_POST['oldpasswd']);
        $newpasswd1 = ($_POST['newpasswd1']);
        $newpasswd1 = ($_POST['newpasswd2']);




    if ($newpasswd1 != $newpasswd2) {
        return 1;
    }

    //check user logged in changes OWN passwd
    $sql = "SELECT password FROM ptb_users WHERE id = ".$_SESSION['user_id'];
    $result = mysql_query($sql)or die('User not found: ' . mysql_error());

    if (md5($oldpasswd)==$result) { 

        //Encrypt $emailpassword in MD5 format for the database
        $md5_np=md5($newpasswd1);

        // Make a safe query
        $query = sprintf("UPDATE `ptb_users` SET `password` = '%s' 
                    WHERE `id` = ".$_SESSION['user_id'],
                    mysql_real_escape_string($md5_np));

        mysql_query($query)or die('Could not update password: ' . mysql_error());
        return 0;
    } else {
        return 2;
    }


}   
?>

我做错了什么?

【问题讨论】:

标签: php sql passwords


【解决方案1】:

它只会链接到php功能页面,根本不会更改密码

您告诉 HTML 表单这样做:&lt;form method="POST" action="includes/changepassword.php"&gt;。但另一方面,你永远不会调用你的函数。

【讨论】:

    【解决方案2】:

    您需要调用该函数来处理更改密码。将此添加到文件底部 ?&gt; 之前

    echo changepassword($_POST['oldpasswd'], $_POST['newpasswd1'], $_POST['newpasswd2']);
    

    您还可以删除函数中的 $_POST 分配,因为您将它们作为参数传递。

    【讨论】:

    • 它没有显示内容,它链接到changepassword.php并且页面是空白的。但该功能没有被执行。我不知道为什么会这样。
    • @MatthewWilliams 你声明了这个函数,你说它存在,但实际上你并没有调用这个函数。
    • 好的,谢谢,我将它添加到底部的 changepassword.php 文件中,但似乎并没有解决问题。
    【解决方案3】:

    正如poke 提到的,您需要调用该函数才能更新密码。
    我想我在下面的代码中发现了另一个问题:

    //check user logged in changes OWN passwd
    $sql = "SELECT password FROM ptb_users WHERE id = ".$_SESSION['user_id'];
    $result = mysql_query($sql)or die('User not found: ' . mysql_error());
    
    if (md5($oldpasswd)==$result) { 
    

    您正在直接使用mysql_query() 函数的结果,该函数实际上作为资源而不是值返回。

    您需要将代码更新为:

    //check user logged in changes OWN passwd
    $sql = "SELECT password FROM ptb_users WHERE id = ".$_SESSION['user_id'];
    $result = mysql_query($sql)or die('User not found: ' . mysql_error());
    $row=mysql_fetch_assoc($result);
    if (md5($oldpasswd)==$row['password']) { 
    

    查看此功能-mysql_fetch_assoc()。

    【讨论】:

      【解决方案4】:

      找一个关于表单处理的教程,经过一番搜索如果偶然发现了这个form tutorial,看起来很容易理解。您会看到,大多数表单都自称。

      formchangepassword.html

      <form action="formchangepassword.html" method="post">
      

      在表单的开头通常有一些代码,它决定表单是用post(按下按钮后)调用的,还是用get 调用的。在这段代码中,您可以调用您在 CHANGEPASSWORD.PHP 文件中编写的函数。这个文件只是一个库,它包含函数,你可以调用这个函数但它们不会自己运行,它们必须被调用。

      <?php
        require_once("CHANGEPASSWORD.PHP");
      
        if(count($_POST) > 0)
        {
          // button was clicked, do what is necessary
          changepassword(...);
          ...
        }
      ?>
      <form action="formchangepassword.html" method="post">
      ...
      </form>
      

      【讨论】:

        【解决方案5】:

        表单字段的名称与 changepassword.php 中列出的名称不匹配。你在应该是“newpasswd1”和“newpasswd2”的地方缺少一个“a”——name=newpsswd1应该是newpasswd1等等。

        您还列出了两次“newpasswd1”

         $oldpasswd = ($_POST['oldpasswd']);
         $newpasswd**1** = ($_POST['newpasswd1']);
         $newpasswd**1** = ($_POST['newpasswd2']);
        

        ...我想你可能是这个意思...

         $oldpasswd = ($_POST['oldpasswd']);
         $newpasswd**1** = ($_POST['newpasswd1']);
         $newpasswd**2** = ($_POST['newpasswd2']);
        

        我还结合了 Pastor Bones 和 Abhishek Bhatia 建议的更改,现在效果很好。 (我也是 HTML 的关闭表单标签)

        这是整个事情的样子(针对我的网站进行了修改):

        HTML 表单

        <form method="POST" action="changepassword.php">
        <p><input type="password" name="oldpasswd" id="oldpasswd" maxlength="30" placeholder="Old Password"></p>
        <p><input type="password" name="newpasswd1" id="newpasswd1" maxlength="30" placeholder="New Password"></p>
        <p><input type="password" name="newpasswd2" id="newpasswd2"maxlength="30" placeholder="Confirm Password"></p>
        <input type="submit" name="submit" id="submit" value="change password">
        </form>
        

        更改密码.php

        function changepassword ($oldpasswd, $newpasswd1, $newpasswd2)
        {
                $oldpasswd = ($_POST['oldpasswd']);
                $newpasswd1 = ($_POST['newpasswd1']);
                $newpasswd2 = ($_POST['newpasswd2']);
        
            if ($newpasswd1 != $newpasswd2)
            {
                return 1;
            }
        
            $sql = "SELECT Password FROM users WHERE UserID = ".$_SESSION['UserId'];
            $result = mysql_query($sql)or die('User not found: ' . mysql_error());
            $row=mysql_fetch_assoc($result);
        
            if (md5($oldpasswd)==$row['Password'])
            {
                $md5_np=md5($newpasswd1);
                $query = sprintf("UPDATE `users` SET `Password` = '%s' WHERE `UserID` ".$_SESSION['UserId'],mysql_real_escape_string($md5_np));
        
                mysql_query($query)or die('Could not update password: ' . mysql_error());
                return 0;
            }
            else
            {
                return 2;
            }
        }   
        
        echo changepassword($_POST['oldpasswd'], $_POST['newpasswd1'], $_POST['newpasswd2']);
        

        【讨论】:

          猜你喜欢
          • 2020-08-15
          • 2011-09-09
          • 2021-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多