Я думаю, что это может иметь отношение к вашему do_alert
в вашем коде. Следуйте за мной через код.
$username = $_POST['username'];
$password = $_POST['password'];
if (!empty($username) && !empty($password)) { // if not empty
$query =""; // this is an empty query
$row = mysql_fetch_array($query); // returns nada
$counted = mysql_num_rows($query); // gives nada back
if (($counted === 1) && ($row['username'] === $username) && ($row['password'] === $password)) { // completely useless at this point cause no row is returned
session_destroy();
session_start();
echo "message";
} else { // this will not be executed
do_alert("Exceptional alert");
}
} else { // this will be executed
do_alert("Exceptional alert"); // where is this function defined?
}
ОК, я прокомментировал ваш код, где он идет не так. Как вы видите, это происходит уже на первом, если так, то он должен вернуть последнее. Поскольку я не знаю, где ваш код do_alert определен, я предполагаю, что это ваша ошибка.
Попробуйте заменить его первым эхом следующим образом: echo "I am a super duper evil monkey";
и посмотрите, работает ли это.
редактировать
, так как вы добавили свой запрос прямо сейчас, я бы хотел отметить, как хорошо, что вы должны дезинфицировать ваш вклад. Это сделает его более безопасным. Однако термин «безопасный» здесь является разновидностью irralevant, потому что вы используете устаревший набор mysql
. (mysqli/pdo
есть способы, чтобы пойти в настоящее время)
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
почему? просто. Посмотри на это!
$_POST['username'] = 'awesome';
$_POST['password'] = "' OR ''='";
было бы что-то похожее на это.
SELECT * FROM users WHERE user='awesome' AND password='' OR ''=''
И это будет означать, что каждый может войти в систему, поскольку пустое значение всегда пусто. Так же, как хэдшоп.
Более подробная информация здесь: http://php.net/manual/en/function.mysql-real-escape-string.php
редактировать 2
// very first thing you do if you work with sessions, is actually starting it. you dont do this in your if else statement, cause you could not benefit of the session variable on a later stage on this page.
session_start();
// these variables come from a form with a form name, so we are going to do a check if indeed this came from that form.
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
if (!empty($username) &&
!empty($password)) {
$query ="SELECT name, password FROM user WHERE name='".$username."' AND password = '".$password."'";
$row = mysql_fetch_array($query);
$counted = mysql_num_rows($query);
if (($counted === 1) &&
($row['username'] === $username) &&
($row['password'] === $password)) {
echo "message";
} else {
echo "no entrees found";
}
} else {
echo "failed to input some variable";
}
Я очистил некоторые в своих собственных словах, возможно, придется возиться с запросом, и в дальнейшем я установил ее немного, так как вы не использовали сеанс соответственно.
Теперь, когда это сообщение эха, вы должны установить переменную сеанса, которую вы можете уничтожить позже, когда вы выходите из системы. Переменная сеанса, которую вы можете вызвать в самом сеансе, на каждой странице, на которой есть sessionstart(). Здесь вы можете проверить, не возбуждает ли он, если да, то вы вошли в систему. Надеюсь, это поможет вам.
@lolka Есть два вложенных 'if', что едва ли очевидно из-за ** отсутствия отступа ** (* подсказка подсказки Devarajan *). – deceze
У вас есть ошибки на этом? Какие результаты вы получаете? – h00ligan
не работает не совсем понятно. Далее, возможно, вам следует также санкционировать и защитить свои переменные. Кроме того, у вас нет запроса, поэтому, конечно, вы не получите ничего в этой части. Если я, может быть, так смел, что это за 'do_alert', что у вас есть? (предполагая, что это функция) – Dorvalla