2015-11-23 4 views
-1

Я хочу сделать логин для класса (поэтому я сейчас не ищу предотвращения инъекций SQL), и у меня возникли проблемы с использованием подсчета строк, чтобы узнать, могу ли я войти в систему или нет ,PHP SQL row count

Как я могу подсчитать строки из выделения? Я пробовал некоторые вещи, которые просто не сработали.

Ошибка, которую я получаю, находится в строке с комментарием.

$host = "localhost"; 
$serverusername = "root"; 
$serverpassword = ""; 
$database = "usuarios"; 
$table = "user"; 

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

$mysqli = new mysqli($host, $serverusername, $serverpassword, $database); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 
$query = "SELECT * FROM ".$table." WHERE `username` = ".$username." AND `password` = ".$password; 


$result = $mysqli->query($query); 
$row = $result -> num_rows; //this line has an error. Trying to get property of non-object 

if ($row != 0) 
{ 
header('Location : index.html'); 
die(); 
} 
else 
{ 
    echo "password incorrecta!"; 
} 


$mysqli -> close(); 
+4

Ваш код содержит ошибки синтаксиса. Проконсультируйтесь по следующим ссылкам: http://php.net/manual/en/mysqli.error.php и http://php.net/manual/en/function.error-reporting.php и примените это к своему коду. –

+1

Пароль, вероятно, является строкой. И посмотрите на подготовленные заявления – Strawberry

+0

Чтобы предотвратить использование кода из SQL-инъекции, используйте [PDO :: prepare] (http://php.net/manual/en/pdo.prepare.php) –

ответ

1

Вам нужно положить $ имени пользователя и $ пароля в кавычках:

$query = "SELECT * FROM $table WHERE `username` = '$username' AND `password` = '$password'"; 

Этот код является уязвимым для инъекции SQL.

+1

$ table не нужно в кавычки? – user3651164

+0

Нет, $ table не обязательно должен быть в цитаты – user2182349

+0

Я все еще получаю точно такую ​​же проблему. Я отредактировал первый пост, пожалуйста, проверьте строку с комментарием, спасибо s – user3651164

0

Предполагая, что у вас уже установлен отчет об ошибках (поскольку вы предоставили указанную ошибку), следующим шагом будет устранение неполадок в запросе или выходе.

Чтобы понять, что случилось с вашим запросом попробовать отладку Вот как я отладки запросов Query

  1. эхо запроса на экран

    $query = "SELECT * FROM ".$table." WHERE `username` = ".$username." AND `password` = ".$password; 
    echo $query; 
    
  2. скопировать распечатанный запрос с экрана

  3. выполнить запрос у вас менеджер db (phpmyadmin)

  4. Прочитайте ошибку SQL и

  5. изменить ваш запрос соответственно

Если запрос дает правильный вывод, то задача его с кодом, который запускается после того как вы запрос. в противном случае вы должны добавить здесь свою ошибку sql, чтобы мы могли исправить ошибку.

Sidenote:

$row = $result -> num_rows; не должны быть $row = $result->num_rows; (не уверен, если это имеет значение, то дополнительное пространство)

примечание 2: после прочтения комментариев

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

+0

Хорошо, я исправил запрос. $ query = "SELECT * FROM". $ Table. "WHERE' username' = '". $ Username."' И 'password' = '". $ Password. "'"; Это делает так, чтобы параметры считывались как строки в запросе. Но я все еще обеспокоен тем, что функция num_rows не работает. – user3651164

+0

вы следовали всем шагам, которые я сделал для вас? выполните печатный запрос, чтобы узнать, что с ним не так. – davejal

+0

Да, я последовал за каждым шагом. Я даже использую phpmyadmin. И произошла ошибка. Ходила с SELECT COUNT (*) FROM пользователя WHERE 'username' = Rob И' password' = нет .... TO ... SELECT COUNT (*) FROM пользователя WHERE 'username' = 'Rob' AND 'password' = 'no' Обратите внимание, что '', чтобы классифицировать их как строки – user3651164