【问题标题】:Echo in heredoc / nowdoc syntaxheredoc / nowdoc 语法中的回显
【发布时间】:2014-08-22 19:22:50
【问题描述】:

我一直在阅读 Heredoc 和 Nowdoc 语法,我正在尝试了解如何摆脱它,以便添加其他功能。

我想在这部分之后打破它(如果可能的话):

User::sendNewticket($send_to, 'Maintenance Ticket '.Input::get('st_id'),

但是当我在'Maintenance Ticket '.Input::get('st_id'), ?> 之后添加?> 时会引发语法错误

无论如何,我暂时放弃了,如果我能弄清楚如何使用这种语法回显以下内容,我会很高兴:

'.$fn.'<br>
'.$time.'<br>
'.$stc.'<br>

类似于这个echo $fn;

这是与我的情况相关的代码。

<?php

include($_SERVER['DOCUMENT_ROOT'] . "/core/init.php");

// new data
$send_to           = $_POST['send_to'];
$rec_message       = $_POST['rec_message'];

//Message
$status            = $_POST['status'];
$st_id             = $_POST['st_id'];
$posted_by         = $_POST['posted_by'];
$posted_on         = $_POST['posted_on'];
$unit              = $_POST['unit'];
$subject           = $_POST['subject'];
$content           = $_POST['content'];

//Loader & Flash Message
echo '<meta http-equiv="refresh" content="5;URL=/admin/maintenance/email-ticket.php?st_id='.$st_id.'">'; 
Session::flash('email-ticket', '<h3 class="orange-tx" align="center">Your Email has been sent!</h3>');

//Replies
//$id                = $_POST['id'];
//$from_name           = $_POST['from_name'];
//$st_time         = $_POST['st_time'];
//$st_content          = $_POST['st_content'];

//Pulling Conversation from database
$st_messages = DB::getInstance()->query("SELECT `id`,`st_id`,`from_name`,`st_content`,`st_time` FROM `st_messages` WHERE `st_id` = $st_id ORDER BY id ASC");


foreach ($st_messages->results() as $mt) {
if($mt->from_name=='Support Team'){
} else {
}

$fn = escape ($mt->from_name);
$time = escape (date("F d, Y - h:i a", strtotime ($mt->st_time)));
$stc = nl2br (escape($mt->st_content));

//START EMAIL
User::sendNewticket($send_to, 'Maintenance Ticket '.Input::get('st_id'), 
'Hello -<br><br>
'.Input::get('rec_message').'<br><br>


<strong>Ticket Info:</strong><br><br>

<strong>Status: </strong>'.Input::get('status').'<br>
<strong>Ticket #: </strong>'.Input::get('st_id').'<br>
<strong>Posted By: </strong>'.Input::get('posted_by').'<br>
<strong>Posted On: </strong>'.Input::get('posted_on').'<br>
<strong>Building Unit: </strong>'.Input::get('unit').'<br>
<strong>Subject: </strong>'.Input::get('subject').'<br>
<strong>Ticket Message: </strong>'.Input::get('content').'<br><br>

<strong>Conversation:</strong><br><br>

'.$fn.'<br>
'.$time.'<br>
'.$stc.'<br>
---------------------------------<br><br>


Thank You,<br>
Support Team');
}
?>

我正在尝试将支持票证对话通过电子邮件发送给一位收件人。 像这样:

我从消息 $_POST 中收到“原始消息”。以及来自新数据 $_POST 的电子邮件地址和电子邮件消息。

为了对话我正在尝试从数据库表中提取该信息。

我当前的代码通过电子邮件发送对话,但在多封电子邮件中通过电子邮件发送每个对话。

例如,如果对话中有 3 个条目,它会发送 3 封电子邮件:

  • 电子邮件 1 包含:管理员回复 1
  • 电子邮件 2 包含:用户回复 1
  • 电子邮件 3 包含:管理员回复 2

我认为,如果我让 echo 工作,它会将整个对话分组到一封电子邮件中。

这是我尝试获得的最终电子邮件输出示例:

你好-

嘿,请查看这张票并解决问题。 谢谢

票务信息:

  • 状态:打开
  • 票号:201406016
  • 发布者:用户名
  • 发布于:2014 年 6 月 27 日 - 下午 3:46
  • 建筑单元:D47
  • 主题:1
  • 票务信息:1

对话:

支持团队

2014 年 7 月 1 日 - 上午 09:19

管理员回复 1


用户名

2014 年 7 月 1 日 - 上午 09:19

用户回复 1


支持团队

2014 年 7 月 1 日 - 上午 09:19

管理员回复 2


谢谢,

支持团队


END 电子邮件示例

任何建议都会有所帮助。

更新

我开始更好地理解这一点。我收到的唯一错误是在我的 foreach 循环中不知道如何纠正它。

代码如下:

$st_messages = DB::getInstance()->query("SELECT `id`,`st_id`,`from_name`,`st_content`,`st_time` FROM `st_messages` WHERE `st_id` = $st_id ORDER BY id ASC");

//START EMAIL
$recMessage = Input::get('rec_message');
User::sendNewticket($send_to, 'Maintenance Ticket '.Input::get('st_id'), <<<TEXT
Hello -<br><br>
$recMessage
TEXT

foreach ($st_messages->results() as $mt) {

$fn = "echo escape ($mt->from_name);";
$time = "echo escape (date(\"F d, Y - h:i a\", strtotime ($mt->st_time)));";
$stc = "echo nl2br (escape($mt->st_content));";
}


<<<TEXT2
<strong>Conversation:</strong><br><br>
 
$fn<br>
$time<br>
$stc<br><br>

Thanks,<br>
Support Team
);
TEXT2

?>

【问题讨论】:

    标签: php mysql email


    【解决方案1】:

    我相信这是你打算做的,看起来有点尴尬:

    $fn = escape($mt->from_name);
    $time = escape(date("F d, Y - h:i a", strtotime($mt->st_time)));
    $stc = nl2br(escape($mt->st_content));
    
    //START EMAIL
    User::sendNewticket($send_to, 'Maintenance Ticket ' . Input::get('st_id'), <<<TEXT
    Hello -<br><br>
    TEXT
            . Input::get('rec_message') . <<<TEXT2
    <br><br>
    
    <strong>Conversation:</strong><br><br>
    
    $fn<br>
    $time<br>
    $stc<br>
    
    TEXT2
    );
    

    heredoc 的开头必须是一行的最后一件事,所以之后你下拉并立即进入文本块。 heredoc 必须 的结尾是该行中唯一的内容,因此要连接它,您必须先下拉一行,然后才能使用运算符 (.)。在 heredoc 中,您也不需要使用任何引号或附加运算符。

    事实上,这太不直观了,即使是 StackOverflow 语法荧光笔也会出错,当我运行这个时,第一个 &lt;&lt;&lt;TEXT 工作正常:

    $mt = new stdClass();
    function escape($v){return $v;}
    class User{static function sendNewTicket($a, $b, $c){echo $c;}}
    class Input{static function get($a){return 'Got something';}}
    $send_to = '';
    $mt->from_name = 'Kitty';
    $mt->st_time = '5th November';
    $mt->st_content = <<<CONTENT
        Dear Judy,
    
            Lorem Dipsum and all that jazz.
    
            Toodles,
                Kitty.
    CONTENT;
    
    $fn = escape($mt->from_name);
    $time = escape(date("F d, Y - h:i a", strtotime($mt->st_time)));
    $stc = nl2br(escape($mt->st_content));
    
    //START EMAIL
    User::sendNewticket($send_to, 'Maintenance Ticket ' . Input::get('st_id'), <<<TEXT
    Hello -<br><br>
    TEXT
            . Input::get('rec_message') . <<<TEXT2
    <br><br>
    
    <strong>Conversation:</strong><br><br>
    
    $fn<br>
    $time<br>
    $stc<br>
    
    TEXT2
    );
    

    它产生了:

    Hello -<br><br>Got something<br><br>
    
    <strong>Conversation:</strong><br><br>
    
    Kitty<br>
    November 05, 2014 - 12:00 am<br>
        Dear Judy,<br />
    <br />
            Lorem Dipsum and all that jazz.<br />
    <br />
            Toodles,<br />
                Kitty.<br>
    

    虽然我相信你的数据会更好看。

    编辑:正如Blizz 非常正确地指出的那样,如果将rec_message 保存到变量中,则可以完全避免串联:

    $recMessage = Input::get('rec_message');
    User::sendNewticket($send_to, 'Maintenance Ticket ' . Input::get('st_id'), <<<TEXT
    Hello -<br><br>
    $recMessage
    <br><br>
    
    <strong>Conversation:</strong><br><br>
    
    $fn<br>
    $time<br>
    $stc<br>
    
    TEXT
    );
    

    编辑 2:对于额外的消息,您应该使用类似这样的东西来简化电子邮件:

    $messages = '';
    foreach($st_messages->results() as $mt)
    {
    
        $fn = escape($mt->from_name);
        $time = escape(date("F d, Y - h:i a", strtotime($mt->st_time)));
        $stc = nl2br(escape($mt->st_content));
    
        $messages .= <<<MESSAGE
    
    $fn<br>
    $time<br>
    $stc<br><br>
    
    MESSAGE;
    }
    
    $recMessage = Input::get('rec_message');
    User::sendNewticket($send_to, 'Maintenance Ticket ' . Input::get('st_id'), <<<TEXT
    Hello -<br><br>
    $recMessage
    <strong>Conversation:</strong><br><br>
    
    $messages
    
    Thanks,<br>
    Support Team
    
    TEXT
    );
    ?>
    

    带有一些基本的虚拟文本会产生:

    Hello -<br><br>
    Got something
    <strong>Conversation:</strong><br><br>
    
    
    Person<br>
    November 11, 2014 - 12:00 am<br>
    My message blah blah<br><br>
    
    sdfasdf<br>
    April 11, 2014 - 12:00 am<br>
    My message asdfasdf blah blah<br><br>
    
    
    Thanks,<br>
    Support Team
    

    【讨论】:

    • 如果您在启动HEREDOC 之前也将Input::get('rec_message') 的输出捕获到变量中,则无需实际中断它。
    • 看起来干净多了:)
    • @MrLore 我尝试了你的方法,就代码而言它有效,但仍然收到 3 封多封电子邮件,其中分别包含来自对话的每个回复。我用完整的代码和更多细节更新了我的问题。
    • @MrLore 一切正常,但似乎无法弄清楚如何将对话中的 3 个回复发送到电子邮件中。我在这里错过了什么吗?
    • @echo 它只是允许我们建立对话,这样我们就可以将它们全部放入带有一个变量的电子邮件中,尝试将三个 heredocs 与 for 连接在一起将是一团糟在中间循环。
    猜你喜欢
    • 2012-06-24
    • 2015-10-16
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2011-07-25
    • 2020-06-11
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多