Page 1 of 3

Интерполиране на променливи в низ, идващ от ДБ

Posted: Fri Jun 12, 2020 1:11 pm
by explozen
Здравейте :dance:

Опитвам се да направя някакво фокусче но явно не съм добър факир :naughty:

Използвам mail() за да изпращам имейли. Функцията си работи без проблем. Искам да направя следното:
В базата записвам шаблон на имейл в който шаблон има променливи. Целта ми е този запис да го извикам в темплейта и тези променливи да си работят. Когато си извикам променливите директно в имейла те си работят без проблем. Когато ги извиквам от базата, резултата е следния:

Code: Select all

Hello, $row[client_name]<p>Your service $row[support_service] expired. End date: $row[date_end]</p>
Това е получен имейл...

Ще бъда благодарен ако някой ми даде съвет както да го направя :angelic-flying:

Re: PHP mail()

Posted: Fri Jun 12, 2020 1:36 pm
by systems
така би трябвало да изведе резултатите:

Code: Select all

<?php
echo "Hello, $row['client_name']<p>Your service $row['support_service'] expired. End date: $row['date_end']</p>";
?>

Re: PHP mail()

Posted: Fri Jun 12, 2020 1:38 pm
by anonimen
Да разбираме, че в базата имаш запазен следния стринг:

Code: Select all

'Hello, $row[client_name]<p>Your service $row[support_service] expired. End date: $row[date_end]</p>'
И искаш като го вземеш с PHP, променливите автоматично да се попълнят?

Можеш да си направиш някакви placeholderи, с които да кодираш местата, на които искаш да застанат променливите, и след това със string_replace да извършиш заместването.

Например, вместо горния стринг, в базата ще пазиш нещо такова:

Code: Select all

'Hello, $$client_name$$<p>Your service $$support_service$$ expired. End date: $$date_end$$</p>'
И когато вземеш този низ в променлива, за да го изпратиш с mail, ще направиш нещо такова

Code: Select all

$parsed_str = str_replace($str_from_db, [ '$$client_name$$', .... ], [ $row["client_name"], .... ])
Където в двата масива изредаш нещата, които заместваш.

Re: PHP mail()

Posted: Fri Jun 12, 2020 1:42 pm
by explozen
systems wrote:
Fri Jun 12, 2020 1:36 pm
така би трябвало да изведе резултатите:

Code: Select all

<?php
echo "Hello, $row['client_name']<p>Your service $row['support_service'] expired. End date: $row['date_end']</p>";
?>
Няма да се получи с echo защото така попълвам функцията:

Code: Select all

email_send(
            $expiryRow['mail_from'],
            $row['client_email'],
            $expiryRow['e3_days_notifications_mail_subject'],
            "$expiryRow[e3_days_notifications_mail_text]"
        );

Re: PHP mail()

Posted: Fri Jun 12, 2020 3:18 pm
by systems
има вариянт:

Code: Select all

<?php
email_send(
echo    "$expiryRow['mail_from'],
            $row['client_email'],
            $expiryRow['e3_days_notifications_mail_subject'],
            $expiryRow[e3_days_notifications_mail_text]"
        );
?>

Re: PHP mail()

Posted: Fri Jun 12, 2020 7:31 pm
by anonimen
systems wrote:
Fri Jun 12, 2020 3:18 pm
има вариянт:

Code: Select all

<?php
email_send(
echo    "$expiryRow['mail_from'],
            $row['client_email'],
            $expiryRow['e3_days_notifications_mail_subject'],
            $expiryRow[e3_days_notifications_mail_text]"
        );
?>
Ехото печата на изхода и не връща нищо: https://www.php.net/manual/en/function.echo.php
Така че да подадеш void аргумент на функция ще е невалидно.

Re: PHP mail()

Posted: Fri Jun 12, 2020 7:45 pm
by anonimen
Тъй като възникна въпрос на ЛС, ще разясня малко по-подробно какво имах предвид.

В PHP суровите низови литерали (грр, българска терминология, raw string literals :D), заградени с двойни кавички, автоматично интерполират променливите, които са изписани в тях.
Това означава, че когато види следното:

Code: Select all

$var = "Love WebTourist";
echo "В променливата има: $var";
PHP интерпретаторът ще замести стойността на $var в низа след 'echo'-то, и по този начин ще се отпечатат слепените стойности.

