0

今回はコードを更新し、mysqli を使用しました。これ以上エラーは発生しませんが、今はログインできません。

<?php
$host = 'my host';
$user = 'me';
$PW = 'my password';
$dB = 'login';
$table = 'members';
$field = 'username';    
/* Create a new mysqli object with database connection parameters */
$mysqli = new mysqli($host, $user, $PW, $dB);
if(mysqli_connect_errno()) {
    echo "Connection Failed: " . mysqli_connect_errno();
    exit();
}    
//Grab User submitted information
$name = $_POST['username']; //login name
$pass = $_POST['password'];  //login password    
/* Create a prepared statement */
if($stmt = $mysqli -> prepare("SELECT f_name FROM $table WHERE $field=?
AND password=?")) {
    /* Bind parameters
    s - string, b - blob, i - int, etc */
    $stmt -> bind_param("ss", $name, $pass);
    /* Execute it */
    $stmt -> execute();        
    /* Bind results */

    $stmt -> bind_result($result);

    /* Fetch the value */

    $stmt -> fetch();

    if ($result == NULL) {
        echo "That combo of username and password is wrong!";
    }
    else{
        echo "Hello " . $result;
    }
    /* Close statement */
    $stmt -> close();
}
/* Close connection */
$mysqli -> close(); 
?>

今は動いていると思いますが、正しいIDとPWを入力しても、入力していないと表示されます。なぜこれを行うのかわかりません。

4

3 に答える 3

2

SQL クエリが無効です:

"SELECT * FROM members WHERE username = $name"
// will result in 
"SELECT * FROM members WHERE username = "
// if name is empty or
"SELECT * FROM members WHERE username = SOMEVALUE"
// if name is "SOMEVALUE".

いずれにせよ、SOMEVALUE は文字列として解釈されないため、無効なクエリ文字列です。これを試すことができます:

$result = mysql_query('SELECT * FROM members WHERE username = "'.mysql_real_escape_string($name).'"');

mysql_real_escape_string() は、問題や望ましくない動作を引き起こす可能性のある文字をエスケープするために使用されます。クエリ内の文字列は引用符で囲む必要があります。

PDO ( http://php.net/manual/en/book.pdo.php )を調べて、mysql インジェクションについて読むことをお勧めします。

于 2013-06-15T23:11:53.227 に答える
1

あなたの問題は

 $_POST["usersname"]

定義されていません。

$nameクエリでを使用する場合は、 this を使用しますmysql_real_escape_string($name)

これがあなたのコードである場合、SQLインジェクションの大惨事です。mysqli または PDO に変更する必要があります

于 2013-06-15T23:11:35.317 に答える