Здесь есть несколько вопросов.
Во-первых, переменные, которые вы имеете в запросе являются строками, поэтому они требуют, чтобы быть указаны:
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 в:
Просто используйте библиотеку. Шутки в сторону. Они существуют по какой-то причине.
Не делайте это сами , Если вы создаете свою соль, ВЫ МОЖЕТЕ НЕПРАВИЛЬНО. Вы должны использовать библиотеку, которая обрабатывает это для вас.
$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
}
Вы используете оператор присваивания вместо оператора сравнения в инструкции if. – Jinandra