1

我正在尝试为我的网站编写用户登录系统。我在笔记本电脑上运行 WAMP 并使用 Aptana 进行开发。我一直试图让用户创建功能工作大约 3 天。这个功能在这里:

function create_new_user($email, $pass, $level){
$db = new PDO('mysql:host=localhost;dbname=jadams', 'root', '');
$insertQuery = "INSERT INTO jadams.user VALUES ($email, $pass, $level);";
$db->query($insertQuery);
return TRUE;
}

我已经多次重写了这个函数,使用准备好的语句和各种形式的条件检查,这只是最简单的一个,希望能弄清楚。无论我尝试什么,我都无法将插入到数据库中。我已经通过 phpMyAdmin 强行插入用户来获得这个登录功能:

function is_pass_correct($email, $pass){
$db = new PDO('mysql:host=localhost;dbname=jadams', 'root', '');
$email = $db->quote($email);
$selectQuery = "SELECT password FROM jadams.user WHERE email = $email;";
$rows = $db->query($selectQuery);
$db=NULL;
if($rows) {
    foreach ($rows as $row) {
        if($pass === $row["password"]) {return TRUE;}   //MD5
    }
}
return FALSE;
}

我的数据库的结构是 email varchar(256) not null primary, password varchar(256) not null, access int; 我也尝试过使用和不使用分号的查询。

4

2 回答 2

2

您缺少要在其中插入值的列名。

"INSERT INTO jadams.user (email, password, level) VALUES ($email, $pass, $level);"

此外,由于您使用的是 PDO 库,请考虑使用准备好的语句来转义不受信任的数据。

$insertQuery = "INSERT INTO jadams.user (email, password, level) 
                VALUES (:email, :password, :level)";
$db = $conn->prepare($insertQuery);
$db->execute(array(':email'=>$email,
                   ':password'=>$pass,
                    ':level'=>$level));
于 2012-11-18T23:57:47.907 回答
0

你有错误吗?

如果不知道完整的数据库结构,就很难诊断,但乍一看,该表中的列可能与您提供的值不匹配。

从技术上讲,列名不是必需的,但如果您不提供它们,那么您必须按顺序为每列提供适当的值。如果userID您未设置某个或其他字段,则可能是问题所在。

从手册

如果您没有为 INSERT ... VALUES 或 INSERT ... SELECT 指定列名列表,则表中每一列的值必须由 VALUES 列表或 SELECT 语句提供。

为了安全起见,我建议明确设置列名,如下所示:

INSERT INTO 
   jadams.user (email, password, level) 
VALUES ($email, $pass, $level)

我个人更喜欢 INSERT INTO ... SET 语法。它感觉更具可读性并且不太容易混淆列。

INSERT INTO 
    jadams.user 
SET 
    email = $email, 
    password = $password 
    level = $level

当然,这不涉及参数绑定密码存储以及您还想考虑的其他一大堆问题。

查询末尾的分号也可能导致问题。我知道对于旧的 mysql_* 函数,手册明确指出您不应该查询末尾使用分号。但是,在 PDO 中没有任何内容。我认为现在在末尾有一个分号很好,但我会尝试删除它,看看会发生什么。(可能什么都没有)。

于 2012-11-18T23:59:17.360 回答