-2

我的问题是我的脚本不会将新的用户信息插入到我的数据库表中。我不知道为什么,我一直在看这个将近 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;
}
4

1 回答 1

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 语句之前转义它们。您需要小心避免 SQL 注入漏洞。

或者升级到 SQLite3 API,它支持带参数的预处理语句。在编写动态查询时,这对于防止 SQL 注入更加安全。

PDO_sqlite也支持预处理语句,我推荐使用 PDO。

于 2012-12-09T00:27:37.943 回答