2012-06-15 2 views
0

Я уверен, что я просто что-то пропускаю, и я провел несколько дней, работая над этим, и не могу понять, как это понять.Простой if() не работает как ожидалось

после регистрации на предыдущей странице я получаю имя пользователя и пароль,

$username = mysql_escape_string($_POST['adminusername']); 
$password = mysql_escape_string($_POST['adminpassword']); 

, а затем я иду в базу данных, чтобы вытащить имя пользователя и пароль из базы данных,

$sql = "SELECT username, password FROM `weaponsadmin`"; 
$rows = $db->query($sql); while ($record = $db->fetch_array($rows)) { 

прямо сейчас вот часть, которая меня сбивает с толку, если у меня есть следующее, независимо от того, что я использую для имени пользователя или пароля, это НЕ позволит мне войти в систему,

if (($record[username]==$username) && ($record[password]==$adminpassword)){ 
    $_SESSION['loggedin'] = true; 
    $_SESSION['username'] = $adminusername; 
    header("Location: admin.php") ; 
} 
else { 
    header("Location: index.php?login=error") ; 
} 

однако, если я использую следующий, это позволит мне войти в если имя пользователя правильно, но это позволяет мне ввод ничего для пароля, и он работает,

$adminusername = $record[username]; 
$adminpassword = $record[password]; 

if (($adminusername==$username) && ($adminpassword==$adminpassword)) { 
    $_SESSION['loggedin'] = true; 
    $_SESSION['username'] = $adminusername; 
    header("Location: admin.php") ; 
} 
else { 
    header("Location: index.php?login=error") ; 
} 

Таким образом, в целом по какой-то причине && часть, кажется, не правильно работать, и если кто-то может мне помочь с кодом и дайте мне знать, где мой код может быть улучшен для повышения уровня безопасности и как сделать эту работу правильно, благодаря

+1

Индексы массива должны быть целыми числами или строками, поэтому '$ record [username]' должно быть '$ record ['username']'. Без кавычек PHP пытается найти константы 'username' /' password'. Документы: http://php.net/manual/en/language.types.array.php – Jasper

+3

'$ adminpassword == $ adminpassword' всегда истинно .... – Wrikken

+0

@Wrikken, это проблема, спасибо, я знал это было что-то простое –

ответ

3

какой смысл здесь $adminpassword==$adminpassword:

я думаю, что это должно быть:

if (($adminusername==$username) && ($adminpassword==$password)){ 
+0

отлично, я сказал вам, что это было очень просто, исправлено это спасибо –

+0

Это также объясняет, почему первый пример никогда не работал, потому что в этом сценарии '$ adminpassword' никогда не был установлен –

1

$record[username] должен быть $record["username"] (и так далее). индексы являются строками или Int

-1

Не используйте == для сравнения строк. Вместо этого используйте strcmp() или === для соответствия строкам.

+1

Почему мы не должны использовать' = = 'для сортировки строк? – cypher

+0

Неверный, легкий взломать. просто загляните в онлайн-документы php в разделе операторов, где есть комментарии пользователей. подробно объясняется, почему его небезопасно. также сравнение строк в php-строке googling даст много предупреждений, чтобы не полагаться на == или === по многим причинам. используйте strcmp, preg_match или любую другую надежную функцию для сравнения строк более надежно, особенно когда речь идет о пароле администратора и имени пользователя. – Tschallacka

+1

== и === отлично надежно. Ничто из этого не является истинным, и использование preg_match для сравнения строк - это очень редкая идея. – cypher

0

Вы можете использовать === вместо ==. Прочитано this.
strcmp() здесь не обязательно.

+0

Будет ли использование оператора идентичности вместо равенства действительно решить его проблему? – cypher

+0

Этот код был проблемой: '$ adminpassword == $ adminpassword', например, как указано в документе mgraph, и это:' $ adminusername = $ record [имя_пользователя]; $ adminpassword = $ record [password]; ', но безопаснее использовать' === ' –

0

Чтобы добавить к ответу Майкла, причина, по которой вы не должны использовать == для сравнения строк (надеюсь, это поможет вам ориентироваться в аналогичных трудностях в будущем), заключается в том, что когда вы вызываете простой символ == на объект (например, строка или действительно что-то другое, кроме int, double, float, char, long, short или boolean, на большинстве языков), то, что вы действительно сравниваете, является адресом в памяти каждого объекта, то есть значением указателя ,

Это полезно, если вы хотите знать, ссылаются ли на две переменные два объекта на один и тот же объект, но не так полезны, если вы хотите знать, идентичны ли два объекта.Так это правда:

$string_a = $some_string; 
$string_b = $some_string; 
$string_a == $string_b; 

, но это не так:

$string_a = getUserInput(); # user types in "hello" 
$string_b = getUserInput(); # user types in "hello" 
$string_a == $string_b; 

и это может быть верно в зависимости от языка вы находитесь, если он хранит строковые литералы в памяти независимо от гается определенные переменные, к которым они присоединены:

$string_a = "hello"; 
$string_b = "hello"; 
$string_a = $string_b; 

так что, если вы не проверяя, чтобы увидеть, если два объекта на самом деле тот же объект, а не просто идентичны, использование, как и прежде, чем мне предложили, а Functio n, чтобы сравнить эти два. Такая функция обычно переходит на уровень примитивных типов, которые можно сравнить с помощью ==, как и следовало ожидать, и возвращает true, если все эти сравнения выполняются.

+1

Почему именно мы не должны использовать' == 'для сопоставления строк в php? – cypher

1

Вы неправильно используете массивы.
Вы ожидаете: $record[username]; //retrieve contains of key "username"
Что происходит на самом деле:

$record[username]; 
    /* 
     retrieves a key in the record array under the key which is a value of a 
     constant named "username" (if it's defined) and an empty string with 
     E_WARNING if it's not. 
    */ 



Вам нужно либо одиночные или двойные кавычки имена индексов, например $records['username']. Однако вы можете использовать индексы без кавычек внутри строки (и они будут работать так, как вы ожидаете) ->$someString = "Blahblahblah, ergo $record[username] is a donkey.";.

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