我正在尝试为我的网站编写用户登录系统。我正在我的笔记本电脑上运行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;
}
我的数据库的结构是电子邮件varchar(256)not null primary,password varchar(256)not null,access 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));
答案 1 :(得分: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
当然,这不会进入parameter binding,password storage以及您还想要考虑的许多其他问题。
查询结尾处的分号也可能导致问题。我知道对于旧的mysql_ *函数,手册明确声明你应该不在查询结尾处有分号。但是,在PDO中没有任何相关内容。我假设现在最后有一个分号,但我会尝试删除它,看看会发生什么。 (可能没什么)。