Jump to content
  • 0

Проблема с тернарным оператором


Zverushka
 Share

Question

http://sandbox.onlinephpfunctions.com/code/3ef008008cd6f61cef9537d6e9cb2bcdc95a941a

$site_name = "lala";$name = "name";$phone = "phone";$mailTopic = $site_name." - kuk-u: ".$name.!empty($phone) ? " phone.: ".$phone : " email.: " .$email;echo $mailTopic;

Не выводится начало фразы - lalaa - kuk-u, а сразу phone.

Далее

$site_name = "lala";$name = "name";$mailTopic = $site_name." - kuk-u: ".$name.!isset($phone) ? " phone.: ".$phone : " email.: " .$email;echo $mailTopic;

Выдает ошибку, что переменная phone не определена. эх...

Link to comment
Share on other sites

20 answers to this question

Recommended Posts

  • 0
$test = (!empty($phone)) ? " phone.: ".$phone : " email.: " .$email;

$mailTopic = $site_name." - kuk-u: ".$name.$test;

 

 

Всё, что идёт до тернарного оператора является условием.. А тут в данном случае так = $site_name." - kuk-u: ".$name.!isset($phone) == условие.. Просто ошибочный синтаксис...

Edited by Q4Dizzy
Link to comment
Share on other sites

  • 0

Тернарный оператор удобен тем, что его можно встраивать в текущий код. А здесь же получается, что с ним я могу записать только одно выражение как бы, не могу его встроить в текст к примеру сразу?

Edited by Zverushka
Link to comment
Share on other sites

  • 0
Тернарный оператор удобен тем, что его можно встраивать в текущий код. А здесь же получается, что встраивать нельзя?

 

$mailTopic = $site_name." - kuk-u: ".$name.((!empty($phone)) ? " phone.: ".$phone : " email.: " .$email);

 

Можно и так. Говорю же, синтаксис.

 

заметка с php:

Пожалуйста учтите, что тернарный оператор является выражением и трактуется не как переменная, а как результат выражения.

Edited by Q4Dizzy
  • Like 1
Link to comment
Share on other sites

  • 0

А вот я обычно беру в скобки всю вычислительную часть и раз вы используете двойные кавычке так и пишите переменные сразу в строке зачем заставлять PHP искать подстановки в строке когда вы делаете конкатенацию или вы просто не различаете двойные и одинарные кавычки?

$mailTopic = "{$site_name} - kuk-u: {$name}".(!empty($phone) ? " phone.: {$phone}" : " email.: {$email}");

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

 

Так же я бы упростил конструкцию !empty($phone) достаточно в месте где определяется переменная или не определяется объявить $phone = null; и ваша строка будет выглядеть следующим образом:

$mailTopic = "{$site_name} - kuk-u: {$name}".($phone ? " phone.: {$phone}" : " email.: {$email}");
Edited by stars
  • Like 1
Link to comment
Share on other sites

  • 0

Немного раскрою ответ stars по поводу "двойных" и 'одинарных' кавычек.

Если нужно просто присвоить переменной строку и в ней нет спец-символов типа \n, \t.... - пользуйте ВСЕГДА 'одинарные кавычки':

$string = 'простая строка без подстановок и спец-символов';

Что касается "двойных кавычек", я их практически не использую(исключение если нужна строка с спец-символами). При обработке строк, заключенных двойными кавычками пхп интерпритатор пытается найти в ней подстановочные переменные и спец-символы, что занимает некоторые ресурсы. Это конечно мелочи, но....

// Лишние расходы ресурсов на поиск подстановочных переменных и спец-символов.$string = "простая строка без подстановок и спец-символов"; /** * $string1 и $string2 будут идентичны по значению, но нициализация $string2 * более эффективна в плане быстродействия, хотя менее удобна в "кодировании". */$string1 = "строка с подстановками $simpleVar1, {$simpleVar2}, {$arrayValue[0]}, {$object->param}";$string2 = 'строка с подстановками '. $simpleVar1 .', '. $simpleVar2 .', '. $arrayValue[0] .', '. $object->param;
  • Like 1
