【问题标题】:How to input emails into mysql database如何将电子邮件输入到mysql数据库中
【发布时间】:2019-09-14 19:50:51
【问题描述】:

所以我正在尝试存储来自 gmail 的电子邮件,我已经连接了所有内容,并且我设法将所有电子邮件内容存储到数据库中,但现在我遇到问题,每次刷新页面时,相同的电子邮件都存储在数据库中。

$bodyText = imap_fetchbody($inbox,$email_number,1.2);

if(!strlen($bodyText)>0){
    $bodyText = imap_fetchbody($inbox,$email_number,1);
}
$subject = imap_headerinfo($inbox,$email_number);
$subject = $subject->subject;
$stripped = str_replace('*', '<br>', $bodyText);

$sql = "SELECT id, subject, body FROM emails";
$result = $conn->query($sql);

 if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
   $email_subject = $row['subject'];
    if ($subject == $email_subject) {
        echo "Email already in database";
    }else{
         $sql = "INSERT INTO emails (subject, body)
        VALUES ('".$subject."', '".$stripped."')";
            if ($conn->query($sql) === TRUE) {
            echo "New record created successfully";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
     }
}
} else {
echo "0 results";
}

所以我尝试使用这个

if ($subject == $email_subject) {
        echo "Email already in database";
    }else{
         $sql = "INSERT INTO emails (subject, body)
        VALUES ('".$subject."', '".$stripped."')";
            if ($conn->query($sql) === TRUE) {
            echo "New record created successfully";
        } else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }
     }

它应该检查数据库中是否有相同主题的电子邮件,如果有则显示“电子邮件已在数据库中”,如果没有则应显示“新记录创建成功”

输入有问题,我在数据库中不断收到相同的电子邮件,所以每次我刷新我的电子邮件的整个收件箱时都会进入数据库

【问题讨论】:

  • 警告:您可能对SQL Injections 持开放态度,应该真正使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何类型的输入,尤其是来自客户端的输入。即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data
  • 感谢您指出,我只是在我的本地主机上尝试一些东西,一旦我设法添加了我需要更新代码的所有功能,我将阅读有关 MySqli 的信息
  • @Dharman 有更多方法可以破坏数据以添加到您的评论中,令人恐惧的 NULL 字节请参阅demo 注意我插入了重复的电子邮件,而电子邮件列有一个唯一键.. 使用@ PHP 中的 987654330@ 将其过滤掉。在 MySQL 8.0 中,此问题已修复,请参阅 demo
  • @JovanDjordjevic 如果每次有人在生产中使用“临时”代码我都能得到一美元,我会成为一个有钱人。让它工作并然后稍后添加安全性是灾难的邀请。现在就开始使用准备好的语句,以后不用再头疼了

标签: php mysql imap


【解决方案1】:

首先,您应该始终使用 PDOMySQLi 的预处理语句来防止 SQL 注入。

看起来您正在循环访问数据库中的条目,并针对每个条目检查您当前的电子邮件。 您应该做的是使用带有当前电子邮件主题的 SELECT 查询作为 WHERE 参数来检查该主题是否已经在数据库中。

插入新记录时也可以使用ON DUPLICATE KEY UPDATE

【讨论】:

  • 您可以将准备好的语句与 PDO 或 MySQLi 一起使用。它是防止 SQL 注入的准备好的语句。
  • 感谢这个答案帮助了我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多