Това, обаче е съвсем различно от следното:

Code: Select all

// когато в URLто има следното: file.php?userInput=$val
$val = 'Hidden value';
echo $_GET['userInput'];
Ако в променливата от потребителя е записано име на някоя променлива (в горния случай - $val), то тя няма да се интерполира.
Интерполират се единствено низове, записани директно в кода.

В противен случай, някой зъл хакер би могъл така да ви прочете всичките променливи, ако поиска.

Затова и в горния случай няма да се отпечата 'Hidden value', а самият символ 'доларче', последвано от 'val': '$val'.
Низът не е hardcode-нат в скрипта, не е изписан в явен вид. А интерполиране се случва само в този случай.

В твоя случай с mail-а, имаш същата ситуация - низ, който не е hardcode-нат в програмата, а идва от БД. Съответно, в него интерполиране на променливите не се случва.
Затова се налага да правиш някакви логистики с разни placeholderи и ръчно да имплементираш заместването.

Re: PHP mail()

Posted: Sat Jun 13, 2020 12:03 am
by uphero
anonimen wrote:
Fri Jun 12, 2020 1:38 pm
Да разбираме, че в базата имаш запазен следния стринг:

Code: Select all

'Hello, $row[client_name]<p>Your service $row[support_service] expired. End date: $row[date_end]</p>'
И искаш като го вземеш с PHP, променливите автоматично да се попълнят?

Можеш да си направиш някакви placeholderи, с които да кодираш местата, на които искаш да застанат променливите, и след това със string_replace да извършиш заместването.

Например, вместо горния стринг, в базата ще пазиш нещо такова:

Code: Select all

'Hello, $$client_name$$<p>Your service $$support_service$$ expired. End date: $$date_end$$</p>'
И когато вземеш този низ в променлива, за да го изпратиш с mail, ще направиш нещо такова

Code: Select all

$parsed_str = str_replace($str_from_db, [ '$$client_name$$', .... ], [ $row["client_name"], .... ])
Където в двата масива изредаш нещата, които заместваш.
https://www.php.net/manual/en/function.sprintf.php

Re: PHP mail()

Posted: Sat Jun 13, 2020 9:28 am
by anonimen
uphero wrote:
Sat Jun 13, 2020 12:03 am
anonimen wrote:
Fri Jun 12, 2020 1:38 pm
https://www.php.net/manual/en/function.sprintf.php
Вариант, но така се обвръзва с подредбата на променливите. Ако реши да ги размести, ще трябва да оправя кода, а не само записа в таблицата.

Re: PHP mail()

Posted: Sat Jun 13, 2020 2:38 pm
by explozen
anonimen wrote:
Fri Jun 12, 2020 1:38 pm
Да разбираме, че в базата имаш запазен следния стринг:

Code: Select all

'Hello, $row[client_name]<p>Your service $row[support_service] expired. End date: $row[date_end]</p>'
И искаш като го вземеш с PHP, променливите автоматично да се попълнят?

Можеш да си направиш някакви placeholderи, с които да кодираш местата, на които искаш да застанат променливите, и след това със string_replace да извършиш заместването.

Например, вместо горния стринг, в базата ще пазиш нещо такова:

Code: Select all

'Hello, $$client_name$$<p>Your service $$support_service$$ expired. End date: $$date_end$$</p>'
И когато вземеш този низ в променлива, за да го изпратиш с mail, ще направиш нещо такова

Code: Select all

$parsed_str = str_replace($str_from_db, [ '$$client_name$$', .... ], [ $row["client_name"], .... ])
Където в двата масива изредаш нещата, които заместваш.
Не знам какво направих но сега в имейла получавам просто Array :D

Code: Select all

  $parsed_str = str_replace($expiryRow['e3_days_notifications_mail_text'], [ '$$client_name$$' ], [ $row["client_name"] ]);

if($e3_days_notifications == 1){
    if ($date_end == $today_date_minus_3_days) {
        if(basename(__FILE__)==basename($_SERVER['PHP_SELF']))echo email_send(
            $expiryRow['mail_from'],
            $row['client_email'],
            $expiryRow['e3_days_notifications_mail_subject'],
            "$parsed_str"
        );
    } 
  }
    }
Играх си доста но не успях да го направя....