Link to comment
Share on other sites

  • 0

Ооо, спасибо большое за такие интересные советы.

$phone ? " phone.: {$phone}" : " email.: {$email}

А если phone=''; - то что находится внутри с точки зрения проверки условия? И не может ли какой-то спецсимвол или какое-то другое содержимое переменной $phone дать значение false ложное? 

Link to comment
Share on other sites

  • 0

При преобразовании в boolean строка считается false если только она пустая('', strlen = 0 ).

Во всех остальных случаях строка будет - true.

echo (int)((boolean)'asd'),'';echo (int)((boolean)''),'';echo (int)((boolean)"\n"),'';echo (int)((boolean)"\t"),'';echo (int)((boolean)"\x0D\x0A"),' // wix перенос строки';echo (int)((boolean)"\x0D"),'';echo (int)((boolean)"\x0A"),'     // *nix перенос строки';echo strlen("\x0D\x0A"),'';echo strlen("\x0D"),'';echo strlen("\x0A"),'';
Edited by CoDy
Link to comment
Share on other sites

  • 0

Ооо, спасибо большое за такие интересные советы.

$phone ? " phone.: {$phone}" : " email.: {$email}

А если phone=''; - то что находится внутри с точки зрения проверки условия? И не может ли какой-то спецсимвол или какое-то другое содержимое переменной $phone дать значение false ложное? 

 

phone будет true если он не содержит null || false || пустой строки || 0 || array() (пустого массива) и дальше по аналогии, в привычном понимание если он не равен нулю/пустоте.

Простите меня конечно, но я бы за такие тернарные операторы бил розгами до потери пульса.

 

 

Считаете код не читаемым? Какой вариант вы бы предложили? Просто я склонен к тому что код должен быть читаемым но плодить излишние переменные тоже не рационально. Например все конкатенируемые элементы можно разбить построчно и добавить комментариев если код трудный, однако только в том случае если с этим кодом не предстоит частая работа.

echo (int)((boolean)"\n"),'';echo (int)((boolean)"\x0A"),'     // *nix перенос строки';

 

Забавная запись, а почему же пропустили \r и \r\n или скажем PHP_EOL ? ^_^

Link to comment
Share on other sites

  • 0
Считаете код не читаемым? Какой вариант вы бы предложили?

Считаю код пипец каким нечитаемым, человеку, который возможно после будет это поддерживать, не позавидуешь.

$mailTopic = "{$site_name} - kuk-u: {$name}";$mailTopic .= $phone ? " phone.: {$phone}" : " email.: {$email}";

Даже такое написание делает код в разы читабельнее.

Link to comment
Share on other sites

  • 0

@Great Rash, вообще так такой оператор или за оператор, реализованный таким образом?

Есть задача - из формы передается или телефон, или емейл. В зависимости от этого нужно сформировать название сообщения для почты - либо с телефоном, либо с почтой.

Каким бы Вы образом реализовали "правильно"? 

Link to comment
Share on other sites

  • 0

Я кстати пока ждала ответа, так и сделала, раз в одну строку не получалось) 

$mailTopic = $site_name." - заявка от: ".$name;$mailTopic .= (isset($phone) && !empty($phone) ) ? " тел.: ".$phone :" email.: ".$email;

Значит от розг нас по сути отделяет только ентер?
Опять же спасибо за совет. Я вообще с трудом вчитываюсь в тернарные операторы - для меня запись с ним сама по себе нечитабельна - приходится в голове по полочкам раскладывать, что я вижу. Поэтоум записать эту странную абракадабру в одну строку мне показалось проще - так как все равно не очень читабельно само по себе).
 

Edited by Zverushka
Link to comment
Share on other sites

  • 0

Я кстати пока ждала ответа, так и сделала, раз в одну строку не получалось) 

