ユーザーのデータベースから電子メールアドレスを取得します。次に、これらのメールアドレスをapiで確認し、違反件数を返します。ループは1つの電子メールのみをチェックします
問題は、最初のメールアドレスを確認するようになっているように見えることです。私たちが複数ある場合は、最初は、侵害の正確な数を取得し、第二は、あなたのループで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();
?>
まあ、基本的なデバッグが必要です。 '$ row [" email "]'を出力します。その後、 '$ obj'を出力します。また、includeでは実際に呼び出されるべきではありません。ループの外側にある必要があります。 – Shadow
$ row ["email"]を印刷すると、正しいメールアドレスが得られます。エコーカウント($ obj)が発生すると、最初の電子メールの正当な違反件数が得られますが、結果として得られる電子メールには0が返されます。 – Kazura92
この単純なデバッグでは、MySQLをエラーの原因として排除しました。プロンプトなしであなた自身でこれを行うのは難しいですか? – Shadow