PHP: <?php header('Content-Type: text/html; charset=utf-8'); /* Из мана: * range — Создать массив, содержащий диапазон элементов * in_array — Проверить, присутствует ли в массиве значение */ // Массив в диапазоне элементов типа int от 1 до 10 $int_range_arr = range(1, 10); // Посмотрим на содержимое массива echo'<pre>'; print_r($int_range_arr); echo'</pre>'; // Строка $string = '9 моё любимое число'; // Проверим, присутствует ли строка в массиве - ПРИСУТСТВУЕТ!!! Не понимаю!!! if(in_array($string, $int_range_arr)) echo'Строка "9 моё любимое число" входит в диапазон от 1 до 10<br>'; // А теперь проверим в strict mode - НЕ ПРИСУТСТВУЕТ. Понимаю. if(in_array($string, $int_range_arr, true)) echo'Строка "9 моё любимое число" входит в диапазон от 1 до 10<br>'; // Число $int = 9; // Проверим, присутствует ли число в массиве - ПРИСУТСТВУЕТ. Понимаю. if(in_array($int, $int_range_arr)) echo'Число "9" входит в диапазон от 1 до 10<br>'; // А теперь проверим в strict mode - ПРИСУТСТВУЕТ. Понимаю. if(in_array($int, $int_range_arr, true)) echo'Число "9" входит в диапазон от 1 до 10<br>'; /* * * Внимание, Вопрос знатокам! Почему в первом случае функция in_array возвращает true?! * */ ?>
PHP: <?php $string = '9 моё любимое число'; echo (int)$string; =) а когда true то там типы проверяются
Padaboo Я в курсе. Только я не считаю поведение функции in_array нормальным. ИМХО это ошибка. Мне насрать, что это функции было передано, она должна проверить наличие из того, что есть, а не заниматься приведением типов. Я могу этой функции скормить кучу смешанного говна, пусть проверяет. А если она будет заниматься привидением типов, то это уже не проверка. Мне такая функция нахер не нужна.
Apple Привидение типов и обрезание строки, это, как минимум, разные вещи. Это даже не баг, это как-то через жопу всё.
Нормальное поведение. "9 blala" == 9 не удивляет? Тогда почему inarray который делает == по всем элементам - вдруг удивлять начал?
Вполне таки нормальное поведение: не-strict режим тем и отличается, что не производит приведение типов. Примерно на те же грабли наступают новички, когда пользуются strpos, не проверяя, какой ноль вернула функция: булев ноль (не найдено) или инт ноль (найдено в нулевой позиции). На самом деле все претензии — к невнимательному чтению мануала. Да, с типами данных и очевидностью кода у РНР есть проблемы. Таким уж уродился. Но это плата за простоту и прозрачность типов. ЗЫ Как умиляет...
Меня как-то удивило и я понял, что все мои проверки $var == (int)$var не являются рабочими =\ Т.е. получается, чтобы проверить переменную, нужно: isset($var) and is_numeric($var) and $var == ($int)$var Ктстати, есть ctype_digit - вот она офигенна для проверки входящих чисел. Но я заметил, что она присутствует не на всех серверах =\
Не всё так страшно, товарищи. Если вам нужно лишь чтобы в SQL запросе id был интом, достаточно будет преобразования типов. Исход $var == (int)$var зависит от того, какой был тип изначально у переменной. Если она получена через гет, следовательно строка — проверка будет вполне рабочей.
Был случай, когда я видел в скрипте очень жесткую дырку. Выглядела примерно слещующим образом: PHP: <?php if(intval($_GET["id"]) > 1) { mysql_query(/* ... $id ...*/); } ?> Само собой такая штука обходится очень и очень просто - в проверке-то он даст цифру.
Hight Вообще это всё документировано и является основой основ PHP. Просто со временем мы об этом забываем, что обычно приводится к числовым типам, а не к строкам. Но вообще да, штука неприятная. Это общий недостаток скриптовых языков. В JS тоже иногда приходится сталкиваться с WTF, а потом переделывать кучу всего. Со временем запоминается. http://ru.php.net/manual/en/language.ty ... ggling.php
if((int)$id>0) //неправильно $id = (int)$id; if($id>0) // правильно Прописная истина is_numeric тоже очень надежно. По хорошему самое главное - отфильтровать сроку так, чтобы там было лишь число. То что там инт число или положительное целое - это уже второстепенна задача.