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

C++ JAVA
explozen
Турист
Турист
Posts: 420
Joined: Thu Feb 10, 2011 7:15 pm
Answers: 13

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

Post by explozen » Fri Jun 12, 2020 1:11 pm

Здравейте :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:
Last edited by anonimen on Fri Jun 12, 2020 7:34 pm, edited 1 time in total.
Reason: Improved title

systems
Турист
Турист
Posts: 282
Joined: Fri Sep 28, 2012 7:04 pm
Location: ..

Re: PHP mail()

Post by systems » 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>";
?>

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1600
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: PHP mail()

Post by anonimen » 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"], .... ])
Където в двата масива изредаш нещата, които заместваш.

explozen
Турист
Турист
Posts: 420
Joined: Thu Feb 10, 2011 7:15 pm
Answers: 13

Re: PHP mail()

Post by explozen » Fri Jun 12, 2020 1:42 pm

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]"
        );

systems
Турист
Турист
Posts: 282
Joined: Fri Sep 28, 2012 7:04 pm
Location: ..

Re: PHP mail()

Post by systems » 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]"
        );
?>

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1600
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: PHP mail()

Post by anonimen » Fri Jun 12, 2020 7:31 pm

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 аргумент на функция ще е невалидно.

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1600
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: PHP mail()

Post by anonimen » Fri Jun 12, 2020 7:45 pm

Тъй като възникна въпрос на ЛС, ще разясня малко по-подробно какво имах предвид.

В 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и и ръчно да имплементираш заместването.

uphero
Потребител
Потребител
Posts: 774
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 32
Location: Казанлък
Contact:

Re: PHP mail()

Post by uphero » Sat Jun 13, 2020 12:03 am

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

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1600
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 165
Location: Parse error: unexpected "}" in /home/index.php on line 26

Re: PHP mail()

Post by anonimen » Sat Jun 13, 2020 9:28 am

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
Вариант, но така се обвръзва с подредбата на променливите. Ако реши да ги размести, ще трябва да оправя кода, а не само записа в таблицата.

explozen
Турист
Турист
Posts: 420
Joined: Thu Feb 10, 2011 7:15 pm
Answers: 13

Re: PHP mail()

Post by explozen » Sat Jun 13, 2020 2:38 pm

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"
        );
    } 
  }
    }
Играх си доста но не успях да го направя....

Post Reply