2015-08-09 4 views
3

Надеюсь, я правильно отформатировал код. У меня возникают проблемы с тем, чтобы это заявление выполнялось. Я искал и выглядел так, как должно выглядеть это утверждение. Однако, когда я запускаю его независимо от пароля, если имя пользователя начинается с kacey, тогда он переходит в echo "Logged in as: " . kacey; Аналогично, если я помещаю ввод в файл kaceyfeewaf, он по-прежнему относится к echo "Logged in as: " . $myuser; Это происходит независимо от введенного пароля. Строка $result['username'] должен быть утвержден в KACEY.PHP, SQL, База данных пользователей

$sql = "SELECT * FROM $dbTable WHERE username = $myuser AND password = $mypass"; 
$result = mysql_query($sql); 

if($result['username'] = $myuser && $result['password'] = $mypass;) 
{ 
    echo "Logged in as: " . $myuser;  
} else { 
    echo "Fail "; 
    } 
+0

Вы используете оператор присваивания вместо оператора сравнения в инструкции if. – Jinandra

ответ

4

Здесь есть несколько вопросов.

Во-первых, переменные, которые вы имеете в запросе являются строками, поэтому они требуют, чтобы быть указаны:

WHERE username = '$myuser' AND password = '$mypass' 

Имея or die(mysql_error()) к mysql_query() бы сигнализировал ошибку синтаксиса.

Тогда вы назначая вместо сравнения с

if($result['username'] = $myuser && $result['password'] = $mypass;) 

использование двух равных ==

Однако, это не то, как вы проверить, существуют ли эти строки.

Необходимо использовать mysql_num_rows() или использовать цикл while при использовании функции для извлечения/повторения результатов.

Вот MySQLi пример использования mysqli_num_rows():

$conn=mysqli_connect("hostname","username","password","db"); 

$check_select = mysqli_query($conn, "SELECT * FROM `users` 
            WHERE email = '$email' AND pw='$pass'"); 

$numrows=mysqli_num_rows($check_select); 

if($numrows > 0){ 
// do something 
} 

Теперь мы не знаем, где были назначены эти переменные, и если из формы, что он использует метод POST с соответствующими атрибутами имя.

т.е .:

<form action="" method="post"> 
<input type="text" name="username"> 
... 
</form> 

$username = $_POST['username']; 

Еще одна вещь, которая нам неизвестна является API MySQL вы используете, чтобы соединиться с. Убедитесь, что вы действительно используете тот же, который используете для запроса, будучи mysql_. Различные API не смешиваются, например mysqli_ или PDO. Используйте тот же самый из соединения с запросом.

Добавьте error reporting в начало файла, в котором будут найдены ошибки.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// rest of your code 

Sidenote: Отображение ошибок не должно быть сделано только в постановке, и никогда производства.


Я заметил, что вы можете хранить пароли в текстовом виде. Если это так, то оно очень обескуражено.

Я рекомендую использовать функцию CRYPT_BLOWFISH или PHP 5.5's password_hash(). Для PHP < 5.5 используйте password_hash() compatibility pack.

Вот PDO решение вытащил из одного из ответов ircmaxell в:

Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.

  • PHP 5.5+: использовать password_hash()
  • PHP 5.3.7+: использовать password-compat (пакет обеспечения совместимости для выше)
  • Все остальные: использовать phpass

Не делайте это сами , Если вы создаете свою соль, ВЫ МОЖЕТЕ НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.

$dbh = new PDO(...); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); 
$stmt->execute([$username, $email, $hash]); 

А на входе:

$sql = "SELECT * FROM users WHERE username = ?"; 
$stmt = $dbh->prepare($sql); 
$result = $stmt->execute([$_POST['username']]); 
$users = $result->fetchAll(); 
if (isset($users[0]) { 
    if (password_verify($_POST['password'], $users[0]->password) { 
     // valid login 
    } else { 
     // invalid password 
    } 
} else { 
    // invalid username 
} 
+0

Это выглядит намного чище, чем то, что я делал, чтобы проверить. Мне трудно получить if ($ numrows> 0) {}, чтобы работать, я пытаюсь исследовать его, чтобы понять его лучше. Благодаря! –

+0

@KaceyGambill Вас приветствует Kacey, * cheers * –

+0

@ Fred-ii- Растущий кактус снова? * Ralph *:] – Rizier123

1

Вы должны использовать == вместо простых = для вашего если условие

1

Прежде всего удалить, что если STMT и сделать новый, где вы проверить число строк. Если число строк> 0, у вас есть действительный логин. А затем распечатать необходимые результаты из текущего запроса базы данных.

Edit:

У вас есть = Insted из == или === так STMT всегда верно.

Смежные вопросы