-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_query()の代わりに sqlite_exec() を使用する必要があります。

また、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 に答える