【问题标题】:PHP/SQL - Won't Insert New User into Table [closed]PHP / SQL - 不会将新用户插入表中[关闭]
【发布时间】:2012-12-08 23:49:34
【问题描述】:

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

【问题讨论】:

  • 有什么错误吗?我假设 sqlite3 也有错误报告功能?
  • 确实如此,并且我打印了错误。但是没有;它只是一个空变量
  • 你真的应该能够将其缩小到一行或两行。
  • PHP 没有获取 sqlite3 的最后一个错误的功能吗?就像 mysql_error 什么的?我在你的代码中没有看到任何这些。
  • @Kinz:您几乎没有进行错误检查...$db = sqlitee_open(...) 失败了吗? $query_login = sqlite_query(...) 失败了吗?您必须进行错误检查;我们不能为你做。

标签: php sql sqlite insert


【解决方案1】:

由于 INSERT 是一条无结果的 SQL 语句,您可能应该使用 sqlite_exec() 而不是 sqlite_query()。

如果 sqlite_query() 或 sqlite_exec() 返回 FALSE,您还应该报告 what 错误。您不必输出给用户,而是输出到您可以阅读的地方。目前您只将它存储在 $_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 也支持prepared statements,我推荐使用PDO。

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多