PHP MYSQLI количество строк не работает без ошибок

У меня есть форма входа в систему, когда пользователь нажимает кнопку входа. Вызывается checklogin.php, и он должен проверять имя пользователя и пароль на соответствие любой записи в базе данных, если значение true делает что-то еще, печатать неверный пароль или имя пользователя

До сих пор я получаю неправильное имя пользователя пароля, хотя это правильное имя пользователя и пароль. Я сделал некоторые изменения, но теперь нет эха, 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);
 abhshkdz07 июл. 2012 г., 02:21
Вы уверены, что не сохранили хешированный пароль в БД? Вы должны в любом случае. :)

Ответы на вопрос(3)

Решение Вопроса

что вы видите все ошибки PHP, добавьте этот код поверх вашего скрипта:

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

Вы должны исправить свои звонки наmysqli_real_escape_string, Согласнодокументация, должно быть два параметра, и первый параметр должен быть ссылкой MySQL. В вашем случае эта ссылка будет $ mysqli.

Также замените:

if($row==1){

с:

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

Вы неправильно понимаете, что такое $ result-> gum; num_rows: оно содержит ИТОГО количество строк, возвращаемых запросом, чей результат сохраняется в $ result. Таким образом, бесполезно проверять значение $ result-> gum; num_rows внутри цикла, где вы извлекаете все записи, возвращаемые запросом.

Я убрал константуMYSQLI_USE_RESULT от твоегоquery() посколькудокументация для mysqli_query говорит:
Если вы используете MYSQLI_USE_RESULT, все последующие вызовы будут возвращать команды ошибок из синхронизации, если только вы не вызовете 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();     
?>
 07 июл. 2012 г., 02:51
Спасибо! Я еще не привык к тому, как работает форматирование, и мне иногда требуется много правок, прежде чем я удовлетворюсь ответом, который я написал.
 07 июл. 2012 г., 02:47
Я заканчивал улучшение кода, когда заметил, что Вы уже это сделали. Я пошел и обновил$myusername а также$mypassword деклараций. Нет необходимости в нескольких строках кода ...

Вы пропускаете одиночную кавычку после$mypassword на ваше$sql переменная.

Эта строка:

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

Update it to:

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

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

Затем, если это не будет введено, значение $ row не будет определено, и в дальнейшем возникнут проблемы: вы должны добавить как минимум & quot; $ row = 0 & quot;

$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- & gt; num_rows.

С архитектурной точки зрения, хранение паролей в БД, как это не очень хорошая идея, было бы лучше (по крайней мере) хранить «соленый хеш». или используйте лучший алгоритм, смотрите:

Как вы используете bcrypt для хеширования паролей в PHP?

Ваш ответ на вопрос