2

我刚开始学习 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;
    }


}   
?>

我做错了什么?

4

5 回答 5

4

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

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

于 2012-11-03T19:47:09.820 回答
2

您需要调用该函数才能处理更改密码。将此添加到文件底部,就在?>

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

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

于 2012-11-03T19:43:46.043 回答
1

如前所述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()

于 2012-11-04T05:06:08.770 回答
0

您的表单字段的名称与 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']);
于 2012-12-03T02:30:23.460 回答
0

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

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>
于 2012-11-03T20:52:50.330 回答