【问题标题】:Why is mime print in header and can't call a variable?为什么 mime 打印在标题中并且不能调用变量?
【发布时间】:2014-05-05 00:17:23
【问题描述】:

假设我有一堂课,例如:

class User{
     function callname(){
         $user = $_SESSION['id'];
         $query = ("SELECT * FROM user WHERE user.id='$user'");
         while ($result=mysql_fetch_array($query)){
              echo ($result['username']);}}}

然后,为用户对象创建实例:

$user = new User;

发送邮件的代码:

if($_SERVER["REQUEST_METHOD"] == "POST"){
$username = trim($_POST['username']);
$check = mysql_num_rows(mysql_query("SELECT * FROM user WHERE username='$username'"));

if ($check==TRUE){
    $name = $user->callname();
    $to = "myemail@domain.com";
    $subject = "Example Subject";
    $headers = "From: My Domain".'\r\n'.
      "MIME-Version: 1.0".'\r\n'.
      "Content-Type: text/html; charset=ISO-8859-1".'\r\n'.
      'X-Mailer: PHP/' . phpversion();
    $message = "Hai $name, this is the new message.";

            mail($to, $subject, $message, $headers);
} else {
    ?>
        <script type="text/javascript">
            alert("Sorry, username not exist !");
        </script>
        <?php
}

}

邮件功能正常工作,我也收到了一封电子邮件。问题是

  1. $name 未在电子邮件中打印用户名。我已经在没有if() 的不同页面上尝试了这个$name = $user-&gt;callname();,它正在工作。

  2. \r\nMIME-Version: 1.0 等被打印在 From 标题中。

【问题讨论】:

  • 危险:您使用的是an obsolete database API,应该使用modern replacement。您也容易受到SQL injection attacks的影响,现代 API 可以让您更轻松地从 defend 中获得。
  • 同意Quentin,至少你需要在$username上使用mysql_real_escape_string才能在查询中发送!
  • 感谢 Quentin 和 Jonas Äppelgran。我真的还是新手。需要了解更多。感谢您的解释。

标签: php email mime


【解决方案1】:
  1. 我认为您需要return $result['username'] 而不是回应它。
  2. 对于特殊字符,您需要将它们放在双引号 (") 中。

尝试更正您的代码:

class User{
     function callname(){
         $user = $_SESSION['id'];
         $query = mysql_query("SELECT * FROM user WHERE user.id='$user'");
         while ($result=mysql_fetch_array($query)){
              return $result['username'];}}}

下一部分:

if($_SERVER["REQUEST_METHOD"] == "POST"){
$username = mysql_real_escape_string(trim($_POST['username']));
$check = mysql_num_rows(mysql_query("SELECT * FROM user WHERE username='$username'"));

if ($check==TRUE){
    $name = $user->callname();
    $to = "myemail@domain.com";
    $subject = "Example Subject";
    $headers = "From: My Domain"."\r\n".
      "MIME-Version: 1.0"."\r\n".
      "Content-Type: text/html; charset=ISO-8859-1"."\r\n".
      'X-Mailer: PHP/' . phpversion();
    $message = "Hai $name, this is the new message.";

            mail($to, $subject, $message, $headers);
} else {
    ?>
        <script type="text/javascript">
            alert("Sorry, username not exist !");
        </script>
        <?php
}

【讨论】:

  • 这两个仍然不起作用。我尝试像这样$name = [$user-&gt;callname()]; 输入“[]”,结果值为“Array”,因此消息类似于“Hai Array,这是新消息。”
  • @merli 至少解决了第 2 个问题吧?请发布您更新的代码。我现在看到您实际上并没有在 callname() 中调用数据库。您正在使用 SQL 对字符串执行 mysql_fetch_array 。那里应该有一个 mysql_query 调用。
  • 还不是人。如果我使用双引号,则电子邮件没有发送。
  • 我已经把 'mysql_query' 放在前面了,但还是一样,乔纳斯。我试图在没有 if... 的情况下调用 $name = $user-&gt;callname(); 的简单代码页中的代码进行测试,这导致了名称。假设,这个名字是帕特里克。所以页面上打印了“Patrick”。
  • @merli 我尝试更正您的代码。请试一试。如果它不成功,我建议你用更新的代码提出一个新问题。祝你好运!
猜你喜欢
  • 2020-08-14
  • 2011-09-06
  • 2017-06-15
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多