2

ユーザーがログインをクリックするとログインフォームがありますchecklogin.phpが呼び出され、trueの場合、ユーザー名とパスワードがデータベース上のすべてのレコードと一致するかどうかを確認する必要があります。

これまでのところ、正しいユーザー名&&パスワードであるにもかかわらず、間違ったパスワードユーザー名を取得しています。いくつか変更を加えましたが、echo、printf、エラーはありません

この問題を解決するにはどうすればよいですか?

<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="form1" method="post" action="checklogin.php">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong>Member Login </strong></td>
</tr>
<tr>
<td width="78">Username</td>
<td width="6">:</td>
<td width="294"><input name="myusername" type="text" id="myusername"></td>
</tr>
<tr>
<td>Password</td>
<td>:</td>
<td><input name="mypassword" type="text" id="mypassword"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Login"></td>
</tr>
</table>
</td>
</form>
</tr>
</table>

checklogin.php

<?php

    $mysqli = new mysqli('localhost', 'root', 'password', 'aiesec');

    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }


    // username and password sent from form
    $myusername=$_POST['myusername'];
    $mypassword=$_POST['mypassword'];

    // To protect MySQL injection (more detail about MySQL injection)
    $myusername = stripslashes($myusername);
    $mypassword = stripslashes($mypassword);
    $myusername = mysqli_real_escape_string($myusername);
    $mypassword = mysqli_real_escape_string($mypassword);



    // If result matched $myusername and $mypassword, table row must be 1 row


    $sql = "SELECT * FROM members WHERE username='$myusername' and password='$mypassword"; 
    if($result = mysqli->query($sql, MYSQLI_USE_RESULT)) 
    { 
        printf("Errormessage: %s\n", $mysqli->error);
        echo $result->num_rows; //zero 
        while($row = $result->fetch_row()) 
        { 
            printf("Errormessage: %s\n", $mysqli->error);
            echo $result->num_rows; //incrementing by one each time 
        } 
        echo $result->num_rows; // Finally the total count 
    }



    if($row==1){

        echo "correct username and pass";
        // Register $myusername, $mypassword and redirect to file "login_success.php"
       // session_register("myusername");
        //session_register("mypassword");
        //header("location:login_success.php");
    }
    else {
        echo "Wrong Username or Password";
    }


           mysqli_close();     

    ?>

私も試しました

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysqli_query($sql);

// Mysql_num_row is counting table row
$count=mysqli_num_rows($result);
4

3 に答える 3

3

すべてのPHPエラーを確実に表示するには、スクリプトの上に次のコードを追加します。

error_reporting(E_ALL);
ini_set('display_errors', 1);

への呼び出しを修正する必要がありますmysqli_real_escape_stringドキュメントによると、2つのパラメーターが必要であり、最初のパラメーターはMySQLリンクである必要があります。あなたの場合、そのリンクは$mysqliになります。

また、交換してください:

if($row==1){

と:

if($result->num_row==1){

$ result-> num_rowsが何であるかを誤解しています。これには、結果が$resultに格納されているクエリによって返された行の合計数が含まれています。したがって、クエリによって返されたすべてのレコードを取得するループ内で$result->num_rowsの値を確認することは無意味です。

mysqli_queryのドキュメントに次のように記載されているため、定数を削除しました。MYSQLI_USE_RESULTMYSQLI_USE_RESULT使用query()すると 、mysqli_free_result()を呼び出さない限り、後続のすべての呼び出しでエラーコマンドが同期しなくなります。

新しいコード:

<?php
    $mysqli = new mysqli('localhost', 'root', 'password', 'aiesec');

    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }

    // cleanup POST variables
    $myusername = mysqli_real_escape_string($mysqli, stripslashes(trim($_POST['myusername'])));
    $mypassword = mysqli_real_escape_string($mysqli, stripslashes(trim($_POST['mypassword'])));

    // If result matched $myusername and $mypassword, table row must be 1 row
    $sql = "SELECT * FROM members WHERE username='$myusername' and password='$mypassword'"; 
    $result = mysqli->query($sql);
     if($mysqli->errno<>0)
        die("Errormessage: %s\n", $mysqli->error);
    echo $result->num_rows;
    if($result->num_rows==1){
        echo "correct username and pass";
        // Register $myusername, $mypassword and redirect to file "login_success.php"
       // session_register("myusername");
        //session_register("mypassword");
        //header("location:login_success.php");
    }
    else {
        echo "Wrong Username or Password";
    }
    mysqli_close();     
?>
于 2012-07-07T00:30:34.363 に答える
0

変数の後$mypasswordに一重引用符がありません。$sql

この行:

$sql = "SELECT * FROM members WHERE username='$myusername' and password='$mypassword";

次のように更新します。

$sql = "SELECT * FROM members WHERE username='$myusername' and password='$mypassword'";
于 2012-07-07T00:30:52.163 に答える
0

最初のエラー、$ mypasswordの後に引用符を閉じませんでした:

$sql = "SELECT * FROM members WHERE username='$myusername' and password='$mypassword"; 

次に、これが入力されない場合、$ rowは定義されず、後で問題が発生します。少なくとも「$ row=0」を追加する必要があります。

$row = 0;

if($result = mysqli->query($sql, MYSQLI_USE_RESULT)) 
{ 
    printf("Errormessage: %s\n", $mysqli->error);
    echo $result->num_rows; //zero 
    while($row = $result->fetch_row()) 
    { 
        printf("Errormessage: %s\n", $mysqli->error);
        echo $result->num_rows; //incrementing by one each time 
    } 
    echo $result->num_rows; // Finally the total count 
}

最後に、ここで$ rowが1であることを確認しますか?試しましたか

echo "Row is: ";

var_dump($row);

if($row==1){

編集:$rowは実際には最後の行のようです。代わりに$result->num_rowsが必要です。

アーキテクチャの観点から、このようにDBにパスワードを保存することはあまり良い考えではありません。(少なくとも)「ソルトハッシュ」を保存するか、より良いアルゴリズムを使用するのが最善です。以下を参照してください。

PHPでパスワードをハッシュするためにbcryptをどのように使用しますか?

于 2012-07-07T00:34:18.400 に答える