2017-04-26 166 views
0

我们从用户数据库中获取电子邮件地址。然后,我们希望在api中检查这些电子邮件地址并返回违规数量。Loop仅检查一封电子邮件

问题是,现在它似乎只检查第一个电子邮件地址。当我们有多个,第一个得到正确的违规数,第二个得到0。

<?php 
ini_set("allow_url_fopen", 1); 
include '/home/actiorwd/include/dbinfo.php'; 

$servername = "localhost"; 
$dbname = "actiorwd_websec"; 

// Create connection 
$conn = new mysqli($servername, $user, $passw, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 
//users contains two columns; email and breaches. 
$sql = "SELECT * FROM users"; 
$result = $conn->query($sql); 

$ch = curl_init(); 

if ($result->num_rows > 0) { 
    // output data of each row 

    while($row = $result->fetch_assoc()) { 
     $url = 'https://haveibeenpwned.com/api/v2/breachedaccount/'; 
     $url.= $row["email"]; 

     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     $results = curl_exec($ch); 
     curl_close($ch); 
     $obj = json_decode($results, TRUE); 

     $usermail = $row["email"]; 



     $newbreaches = count($obj); 

     //run if new breaches are found 
     if($row["breaches"]!==$newbreaches){ 

      require_once('/home/actiorwd/public_html/PHPMailer/PHPMailerAutoload.php'); 
      $mail = new PHPMailer; 

      $mail->isSMTP();          // Set mailer to use SMTP 
      $mail->Host = 'cpanel40.proisp.no'; // Specify main and backup SMTP servers 
      $mail->SMTPAuth = true;        // Enable SMTP authentication 
      $mail->Username = '[email protected]';     // SMTP username 
      $mail->Password = 'PASSWORDHERE';       // SMTP password 
      $mail->SMTPSecure = 'ssl';       // Enable TLS encryption, `ssl` also accepted 
      $mail->Port = 465;         // TCP port to connect to 

      $mail->setFrom('[email protected]', 'WebSec'); 
      $mail->addAddress($row["email"]);  // Add a recipient 
      $mail->addReplyTo('[email protected]', 'WebSec'); 

      $mail->isHTML(true);         // Set email format to HTML 

      $mail->Subject = 'Breached!!!!'; 
      $mail->Body = 'Someone breached your account, there are: '.$newbreaches."breaches"; 
      $mail->AltBody = 'Someone breached your account in plain text'; 
      $mail->send(); 
      /* 
      if(!$mail->send()) { 
       echo 'Message could not be sent.'; 
       echo 'Mailer Error: ' . $mail->ErrorInfo; 
      } else { 
       echo 'Message has been sent'; 
      } 

      */ 


      $updatebreach = "INSERT INTO users (`email`, `breaches`) VALUES ('$usermail', '$newbreaches') ON DUPLICATE KEY UPDATE `breaches` = '$newbreaches' "; 
      //echo $updatebreach; 

      if ($conn->query($updatebreach) === TRUE) { 
       //echo "New record created successfully"; 
      } else { 
       //echo "Error: " . $updatebreach . "<br>" . $conn->error; 
      } 


     } 


    } 
} else { 
    echo "0 results"; 
} 
$conn->close(); 
?> 
+2

那么,你需要做基本的调试。打印出'$ row [“email”]''。然后打印'$ obj'。另外,include不应该在外观中调用,它应该在循环之外。 – Shadow

+0

打印出$ row [“email”]时,我收到了正确的电子邮件地址。当回声计数($ obj)我得到第一封电子邮件的正确数量的违规,但在随后的电子邮件,我得到0. – Kazura92

+0

通过这个简单的调试,你排除了MySQL作为一个可能的错误来源...是真的吗?难以独立完成此任务而没有任何提示? – Shadow

回答

2

看看你的循环,或更好的循环前的行。你正在做:

$ch = curl_init(); - 所以你initalize cURL会议。你只做一次,因为它在循环之外。

然后,几行后,youre做:

curl_close($ch); - 关闭卷曲会话。你在每次通话后都会这样做,因为它在你的循环中。因此,主要是你初始化,运行cURL的东西(这就是为什么它适用于第一个),然后它停止工作,因为你关闭你的cURL会话,并永远不会打开一个新的。

只需从循环中取出curl_close$ch);并将其放在文件末尾,以便可以使用相同的会话执行所有请求。那么它应该工作:)

你的文件的末尾应该是这个样子:

} 
curl_close($ch); 
$conn->close(); 
?> 

希望它帮助。

+0

我试着把它加到你的建议的最后,但我仍然得到相同的结果。它似乎仍然只运行第一封电子邮件。 – Kazura92

+0

嗯。但是你已经从循环中删除了,不是吗? – Twinfriends

+0

是的。它完全像你的例子。 https://pastebin.com/FJE4G9Xh – Kazura92