PHP MySQL / PDO UPDATE查询无法执行

时间:2015-10-30 16:38:35

标签: php mysql pdo

我对所有这些事情都很陌生,我真的很难过。我已经尝试了一天半的时间让这部分代码工作,我尝试过很多不同的事情。它只是不想为我工作。

这是整个剧本

<?php
$dbusername = "****";  // info works to connect to login
$dbpassword = "****";  // and everything works fine retrieving
$dbhost = "localhost"; // the email to send the code to (which all works)
$dbname = "****"; 
try {
$conn = new PDO("mysql:host={$dbhost};dbname={$dbname};charset=utf8", $dbusername, $dbpassword);
}
catch(PDOException $ex)
{
    $msg = "Failed to connect to the database";
}

function getToken($length=32){
//redacted - working and unrelated, suffice it to say the token returns properly
return $token;
}

if (isset($_POST["ForgotPassword"])) {

    if (filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)) {
        $email = $_POST["email"];

    }else{
        echo "Email is invalid.";
        exit;
    }

    // Check to see if a user exists with this e-mail
    $query = $conn->prepare('SELECT email FROM users WHERE email = :email');
    $query->bindParam(':email', $email);
    $query->execute();
    $userExists = $query->fetch(PDO::FETCH_ASSOC);
    $conn = null

    if ($userExists["email"])
    {
        $resetpass = getToken();        

        try {
            $conn = new PDO("mysql:host={$dbhost};dbname={$dbname};charset=utf8", $dbusername, $dbpassword);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $stmt = $conn->prepare('UPDATE users SET passwordreset=:resetpass WHERE email=:email');
            $stmt->bindParam(':resetpass', $resetpass);
            $stmt->bindParam(':email', $email);
            $stmt->execute();

            echo $stmt->rowCount() . " records UPDATED successfully";
            }
        catch(PDOException $e)
            {
            echo $sql . "<br>" . $e->getMessage(); //$sql not set anymore
            }

        $conn = null;



    // Create a url which we will direct them to reset their password
    $pwrurl = "*******/reset_password.php?q=".$resetpass;

    // Mail them their key
    $mailbody = "redacted \n\n" . $pwrurl;
    mail($userExists["email"], "redacted", $mailbody);
    echo "Your password recovery key has been sent to your e-mail address.";

    }

    else
        echo "No user with that e-mail address exists.";
    }
?>

没有这个查询,其他一切都很有名。它打破了,不会在这里继续。它永远不会成功或失败。

编辑 这里也是HTML表单

<!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>Forgot Password</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<center>
<form action="change.php" method="POST">
<table align="center" width="30%" border="0">
<div> 
<tr>
<td><input type="text" name="email" placeholder="you@example.com" required /></td>
</tr>
<tr>
<td><button type="submit" name="ForgotPassword" value=" Request Reset ">Reset</button></td>
</tr>
</table>
</form>
</div>
</center>
</body>
</html>

3 个答案:

答案 0 :(得分:4)

现在您已发布完整代码......

您的代码失败是因为您的代码中存在 错误,导致一些 BIG 问题。

$conn = null
            ^ right there.

我知道这被认为是一个偏离主题的问题,但是我们已经这么久了,我觉得我必须提交它作为答案。 (请参阅下面的特别说明)。它并非完全偏离主题。

那里有一个缺少的分号;加上它。

$conn = null;

如果错误报告设置为捕获并显示代码中的错误,则会引发解析错误。

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

但是,您应该对所有条件语句使用适当的支撑,例如:

else
    echo "No user with that e-mail address exists.";

因为这可能会产生不利影响。

特别说明:

还有另外一件事,你在$token函数中return已经getToken()这个变量$sql。你没有在任何地方使用它,所以它不确定你想要用它做什么。

正如您在回答中的评论中所述,{{1}}并未做任何事情;它没有定义。但是,当错误报告设置为catch和display时,这不会导致代码失败,而只是抛出一个未定义的变量sql通知。

答案 1 :(得分:0)

由于我无法发表评论, 我也是php和pdo的新手。 我检查了代码,但似乎很好。

仅发现错误1)$ sql变量2)$ conn = null;(在第一次查询后缺少半冒号)。

您能否提供数据库端详细信息,表详细信息。 所以我可以尝试使用它并尝试找到解决方案。

答案 2 :(得分:-1)

http://php.net/manual/en/pdo.exec.php#refsect1-pdo.exec-examples

如果你看一下我提供的例子,你会发现没有所有bindParam函数就可以做到这一点。在执行之前设置SQL可能会有所帮助。

虽然没有经过测试 - 我最好的建议是创建一个$ sql变量,用于在创建SQL时存储SQL。

在某种程度上可以让你看到你的$ sql究竟是什么,并且在你确切地看到你想要执行的内容后,你可以更好地找到你的问题。

$sql = "UPDATE users SET passwordreset = '" . $resetpass . "' WHERE email ='" . $email . "' ";