我的功能要求很简单,就是一个更改密码的功能,密码用md5加密存储在mysql中。表单三个字段:Password1原密码、Password2新密码,Password3确认真密码。function turnTo($prompt,$url)
{
echo <<<content
<script language="javascript">
alert("$prompt");
window.location.href="$url";
</script>
content;
}
if(!empty($_POST["Password1"]) && !empty($_POST["Password2"]))
{
require_once("include/connect.php");
$con = new connect($host,$user,$password,$db); $sql = "select PassWord from test where ID = 1";
$query = mysql_query($sql,$con->link); if($query && $result=mysql_fetch_array($query,MYSQL_ASSOC))
{
$temp = md5($_POST["Password1"]);
if($temp == $result["PassWord"])
{
$newPassword = md5($_POST["Password2"]);
$sql = "update test set PassWord = '$newSPassword' where ID = 1";
$query = mysql_query($sql,$con->link);
if($query)
{
turnTo("修改密码成功!",$_SERVER['PHP_SELF']);
}
else turnTo("修改密码失败!",$_SERVER['PHP_SELF']);
}
else turnTo("你输入的密码不符!",$_SERVER['PHP_SELF']);
}
}这个功能很简单,可是,真得很搞笑,比方原密码是admin,我输入PassWord1 ='admin',PassWord2='123';
提示:你输入的密码不符!,但是去看Mysql,确是密码已经修改成功了?我调试了很久,如果用zend studio的调试模式就没有问题,if($temp == $result["PassWord"])凑效,但是运行起来就是不一样。好像php似乎先update了然后再select,这样的话取出的结果再判断,自然提示与原密码不相符合。我晕,崩溃了。到底怎么回事啊,该如何解决?另外,就是,如果我源密码输错,系统也提示 你输入的密码不符!但是这时看mysql,密码没有改到。似乎输入源密码正不正确都判断“你输入的密码不符”。解决了给100分啊。