$mailTopic = $site_name." - заявка от: ".$name;$mailTopic .= (isset($phone) && !empty($phone) ) ? " тел.: ".$phone :" email.: ".$email;

Значит от розг нас по сути отделяет только ентер?

 

можно и в одну

$mailTopic = $site_name.' - заявка от: '.$name.((isset($phone) && !empty($phone) ) ? ' тел.: '.$phone : ' email.: '.$email);

Но нужно ли? И еще вот эта запись isset($phone) && !empty($phone) это капец ))))) Просто потому что из формы вы данные получаете через глобальные переменные скорее всего $_GET $_POST (есть и другие есть что), далее чтобы в переменную $phone присвоить $_GET['phone'] нужно как минимум проверить есть ли он именно тем самым isset и получается что $phone уже точно есть! Обычно это делается так :

 

$phone = isset($_GET['phone']) ? $_GET['phone'] : null;$mailTopic = $site_name.' - заявка от: '.$name;// тут важно только одно что телефон у нас не может быть равен 0 или 000000 и т.п. если может быть 0 то условие должно быть другим$mailTopic .= $phone ? ' тел.: '.$phone : ' email.: '.$email;

Либо вот так:

 

$mailTopic = $site_name.' - заявка от: '.$name;// тут важно только одно что телефон у нас не может быть равен 0 или 000000 и т.п. если может быть 0 то условие должно быть другим$mailTopic .= (isset($_GET['phone']) && $_GET['phone']) ? ' тел.: '.$_GET['phone'] : ' email.: '.$email;
 

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

 

 

посуте это тоже условие if () else однако более простая запись. И оно вполне читабельное, однако возможно это дело привычки...

Link to comment
Share on other sites

  • 0
Но нужно ли? И еще вот эта запись isset($phone) && !empty($phone) это капец ))))) Просто потому что из формы вы данные получаете через глобальные переменные скорее всего $_GET $_POST

Выше  я написала так:

$name = addslashes(trim($_POST['name']));if (isset($_POST['phone'])) {	$phone = addslashes(trim($_POST['phone']));}if (isset($_POST['email'])) {	$email = addslashes(trim($_POST['email']));} 
Link to comment
Share on other sites

  • 0

Ну для $_POST['name'] тоже надо проверять наличие (isset). Но главный вопрос зачем вам addslashes и trim что вы будете далее делать с данными? 

 

Просто если  вы отправляете письмом то абсолютно не важно есть там спец символы или лишние пробелы поскольку два пробела и более в письме будут выглядеть как один только если это не неразрывный пробел  , если вы заносите данные в mysql то наверняка у вас pdo или mysqli и там как бы по умолчанию есть инструменты для экранизации всякого добра которое может привести к SQL-инжекции. Так что скорее всего вы просто лишние действия делаете...

Link to comment
Share on other sites

  • 0

@stars, но ведь письмо на почту приходит в виде хтмл кода. И если в переменную встроить хмтл код - то он может выполнится, к примеру вставить туда даже жаваскрипт - а это уже потенциально опасно....

Link to comment
Share on other sites

  • 0

По большому счету да если опасаетесь ссылок надо фильтровать.

 

В частности далеко не всегда письма отправляют в html, проверка так же может осуществляться уже после формирования body (это всего одна проверка, а не множество как у вас), так же если вы используете какую-то библиотеку для отправки писем то там может быть уже стоит ограничение на ввод тэгов, ну и самое главное что мэйл сервисы очень серьезно фильтрую письма там обычные ссылки порой зарезают, а вы про JS )) если говорить про почтовые программы то тут я не слишком силен но думаю что как минимум JS они выполнять не станут. 

Link to comment
Share on other sites

  • 0

Я помню несколько лет назад в mail.ru была узявимость. С помощью сформированного html кода с js - похищались куки и таким образом злоумышленник получал доступ к почтовому аккаунту.

 

Не совсем поняла про одну проверку, а не множество.

Библиотеку не использую, очень редко php mailer только.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy