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

У меня есть форма входа в систему, когда пользователь нажимает login 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); 

Чтобы убедиться, что вы видите все ошибки 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-> num_rows: он содержит TOTAL количество строк, возвращаемых запросом, результат которого хранится в $ result. Таким образом, бесполезно проверять значение $ result-> 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(); ?> 

Вам не хватает одной кавычки после $mypassword в переменной $sql .

Эта строка:

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

Обновите его до:

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

Первая ошибка, вы не закрыли цитату после $ 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.

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

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