Php file\u get\u contents和foreach循环-仅插入最后一条记录

Php file\u get\u contents和foreach循环-仅插入最后一条记录,php,mysql,foreach,file-get-contents,Php,Mysql,Foreach,File Get Contents,我正在编写脚本,它从表单中的URL提取电子邮件并将其添加到数据库中。 我有两个问题: 1.只有来自上一个url的电子邮件才会添加到数据库中 2.如何将电子邮件添加到数据库?;)当我使用变量$email或$email[0]时,我在表中收到一个空字段或数组。我已经通过使用foreach循环避免了这种情况,但我希望您能找到一些更方便的解决方案 $linki = explode("\n", $_POST['linki']); $db = new mysqli('localhost', 'root',

我正在编写脚本,它从表单中的URL提取电子邮件并将其添加到数据库中。 我有两个问题:

1.只有来自上一个url的电子邮件才会添加到数据库中

2.如何将电子邮件添加到数据库?;)当我使用变量$email或$email[0]时,我在表中收到一个空字段或数组。我已经通过使用foreach循环避免了这种情况,但我希望您能找到一些更方便的解决方案

$linki = explode("\n", $_POST['linki']); 

$db = new mysqli('localhost', 'root', 'root', 'linki');  

if (mysqli_connect_errno()) {
    echo 'error: ';
    exit;
}


foreach ( $linki as $link) {

    $przetwarzany_url = file_get_contents($link);

    preg_match( "/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $przetwarzany_url, $email);//email


    $query = "INSERT INTO urle set adres = '$email' "; //this query doens't add the email to db

    $result = $db->query($query);
    }
这是我从print_r($link)的输出;在foreach循环中:

firsturl.com array(0) { } secondurl.com array(1) { [0]=> string(17) "xxx@xxx.xxx" }

你有很多失败的地方:

  • 您不会检查
    $link
    是否有效-因为它来自web表单,所以没有任何东西可以阻止恶意用户输入以下内容:http://childporn.com'等等,然后脚本将尝试获取其内容
  • 您不会检查
    文件\u get\u contents()
    是否实际返回了任何内容
  • 你不会检查正则表达式是否真的找到了一个电子邮件地址
  • 您没有清理任何与插入DB匹配的内容,因此您有一个SQL注入漏洞
  • 您不会检查DB insert查询是否实际成功

  • 在代码中添加检查以处理所有这些问题,您可能会发现为什么只有一些插入才能成功。

    啊,是的,childporn.com-我不敢相信它被关闭了,它太不显眼了+1仅此一项,尽管您的其余答案也是+1;-)嗯,.com命名规则就像Reddit规则34——如果它存在,就有一个.com。嘿,马克,谢谢你的回答。正如您所看到的,实际上我正在本地主机上使用此脚本。您的检查肯定是好的,但脚本将只由我使用,我把它放在这里这样的形式,使它更清楚。文件\u获取\u内容不为空。这是我从print_r($link)的输出;在foreach循环中:数组(0){}数组(1){[0]=>string(17)”xxx@xxx.xxx“}不要将代码块粘贴到注释中。他们被弄坏了。。。把它放在你上面的问题里,我已经放在那里了。你有什么建议吗?