Похоже, что PHP-оператор if чувствителен к регистру? Так есть ли причина использовать strcmp()
? Безопасно ли что-то вроде:
if ( $password == $password2 ) { ... }
Причина его использования заключается в том, что strcmp
возвращает <0, если str1 меньше str2; > 0, если str1 больше str2 и 0, если они равны.
==
только возвращает true
или false
, это не говорит вам, что является «большой» строкой.
Вы не должны использовать ==
для сравнения строк. ===
в порядке.
$something = 0; echo ('password123' == $something) ? 'true' : 'false';
Просто запустите приведенный выше код, и вы поймете, почему.
$something = 0; echo ('password123' === $something) ? 'true' : 'false';
Теперь это немного лучше.
Не используйте == в PHP. Он не будет делать то, что вы ожидаете. Даже если вы сравниваете строки со строками, PHP неявно бросает их на float и выполняет численное сравнение, если они выглядят численно.
Например, '1e3' == '1000' возвращает true.
Ну … в соответствии с этим сообщением об ошибке php вы можете даже получить Owned.
<?php $pass = isset($_GET['pass']) ? $_GET['pass'] : ''; // Query /?pass[]= will authorize user //strcmp and strcasecmp both are prone to this hack if ( strcasecmp( $pass, '123456' ) == 0 ){ echo 'You successfully logged in.'; } ?>
Это дает вам предупреждение, но все же обходит сравнение.
Вы должны делать ===
как предлагал @postfuturist.
Всегда помните, что при сравнении строк вы должны использовать оператор ===
operator (строгое сравнение) и не ==
(потерять сравнение).
Использование ==
может быть опасным.
Обратите внимание, что он переместит переменную в другой тип данных, если они отличаются друг от друга.
Примеры:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
Как вы можете видеть, эти два относятся к разным типам, но результат true
, что может и не быть тем, что ожидает ваш код.
Использование ===
, однако, рекомендуется, так как тест показывает, что он немного быстрее, чем strcmp()
и его альтернативна strcasecmp()
регистра.
Быстрый googling кричит это сравнение скорости: http://snipplr.com/view/758/
strcmp () и «===» чувствительны к регистру, но «===» выполняется намного быстрее
образец кода: http://snipplr.com/view/758/
strcmp вернет различные значения в зависимости от среды, в которой он работает (Linux / Windows)!
Причина в том, что у него есть ошибка, так как в отчете об ошибке говорится: https://bugs.php.net/bug.php?id=53999
Пожалуйста, обращайтесь с осторожностью! Спасибо.
Подводя итог всем ответам:
==
– плохая идея для сравнения строк.
Во многих случаях это даст вам «неожиданные» результаты. Не верьте этому.
===
хорошо, и даст вам лучшую производительность.
strcmp()
следует использовать, если вам нужно определить, какая строка «больше», как правило, для операций сортировки.
Также функция может помочь в сортировке. Для более четкого определения сортировки. strcmp () возвращает меньше 0, если string1 сортирует перед string2, больше 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например
$first_string = "aabo"; $second_string = "aaao"; echo $n = strcmp($first_string,$second_string);
Функция вернет больше нуля, поскольку aaao сортирует перед aabo.
Вы можете использовать strcmp()
если хотите заказать / сравнить строки лексикографически . Если вы просто хотите проверить равенство, тогда ==
просто отлично.
Сравнение строк с использованием strcmp
echo strcmp("my name","my name");