解决方案 »

  1.   

    看着好像没问题嘛,把你完整的代码贴出来看看.(包括<input type=password的)
      

  2.   

    没什么代码了,只有一点。我真得好奇怪。
    表:
    create table test(
    id int not null auto_increment,
    password varchar(100),
    PRIMARY KEY (id)
    );
    html:
    <form name="form1" action="" method="post">
    <h1 id="title">登陆密码修改</h1>
    <h2 id="login">请输入您的原密码与新密码</h2>
    <p class="formt">原密码</p>
    <p><input name="Password1" type="text" class="password"></p>
    <p class="formt">新密码</p>
    <p><input name="Password2" type="text" class="password"></p>
    <p class="formt">再输入一次新密码</p>
    <p><input name="Password3" type="text" class="password"></p>
    <p id="button"><input type="image" src="images/loginin.gif" class="imgbutton"  onClick="return checkapply()"/></p>
    </form>checkapply()是一个简单的javascript验表。
    对了:
    $newPassword = md5($_POST["Password2"]);
    $sql = "update test set PassWord = '$newSPassword' where ID = 1"; //这里多了一个S,但是我的程序
    没问题,放上csdn上不小心弄错了。
      

  3.   

    用echo多打几个断点看看流程到底怎么样.
    希望LZ解决以后告知原因,这实在太奇怪了.
      

  4.   

    能不能把echo $temp; echo $result["PassWord"]) 输出出来看看什么吗?
      

  5.   

    你的turnTo方法,先用print_r看结果试试
      

  6.   

    sql中。表单三个字段:Password1原密码、Password2新密码,Password3确认真密码。 
    这个功能很简单,可是,真得很搞笑,比方原密码是admin,我输入PassWord1 ='admin',PassWord2='123';
    ,但是去看Mysql,确是密码已经修改成功了? LZ,你的password1是admin(原密码), Password2是新密码 ,按你的程序看,你提交了之后是完全可以把密码改掉的,提示:你输入的密码不符!  这一部分在你的php程序里貌似没有看到判断的地方,所以说你的提示很有可能是用js做的,可能提示之后跳转出了点问题..if(!empty($_POST["Password1"]) && !empty($_POST["Password2"]) && !empty($_POST["Password3"]))
     { 
    if( $_POST["Password2"] != $_POST["Password3"] )
    {
    turnTo("修改密码失败!",$_SERVER['PHP_SELF']);
    exit;
    }
    require_once("include/connect.php"); 
    $con = new connect($host,$user,$password,$db); 
    $sql = "select PassWord from test where ID = 1"; 
    $query = mysql_query($sql,$con->link); 
    if($query && $result=mysql_fetch_array($query,MYSQL_ASSOC))
     {
     $temp = md5($_POST["Password1"]); 
    if($temp == $result["PassWord"])
     {
     $newPassword = md5($_POST["Password2"]); 
    $sql = "update test set PassWord = '$newSPassword' where ID = 1";
     $query = mysql_query(
    $sql,$con->link); 
    if($query) 
    {
     turnTo("修改密码成功!",$_SERVER['PHP_SELF']); 
    } else 
    turnTo("修改密码失败!",$_SERVER['PHP_SELF']);
     } 
    else turnTo("你输入的密码不符!",$_SERVER['PHP_SELF']);
     
    }
     }
      

  7.   

    只能断点调试了.
    1   $sql = "select PassWord from test where ID = 1";
        $query = mysql_query($sql,$con->link);
        后加if(mysql_error() != "")
           { 
             echo mysql_error();
             exit();
           }
    2   $temp = md5($_POST["Password1"]);
        前加:
        var_dump($temp) . "<br/>";
        var_dump(md5($_POST["Password1"])) . "<br/>";
        exit();    
      

  8.   

    if(){
    }else{
    }
    多几对括号会死啊
      

  9.   

    难道php先update后select的,不是这样的,如果出现上述问题,应该是你代码出问题了!
      

  10.   

    谢谢楼上的各位。10楼,你知道原因吧?知道的话麻烦告知哪里出错。if(!empty($_POST["Password1"]) && !empty($_POST["Password2"]) && !empty($_POST["Password3"]))
     { 
    if( $_POST["Password2"] != $_POST["Password3"] ) //判断Password2与Password3相不相同的由客户端js完成
    {                                                //所有这部分可以不要,其他的我试一下。
    turnTo("修改密码失败!",$_SERVER['PHP_SELF']);
    exit;
    }
    require_once("include/connect.php"); 
    $con = new connect($host,$user,$password,$db); 
    $sql = "select PassWord from test where ID = 1"; 
    $query = mysql_query($sql,$con->link); 
    if($query && $result=mysql_fetch_array($query,MYSQL_ASSOC))
     {
     $temp = md5($_POST["Password1"]); 
    if($temp == $result["PassWord"])
     {
     $newPassword = md5($_POST["Password2"]); 
    $sql = "update test set PassWord = '$newPassword' where ID = 1";
     $query = mysql_query(
    $sql,$con->link); 
    if($query) 
    {
     turnTo("修改密码成功!",$_SERVER['PHP_SELF']); 
    } else 
    turnTo("修改密码失败!",$_SERVER['PHP_SELF']);
     } 
    else turnTo("你输入的密码不符!",$_SERVER['PHP_SELF']);
     
    }
     }另外,我也多增加一此输出看看。
      

  11.   

    NND,黄网??LZ所说的那个地主,最好还是判断一下
      

  12.   

    为便于测试,我把程序小改如下:function alert($prompt)//弹出提示消息。
    {
    echo <<<content
    <script language="javascript">
    alert("$prompt");
    </script>
    content;
    }echo <<<temp1
    \$_POST["Password1"]:$_POST[Password1]<br>
    \$_POST["Password2"]:$_POST[Password2]<br>
    \$_POST["Password3"]:$_POST[Password3]<br>
    temp1;
    if(!empty($_POST["Password1"]) && !empty($_POST["Password2"]))
    {
    require_once("include/connect.php");
    $con = new connect($host,$user,$password,$db); $sql = "select PassWord from test where ID = 1";
    $query = mysql_query($sql,$con->link); if($query && $result=mysql_fetch_array($query,MYSQL_ASSOC))
    {
    $temp = md5($_POST["Password1"]);
    echo "md5(\$_POST[\"Password1\"]):$temp<br>";
    echo "\$result[\"PassWord\"]:$result[PassWord]<br>";
    if($temp == $result["PassWord"])
    {   echo "已经进入判断\$temp==\$result[\"PassWord\"]成功<br>";
    $newPassword = md5($_POST["Password2"]);
    echo "\$newPassword:$newPassword<br>";
    $sql = "update test set PassWord = '$newPassword' where ID = 1";
    echo "\$sql:$sql<br>";
    $query = mysql_query($sql,$con->link);
    if($query)
    {
    alert("修改密码成功!");
    }
    else alert("修改密码失败!");
    }
    else alert("你输入的密码不符!");
    }
    }原密码是:admin
    输入:admin admin admin 提示修改密码成功!
    输出:
    $_POST["Password1"]:admin
    $_POST["Password2"]:admin
    $_POST["Password3"]:admin
    md5($_POST["Password1"]):21232f297a57a5a743894a0e4a801fc3
    $result["PassWord"]:21232f297a57a5a743894a0e4a801fc3
    已经进入判断$temp==$result["PassWord"]成功
    $newPassword:21232f297a57a5a743894a0e4a801fc3
    $sql:update test set PassWord = '21232f297a57a5a743894a0e4a801fc3' where ID = 1输入:admin 123 123 提示你输入的密码不符!
    提示:
    $_POST["Password1"]:admin
    $_POST["Password2"]:123
    $_POST["Password3"]:123
    md5($_POST["Password1"]):21232f297a57a5a743894a0e4a801fc3
    $result["PassWord"]:202cb962ac59075b964b07152d234b70 //这个是update后的结果啊,晕。
    mysql> select * from test;
    +----+----------------------------------+
    | id | password                         |
    +----+----------------------------------+
    |  1 | 202cb962ac59075b964b07152d234b70 |
    +----+----------------------------------+
    mysql已经修改了啊。这时密码变成了123。这时输入:123 123 123 提示修改成功。
    $_POST["Password1"]:123
    $_POST["Password2"]:123
    $_POST["Password3"]:123
    md5($_POST["Password1"]):202cb962ac59075b964b07152d234b70
    $result["PassWord"]:202cb962ac59075b964b07152d234b70
    已经进入判断$temp==$result["PassWord"]成功
    $newPassword:202cb962ac59075b964b07152d234b70
    $sql:update test set PassWord = '202cb962ac59075b964b07152d234b70' where ID = 1故意输错密码:565g 123 123 提示“你输入的密码不符”。
    $_POST["Password1"]:565g
    $_POST["Password2"]:123
    $_POST["Password3"]:123
    md5($_POST["Password1"]):5b01db5814b5baa98d57a6e1d1269676
    $result["PassWord"]:202cb962ac59075b964b07152d234b70难以理解了。
      

  13.   

    输入:admin 123 123 提示你输入的密码不符! 这是在什么地方提示的,应该是JS吧,你JS写的有问题...程序是对的啊,运行结果也是对的!最好在程序里加上password2与password2的验证,因为js不可靠,不同浏览器支持的也不一样
      

  14.   

    phpBoy005 我用你的代码结果跟我的也一样。没人知道原因吗?好奇怪啊。
      

  15.   

    你的那个提示 肯定不是程序出来的,而是JS出来的,所以说你的程序没错,错的是你写的JS代码
      

  16.   

    输入:admin 123 123 提示你输入的密码不符! 
    提示: 
    $_POST["Password1"]:admin 
    $_POST["Password2"]:123 
    $_POST["Password3"]:123 
    md5($_POST["Password1"]):21232f297a57a5a743894a0e4a801fc3 
    $result["PassWord"]:202cb962ac59075b964b07152d234b70 //这个是update后的结果啊,晕。 
    mysql> select * from test; 
    +----+----------------------------------+ 
    | id | password                        | 
    +----+----------------------------------+ 
    |  1 | 202cb962ac59075b964b07152d234b70 | 
    +----+----------------------------------+ 
    mysql已经修改了啊。这时密码变成了123。 这句没有提示:已经进入判断$temp==$result["PassWord"]成功 
    你说是php问题还是js问题?如果进入了判断块,一定会有这个提示的,这可能是php输出缓存的问题。我暂时想。
      

  17.   

    十分复杂吗???其实这些只需要有个浏览器的调试,服务器端 做几个echo,和sleep几秒,自己在MySQL命令行里面看看结果,慢慢的就知道错在哪里了.浏览器的调试一定要配合服务器的调试,因为浏览器是有缓存的(AJax在IE不关闭进程的情况下好像清除不了缓存)
      

  18.   

    大家好,还是我,这个问题依然没有解决。昨天忙,没时间研究了。
    考虑到可能是JS的问题,于是我把
                if($query)
                {
                    alert("修改密码成功!");
                }
                else alert("修改密码失败!");
            }
            else alert("你输入的密码不符!");
    改成:
       if($query)
        {
    echo "修改密码成功!";
        }
        else echo "修改密码失败!";
    }
            else echo "你输入的密码不符!";
    问题依然。再考虑到sql的buffer问题。把mysql_query()改成mysql_unbuffered_query(),结果还是一样。这回真得
    晕了。我猜测php可能是在处理包括sql连接查询等的页面,会把所有的sql缓存起来,先递交给mysql查询,完成查询结果,
    再返回处理php。因此,返回的结果是已经update后的结果,因此造成上述的情况。只是个人猜测而已。再后来,以为是md5()作怪,去掉,无果。还试了其他方法,只要在浏览器运行就是提示“你输入的密码不符”,但实际上已经修改成功了。我实在无法理解了。哪一位帮忙啊,不行的话写一个程序给我,分全部给他,分不够开帖再送100分也行。功能要求很简单。
    表单三个Text,password1、password2、password3,分别是用来原密码,新密码,重复输入新密码。
    提交后,php先判断password1与用户的密码相不相同(不相同的话给出提示),相同的话才修改密码。修改成功与否与给提示。这个功能很简单啊。help~~~help~~~~~
      

  19.   

    昨天没仔细看,现在一看知道了大概。 你的逻辑问题啊 -。-
    if(!empty($_POST["Password1"]) && !empty($_POST["Password2"]))
    {
       .......
    }
    这个逻辑好像怎么都会进去 -。- 正确好的逻辑做法应该是转去另外一个页面吗? 
    比如成功 ChangePwd.php?result=success
    比如失败 ChangePwd.php?result=fail
    比如失败 ChangePwd.php?result=db_error
    这样也比JS更好
      

  20.   

    我输入以下程序完全没有问题,楼主比较一下吧:
    chg.php
    <?php
    function turnTo($prompt,$url)
    {
        echo <<<content
    <script language="javascript">
    alert("$prompt");
    window.location.href="$url";
    </script>
    content;
    }if(!empty($_POST["Password1"]) && !empty($_POST["Password2"]))
    {    $con = mysql_connect("localhost","root","pass","test");    $sql = "select PassWord from test.test where ID = 1";
        $query = mysql_query($sql,$con);
        if($query && $result=mysql_fetch_array($query,MYSQL_ASSOC))
        {
            $temp = md5($_POST["Password1"]);
            if($temp == $result["PassWord"])
            {
                $newPassword = md5($_POST["Password2"]);
                $sql = "update test.test set PassWord = '$newPassword' where ID = 1";
                $query = mysql_query($sql,$con);
                if($query)
                {
                    turnTo("修改密码成功!",$_SERVER['PHP_SELF']);
                }
                else turnTo("修改密码失败!",$_SERVER['PHP_SELF']);
            }
            else turnTo("你输入的密码不符!",$_SERVER['PHP_SELF']);
        } else echo "oops";
    }
    ?>
    <form name="form1" action="./chg.php" method="post">
    <h1 id="title">登陆密码修改 </h1>
    <h2 id="login">请输入您的原密码与新密码 </h2>
    <p class="formt">原密码 </p>
    <p> <input name="Password1" type="text" class="password"> </p>
    <p class="formt">新密码 </p>
    <p> <input name="Password2" type="text" class="password"> </p>
    <p class="formt">再输入一次新密码 </p>
    <p> <input name="Password3" type="text" class="password"> </p>
    <p id="button"> <input type="image" src="images/loginin.gif" class="imgbutton"  onClick=";"/> </p>
    </form>
      

  21.   

    昨天没来,以为没人会看了。谢谢楼上的。你给我的程序,我试了一下,由于$con = mysql_connect("localhost","root","pass","test");
    看不懂,没看过这种连法,mysql_connet有第四个参数吗?我用你的程序怎么输入都是echo "oops";以为mysql_connet有问题,便改成自己的连接,这回不是每次都是
    echo "oops";但是跟我的原来的情况又是一样。输入正确的密码总是提示“你输入的密码不符”,而事实上已经修改密码
    成功。还是未果,在你那边真得没有问题吗?如果没有,而在我这却有问题,难道跟php设置有关?
      

  22.   

    把你的connect.php贴上来看看.
    我这边真的没问题. mysql_connect拷贝你的,第四个参数忘记删掉了,不过执行没问题.
    你用IE,Firefox结果都一样么?我这边都没问题.
      

  23.   

    这个是我的,好象加了验证玛
    $validcode=$HTTP_POST_VARS[validcode];
    $old_pass=$HTTP_POST_VARS[old_pass];
    $new_pass1=$HTTP_POST_VARS[new_pass1];
    $new_pass2=$HTTP_POST_VARS[new_pass2];
    $validcode=md5($validcode);
    if($_SESSION['SafeCode']==$validcode)
    {
    $old_pass=md5($old_pass);
    $new_pass1=md5($new_pass1);
    $new_pass2=md5($new_pass2);
    if($new_pass1==$new_pass2)
    {
    $sqlold = "select * from kejian_admin  where name='$_SESSION[user_name]'";
    $result_old=mysql_query($sqlold);
    $arr_old=mysql_fetch_array($result_old);
    $password=$arr_old['pwd'];
    if($old_pass==$password)
    {
    $query = "update kejian_admin set pwd='$new_pass1' WHERE name='$admin_user'";
    $DBLINK->Query($query);
    echo $mesg.="<center>资料已经更新.<br>密码已经修改,下次登陆请输入新密码.<br><br>";
    }else{
    echo $mesg.="<center>原密码不正确.<br><br>";
    }
    }else{
    echo $mesg.="<center>两次输入的新密码不一致.<br><br>";
    }
    }else{
    echo $mesg.="<center>认证码不正确或已过期<br><br>";
    }
      

  24.   

    楼上的,你跟我的算法一样。都是先取旧密码,然后比较post的原密码md5,相同之后才update。反正只要是这种算法,在我那边就有问题,初步怀疑跟环境有关,或者与php设置有关。最后我想到的办法是用session来解决,用户进入系统后用session记录他的密码,然后直接比较session记录的密码。这样就没有问题。提示也正确。对比原来的,少了一条select语句,这样则没有问题。这离找到原因更进一步。