Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
PHP Методы гет и пост http://www.cyberforum.ru/php-beginners/thread648092.html
Какой смысл передавать данные методом гет? Какие плюсы этого метода?
PHP Создание файла через FTP Соединение
Есть скрипт: $fp = fopen("ftp://$user:$password@$ftp_server/$file", 'w'); fwrite($fp,'new_text'); fclose($fp); Проблема стоит в том что файл создается пустой... Не могу понять...
PHP Ошибка "Cannot modify header information"
Привет, недавно и совершенно неожиданно для себя (так как я никогда раньше не редактировал index.php, functions.php или что-нибудь ещё, т.к. это не мой уровень) получил эту достаточно...
PHP Задание определенного цвета прозрачным Имею изображение, как мне у него определенному цвету (ну допустим #ссс) назначить прозрачный цвет, ну естественно нужно чтобы поняли все браузеры. Вот у меня выводится изображение <img... http://www.cyberforum.ru/php-beginners/thread647917.html
PHP Генерация страниц http://www.cyberforum.ru/php-beginners/thread647912.html
Всем привет! Ребят, подскажите кто знает, как лучше. Делаю сайт, встал вопрос, в корневой каждую страницу создавать отдельно или лучше генерить из админки. Страниц будет порядка сотни. Если второй...
PHP+AJax PHP
Ребята, помогите пожалуйста, нужно создать таблицу, что бы обновлялась при добавлении информации в базу данных, тоисть я добавляю строку в базу а на странице онлайн добавляется строка... короче в...
PHP php и Crop изображения 1:1
И снова здрасти :) Нужна маленькая помощь, есть скрипт, который методом "post" получает Картинку, обрезает ее и создает миниатюру. Все после этого сохраняет. Нужна помощь. Как сделать ровную...
PHP Преобразование времени как время полученное функцией time() в виде 1231231231 преобразовать в 00:00:00 ?? Добавлено через 17 минут разорбрался, не актуально http://www.cyberforum.ru/php-beginners/thread647790.html
PHP Ограничить число запросов к серверу http://www.cyberforum.ru/php-beginners/thread647781.html
Существует ли надежный способ как-то идентифицировать клиентскую машину, чтобы ограничить количество запросов этого клиента за определенное время? Без использования сессий. Кроме попытки определить...
PHP Сортировка массива Имеется массив вида $users_meta (array( => => "1" => "02" => "09" => "1960" => => "2" http://www.cyberforum.ru/php-beginners/thread647677.html
DrobyshevAlex
1176 / 1126 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
19.09.2012, 13:27 0

FAQ по распространенным ошибкам

19.09.2012, 13:27. Просмотров 39286. Ответов 8
Метки (Все метки)

Ответ

Хотелось бы рассказать о некоторых ошибках в php с использованием условий и логический операций.

Приходилось мне видеть что то типа вот такого:
PHP
1
$username = $user->getUserName() || 'Гость';
А ещё вот такого:
PHP
1
$user->hasGift(CONST_GIFT_1 || CONST_GIFT_2); // CONST_GIFT_1 и CONST_GIFT_2 - какие то числа, id подарков
Первый код в некоторых языках, например JS или Ruby будет прекрасно работать, а в php он будет работать скорей всего не так как ожидал тот, кто его написал.
||, &&, or, and, <, >, ==, ... - применяются для логических операций, и результатом выполнения будет всегда логическое значение.
не важно какие были переменные.
PHP
1
2
3
4
$a = 1;
$b = 'abc';
$c = $a && $b;
var_dump($c); // $c будет true
Отсюда следует что $user->getUserName() || 'Гость' - вернёт логическое значение, то есть $username будет иметь тип boolean.
Можно с увереностью сказать, что $username будет равно true, так как даже если $user->getUserName() вернёт false то (bool)'Гость' всегда вернёт true.

То же самое и во втором пример, с вызовом функции hasGift().
Если хотя бы одно число не равно 0 то там будет передано в функцию true, а функция ожидает тип int, по этому в функции будет проверка (int)true = 1, то есть будет проверено, есть ли у юзера подарок с ID = 1.
В результате функция выполнится, и проверка пройдёт, но не того чего нужно, и такую ошибку можно будет не сразу отловить и заметить что она есть.

Теперь рассмотрим оператор switch.
Пусть у нас будет код:
PHP
1
2
3
4
5
6
switch ($a)
{
    case ($a > 0 and $a <= 10): echo 'Условие 1'; break;
    case ($a > 10 and $a <= 20): echo 'Условие 2'; break;
    default: echo 'default';
}
При $a от 1 до 10
PHP
1
($a > 0 and $a <= 10) = true
Так как switch сравнивает == (не строгим сравнением), то будет приведение типов.
PHP
1
($bool)$a = true
Выпонится условие 1.

При $a от 11 до 20
PHP
1
2
3
($a > 0 and $a <= 10) = false
($bool)$a = true
($a > 10 and $a <= 20) = true
Выполнится условие 2

При $a > 20
PHP
1
2
3
($a > 0 and $a <= 10) = false
($bool)$a = true
($a > 10 and $a <= 20) = false
Выполнится дейтсвие default

Вроде бы всё верно, но если взять $a = 0
PHP
1
2
($a > 0 and $a <= 10) = false
($bool)$a = false
Выполнится условие 1! Вот такие ошибки трудно отловить в процессе работы сайта. У вас будут возникать ошибки, но трудно будет найти почему.

А если добавить в начало вот такую строку
PHP
1
case true:  echo 'Условие 0'; break;
То при $a = 0 будет условие 1 выполняться, а при любых других числах - условие 0, других вариантов не будет.

Ну и последнее о чём хотелось бы напомнить, это о третьем параметре функции in_array, там тоже бывает беда из за приведения типов.
Напрмиер:
PHP
1
2
3
$a = array(0, 'Вася');
$s = 'Петя';
var_dump(in_array($s, $a)); // результат true!
Так как при сравнении 0 с переменной $s - тип переменной $s будет приведён к int, (int)'Петя' = 0, а 0 в массиве есть.
Или
PHP
1
2
3
$a = array(true, 'Вася');
$s = 'Петя';
var_dump(in_array($s, $a)); // результат true!
true - boolean
(bool)'Петя' = true

true в массиве есть.

Что бы не было такого, есть у функции in_array третий параметр, который заставляет сравнивать с учётом типа переменных.

PHP
1
2
3
$a = array(true, 'Вася');
$s = 'Петя';
var_dump(in_array($s, $a, true)); // результат false


Вернуться к обсуждению:
FAQ по распространенным ошибкам
20
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 13:27

Сма Bauknecht WA 7540, Поделитесь информацией по ошибкам
Должен буду идти на вызов. Клиент говорит, что сма выдаёт ошибку. Но дисплея на ней нет. Поделитесь...

Сма Blomberg WNF 8447 нужна инфа по ошибкам
Сма Blomberg WNF 8447 нужна инфа по ошибкам ,заранее спасибо. ...

сма Whirlpool AWE 6514 859365110040, нужны данные по ошибкам
Приветствую всех! Машинка не переходит на полоскание. Нужна расшифровка по ошибкам. Модуль на...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.