0

私は現在、Phpacademy の Alex による Register & Login/PHP チュートリアルと呼ばれる Youtube のチュートリアルをフォローしています。

<?php
include 'core/init.php';

if (empty($_POST) === false) { 

    $username = $_POST['username']; 
    $password = $_POST['password']; 

    if (empty($username) === true || empty($password) ===   true) {

        $errors[]  = 'You need to enter a username and password ';

    } else if (user_exists($username) === false) {
        $errors[] = 'We couldn\'t find that username. Have you registered?';
    } 
    else if (user_active($username) === false){
        $errors[] = 'You havn\'t activated your account!';  
    } 
    else  { 
        $login = login($username, $password);
        if ($login === false) {
            $error[] = 'That username/password combination is incorrect';
        } else {
        $_SESSION['user_id'] = $login;
        header('Location: index.php');
        exit();
        }
    } 

}

print_r($errors);

?>

ここにusers.phpがあります

<?php

function user_exists($username) { 
$username = sanitize($username); 
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '.$username'"), 0) == 1) ? true : false;
}

function user_active($username) { 
$username = sanitize($username); 
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '.$username'  AND `active` = 1 ") , 0 ) == 1 ) ? true : false;

}

function user_id_from_username($username){

    $username = sanitize($username);
    return mysql_result (mysql_query("SELECT `user_id` FROM `users` WHERE `username` = '$username' "), 0, 'user_id');

}
function login($username, $password){

    $user_id = user_id_from_username($username);
    $username = sanitize($username);
    $password = md5($password);
    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '.$username' AND `password` = '.$password'"), 0) == 1) ? $user_id : false;
}
?>

そしてここに出力がありますArray ( [0] => We couldn't find that username. Have you registered? )

ここは初めてです、事前にお詫びします

4

4 に答える 4

0
WHERE `username` = '.$username' AND `password` = '.$password'"

ドットを削除します

于 2013-09-23T19:17:45.693 に答える
0

SQL クエリは悪い結果を返します。.jondそうしないと、入力したユーザー名が である場合、データベースでを検索することになりますjond

return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '.$username'"), 0) == 1) ? true : false;

.クエリのbefore$usernameとin を削除し$passwordます。

"SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"
于 2013-09-23T19:18:15.297 に答える
0

クエリには少し調整が必要です。二重引用符で囲まれているため、ユーザー名の前のピリオドを削除します

return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"), 0) == 1) ? true : false;

これは、そのファイル内の他のクエリでも同じです。コメントで述べたように、非推奨の mysql_* 関数から PDO/mysqli に切り替えて、コードが PHP の将来のバージョンでも機能し、インジェクション ハッキングにさらされないようにする必要があります。

于 2013-09-23T19:18:29.213 に答える
0

あなたのコードは全体的にかなりひどいです。そのように mysql 呼び出しをネストするべきではありません。そのような入れ子は、DB 操作が決して失敗しないと考えていることを意味します。これは非常に悪い仮定です。

そうは言っても、問題の少なくとも1つの原因は次のとおりです。

return (...snip ... WHERE `username` = '.$username'"), 0) == 1) ? true : false;
                                        ^--- here

.そのクエリにa を埋め込んだため.foo、すべてのユーザー名がfoo. 問題はANDの両方user_exists()に存在します。user_active() login()

于 2013-09-23T19:19:07.167 に答える