0

没有给出任何错误,但由于某种原因,代码似乎不起作用..

这是代码:

<?php

session_start();

require_once('inc/db.php');

if(isset($_SESSION['username'])) {
    header("location: index.php");
} else {
    try {
        $username = mysql_real_escape_string($_POST['username']);
        $password = mysql_real_escape_string($_POST['password']);

        $SQL = $dbh->prepare('SELECT * FROM users WHERE username =:username AND password =:password');
        $SQL->bindParam(':username', $username);
        $SQL->bindParam(':password', $password);
        $SQL->execute();
        $total = $SQL->rowCount();
        $row = $SQL->fetch();

        if($total > 0) {
            if($row['verified'] > 0) {
                $_SESSION['username'] = $username;
            } else {
                echo "Unverified";
            }
        } else {
            echo "Incorrect";
        }
    } catch(PDOException $e) {

    }
}

?>

谁能帮我看看有什么问题?非常感谢你:)

编辑::::

这是我的 db.php

<?php
try {
    $DB_NAME = 'users';
    $DB_USER = 'root';
    $DB_PASS = '';
    $dbh = new PDO('mysql:host=localhost;dbname='.$DB_NAME, $DB_USER, $DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "Error?";
}
?>
4

2 回答 2

2

这应该为您提供更好的服务,并在错误发生时识别错误

<?php
// inc/db.php

$dbh = new PDO('mysql:host=localhost;dbname=users;charset=utf8', 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

和你的主文件

<?php
// Remove these two lines when you've finished development
ini_set('display_errors', 'On');
error_reporting(E_ALL);

session_start();

if (isset($_SESSION['username'])) {
    header("Location: index.php");
    exit;
}

if (!isset($_POST['username'], $_POST['password'])) {
    throw new RuntimeException('Required POST parameters not present');
}

require_once __DIR__ . '/inc/db.php';

$SQL = $dbh->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$SQL->bindParam(':username', $_POST['username']);
$SQL->bindParam(':password', $_POST['password']);
$SQL->execute();
$row = $SQL->fetch(PDO::FETCH_ASSOC);

if ($row !== false) {
    if ($row['verified'] > 0) {
        $_SESSION['username'] = $username;
        // you probably want to redirect here or something
    } else {
        echo 'Unverified';
    }
} else {
    echo "Incorrect";
}
于 2013-08-16T03:54:57.697 回答
1

首先,您可以安全地删除以下语句。参数已经被 PDO 转义。您不必使用过时的方法来做到这一点。如果您没有活动的 mysql 连接,该方法也将不起作用

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

其次,您的脚本表明您没有加密密码并使用纯文本存储它们。这可能是一个很大的安全问题,因为任何有权访问您的数据库的人都可以看到用户密码。

第三,我建议你$e->getMessage()在你的 catch 块中回显,看看是否有任何异常抛出。

于 2013-08-16T03:39:08.220 回答