php没有在d.b中更新密码或令牌

时间:2013-05-22 22:37:08

标签: php

我忘记的密码不是更新令牌表,也不更新密码,当它保持回显下面的错误消息时,它是表单代码:

Forgot Password</strong></h3>
      <form name="forgot" method="POST" id="forgot" action="includes/reset.php">
        <div align="center">
          <table width="372" border="0">
            <tr>
              <td width="181"><p>&nbsp;</p>
                <p><strong>Password</strong></p></td>
              <td width="181"><span id="sprytextfield1"><br />
                <label for="label"></label>
                <input type="password" name="passsowrd" id="password" />
                <span class="textfieldRequiredMsg">Your password is required</span></span></td>
</tr>
            <tr>
              <td><p>&nbsp;</p>
                <p><strong>Confenter code hereirm Password</strong></p></td>
              <td><span id="spryconfirm2">
                <label for="password"></label>
                <input type="password" name="password2" id="password" />
                <span class="confirmRequiredMsg">A value is required.</span><span class="confirmInvalidMsg">The values don't match.</span></span></td>
</tr>
</table>
</div>
    <div align="center">
      <p>&nbsp;</p>
      <table width="98" border="0">
        <tr>
          <th width="44" scope="row"><input type="submit" name="submit" id="submit" value="submit" /></th>
          <th width="44" scope="row"><input type="reset" name="clear" id="clear" value="Clear" /></th>
        </tr>
      </table>
    </div>
    <div align="center">
      <table width="372" border="0">
        <tr> </tr>
        <tr> </tr>
      </table>
    </div>
  </form>

并且reset.php是:

<?php
session_start();
error_reporting(0);
$token=$_GET['token'];
include("settings.php");
connect();
if(!isset($_POST['password'])){
$q="select email from tokens where token='".$token."' and used=0";
$r=mysql_query($q);
while($row=mysql_fetch_array($r))
   {
$email=$row['email'];
   }
If ($email!=''){
          $_SESSION['email']=$email;
}
else die("Invalid link or Password already changed  <a href='../index.php'>Click here to go back to the HOME PAGE<a/>");}

$pass=$_POST['password'];
$email=$_SESSION['email'];

if(isset($_POST['password'])&&isset($_SESSION['email']))
{
$q="update registration set password='".md5($pass)."' where email='".$email."'";
$r=mysql_query($q);
if($r)mysql_query("update tokens set used=1 where token='".$token."'");echo "Your password is changed successfully  <a href='../index.php'>Click here to go back to the HOME PAGE<a/>";
if(!$r)echo "An error occurred";
    }

所以问题是以下错误消息一直在回显: 无效的链接或密码已更改。

如果我添加,我该怎么做:

if(!isset($pass)){
echo '<form method="post">
enter your new password:<input type="password" name="password" />
<input type="submit" value="Change Password">
</form>
';} 

然后它可以工作,但在新的空白页面打开它,这是非专业的,我试图将其添加到HTML

4 个答案:

答案 0 :(得分:0)

你的else die处于完全错误的地方。你总是会死,因为虽然循环结束时总是会评估为假。

如果您的意图在查询失败时死亡,您应该执行以下操作:

$r = mysql_query($q);

if (false === $r) {
    die(mysql_error());
}

while ($row = mysql_fetch_array($r)) {
   ...
}

当然我的一般建议是根本不使用mysql函数,因为它们在PHP 5.5中已被弃用。您还应确保明确处理查询的所有可能结果并记录有意义的错误以帮助您进行调试。

答案 1 :(得分:0)

您提交的代码中没有传递任何令牌

$token=$_GET['token']; 

来自脚本的令牌在哪里,它不是从数据库中调用它,

$q="select email from tokens where token='".$token."' and used=0";

你也没有防范任何sql注入,这应该真正得到解决,除非我错过了将令牌发送到重置页面的代码部分,如果是这样,我很抱歉

$r=mysql_query($q);
while($row=mysql_fetch_array($r))
   {
$email=$row['email'];
   }
If ($email!=''){
          $_SESSION['email']=$email;
}
else die

向下流动您的代码,您运行查询以选择令牌为空白的电子邮件,我假设没有返回电子邮件,所以如果电子邮件不是空白,请执行此操作,否则会死...它必须因为$而死电子邮件是空白的

答案 2 :(得分:0)

我打算编辑您的帖子,但有很多格式和语法问题我会将其作为答案发布。

<?php
    session_start();
    error_reporting(0);

    include 'settings.php';
    connect();

    $token = $_GET['token'];
    $pass = $_POST['password'];

    if (isset($pass) && isset($token)) {
       $q = 'SELECT email FROM tokens WHERE token=' . $token . ' AND used=0';
       $r = mysql_query($q);

       while ($row = mysql_fetch_array($r)) {
            $email = $row['email'];
        }

        if ($email != '') {
            $_SESSION['email'] = $email; // Why?

            $q = 'UPDATE registration SET password=' . md5($pass). ' WHERE email=' . $email;
            $r = mysql_query($q);

            if ($r) {
                mysql_query('UPDATE tokens SET used=1 WHERE token=' . $token);
                echo 'Your password is changed successfully <a href="../index.php">Click here to go back to the HOME PAGE<a/>';
            } else {
                echo 'An error occurred';
            }
        } else {
            die('Invalid link or Password already changed  <a href="../index.php">Click here to go back to the HOME PAGE<a/>');
        }
    }

这样可以让你走上正轨,请注意标签,花括号和最重要的,与编写代码的方式保持一致。坚持使用单个双引号,始终即使在单行if / else语句中也使用花括号。

但是,正如其他人所说的那样,这段代码仍然非常不安全且已被弃用,但它应该可行。

答案 3 :(得分:0)

您过早关闭了while块。将}移到die

下方