我的问题是我的脚本不会将新用户信息插入我的数据库表。我不知道为什么,我一直在看这个近3个小时,试图找到问题,但我似乎无法找到它。这是我的脚本(顺便说一下,SQLITE 3):
$db = sqlite_open("../../kinz/kinz-db.sqlite", 0666, $sqlerr);
$query_login = sqlite_query($db, "SELECT * FROM USERS WHERE USER = '$user'");
$result = sqlite_fetch_all($query_login, SQLITE_ASSOC);
$query_setId = sqlite_query($db, "SELECT * FROM USERS WHERE ID = (SELECT MAX(ID) FROM USERS)", $sqlerr);
$result2 = sqlite_fetch_all($query_setId, SQLITE_ASSOC);
$ID = $result2[0][ID] + 1;
if (count($result) >= 1) {
$_SESSION['regErr'] = "Username already in use";
header("Location: register.php");
exit();
} else {
/*This is the registration query*/$query_register = sqlite_query($db, "INSERT INTO USERS (ID, USER, DISPLAY_NAME, PASS_ENC1, PASS_ENC2) VALUES ($ID, '$user', '$displayName', '$pass_enc1', '$pass_enc2')", $sqlerr);
}
if (!$query_register) {
$_SESSION['regErr'] = $sqlerr;
header("Location: register.php");
exit();
} else {
$_SESSION['regSuccess'] = true;
}
答案 0 :(得分:1)
由于INSERT是无结果的SQL语句,因此您应该使用sqlite_exec()而不是sqlite_query()。
如果sqlite_query()或sqlite_exec()返回FALSE,您还应该报告发生了什么错误。您不必输出给用户,而是输出到可以读取它的位置。目前,您只将其存储在$ _SESSION中,这可能很难访问。
以下是我的写作方式:
$query_register = sqlite_exec($db, "INSERT INTO USERS
(ID, USER, DISPLAY_NAME, PASS_ENC1, PASS_ENC2) VALUES
($ID, '$user', '$displayName', '$pass_enc1', '$pass_enc2')", $sqlerr);
if ($query_register === false) {
error_log("Sqlite error in file ".__FILE__." on line ".__LINE__.": "
. $sqlerr);
}
另外,在将它们插入INSERT语句之前,我没有看到你是escaping variables。您需要小心避免SQL注入漏洞。
或者升级到SQLite3 API,它支持带有参数的prepared statements。在编写动态查询时,这对于防止SQL注入更加安全。
PDO_sqlite也支持预备语句,我建议使用PDO。