1

ウェブサイトのユーザーログインシステムを作成しようとしています。私はラップトップで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;
}

私のデータベースの構造は、email varchar(256)not null primary、password varchar(256)not null、accessint;です。また、セミコロンを使用した場合と使用しない場合のクエリを試しました。

4

2 に答える 2

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));
于 2012-11-18T23:57:47.907 に答える
0

エラーが発生していますか?

完全なDB構造を知らずに診断するのは難しいですが、一見すると、そのテーブルの列が指定した値と一致していないように見えます。

技術的には、列名は必須ではありませんが、指定しない場合は、各列に適切な値を順番に指定する必要があります。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

もちろん、これはパラメータバインディングパスワードストレージ、およびその他の多くの問題については考慮しません。

クエリの最後にあるセミコロンが問題を引き起こしている可能性もあります。古いmysql_*関数については、マニュアルでクエリの最後にセミコロンを付けないように明示的に記載されていることを知っています。ただし、PDOにはそれについて何もありません。最後にセミコロンを付けても問題ないと思いますが、セミコロンを削除して何が起こるかを確認します。(おそらく何もありません)。

于 2012-11-18T23:59:17.360 に答える