2012-11-18 80 views
1

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

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; 
} 

我的数据库的结构是电子邮件VARCHAR(256)NOT NULL主,密码为varchar(256)NOT NULL,访问INT;我也尝试了有和没有分号的查询。

+0

你可以给我们你的用户表中的字段列表吗? –

回答

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)); 
+0

我被告知这些是可选的,只要你填写正确,但我修改了代码: $ insertQuery =“INSERT INTO jadams.user(email,password,access)VALUES($ email,$ pass,$ level );“; 仍然没有运气 – SupremeGunman

+0

你有其他的列,如user_id吗? – rbaker86

+0

嗯,我用准备好的语句写了一次,但它没有工作,但我只是复制了这个工作。我想我应该保留旧的代码进行比较。非常感谢! – SupremeGunman

0

您是否收到错误?

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

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

From the manual

如果不指定表中的每一列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 

当然,这并不进入parameter bindingpassword storage,和其他问题一大堆,你还需要进行思考。

查询结尾的分号也可能导致问题。我知道旧的mysql_ *函数手册明确指出,你应该不是在查询结尾处有分号。但是,在PDO中没有关于这一点的信息。我假设现在在末尾有分号很好,但我会尝试删除它,看看会发生什么。 (可能没有)。

+0

我的数据库的结构是电子邮件varchar(256)不是空主,密码varchar(256)非空,访问int – SupremeGunman

+1

我确实有很多其他安全问题的地址,一旦我得到这个工作。 – SupremeGunman

+0

嗯,我能想到的唯一两件事是类型不匹配,或在查询结束时引起问题的分号。 –