#php #mysql #sql #email #mysqli
#php #mysql #sql #Адрес электронной почты #mysqli
Вопрос:
Итак, я использую PHP следующим образом:
if(isset($userID)) {
$premium = $con->prepare("
SELECT Email
FROM tblName as d
WHERE Rank = $rank and Type = $type
");
$premium->execute();
$premium->bind_result($email);
} else {
echo "There is no User ID detected, try to refresh browser.";
}
while ($premium->fetch()) {
# SUBJECT (Subscribe/Remove)
$subject = "New Resume";
# RESULT PAGE
$location = "http://www.website.com";
$sender = "info@website.com";
# MAIL BODY
$message = '<html><body>';
$message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';
$message .= "</table>";
$message .= "</body></html>";
$cc = "ss@gmail.com";
$headers = "From: " . $sender . "rn";
$headers = "BCC: " . $cc . "rn";
$headers .= "Reply-To: ". strip_tags($_POST['Email']) . "rn";
$headers .= "MIME-Version: 1.0rn";
$headers .= "Content-Type: text/html; charset=ISO-8859-1rn";
$to = $email;
mail( $to, $subject, $message, $headers) or die ("Mail could not be sent.");
}
header("Location: http://website.com/");
die();
mysqli_close($link);
Но это не отправка электронной почты для каждого выбранного пользователя. Как правильно я мог бы использовать цикл? Должен ли я использовать foreach
или улучшать while
цикл? Как я могу подать заявку arrays
в этом случае? Может ли кто-нибудь направить меня по правильному пути? Спасибо!
Комментарии:
1. Вы упускаете из
prepared statements
виду возможность прямого встраивания переменных в заполнители sql — use и присваиваете переменные, входящиеbind_param
вmysqli
илиbindParam
в pdo. Начальнаяheaders
строка перезаписывается 2-й строкой$headers ="BCC: " . $cc . "rn";
2. у вас много ошибок в вашем коде
3. @mohade спасибо за ответ, я хотел бы услышать любые предложения по улучшению кода.
4. $ to = $email откуда вы получаете $email и каково его содержимое… второй $headers перезаписал первый, который ему нужен (.)
5. @mohade
bind_results
Ответ №1:
Поскольку вы используете BCC, не используйте цикл для отправки почты. перебирайте результат вашего запроса, собирайте все идентификаторы получателей и отправляйте почту за один вызов.
BCC: слепая копия для третичных получателей, которые получают сообщение. Первичные и вторичные получатели не могут видеть третичных получателей. В зависимости от программного обеспечения электронной почты третичные получатели могут видеть только свой собственный адрес электронной почты в BCC, или они могут видеть адреса электронной почты всех основных и вторичных получателей.
Комментарии:
1. Спасибо за ответ, я не буду использовать BCC в рабочем режиме, я использовал его только для целей тестирования прямо сейчас.
Ответ №2:
Я добился этого, используя циклы foreach.
Перед использованием циклов foreach сохраните все адреса электронной почты в одном массиве и выполните итерацию по массиву, чтобы сократить время выполнения.
Вы могли бы пойти другим путем, выполнив итерацию по всем данным, полученным из базы данных.
Ваш выбор.
Комментарии:
1. Спасибо за ответ, но я не знаю, как правильно использовать массивы для этого.
2. Использование
$emails= $premium->fetch_assoc()
3. Это не будет перезаписываться
bind_result($email);
? Мне все еще нужноwhile ($premium->fetch()) { }
?4. Вам больше не понадобятся все это
Ответ №3:
Вы должны использовать fetch_assoc()
in the while, поскольку, если вы используете это, он будет извлекать все записи одну за другой, а затем позволит отправлять почту в соответствии с требованиями, которые вам нужны.
И вам нужно объединить заголовок во второй строке здесь, потому что он перезапишет инструкции
Заменить:
$headers = "From: " . $sender . "rn";
$headers = "BCC: " . $cc . "rn";
с:
$headers = "From: " . $sender . "rn";
$headers .= "BCC: " . $cc . "rn";
Ответ №4:
Подготовленные инструкции должны использовать заполнители для безопасного назначения переменных перед выполнением
Как было указано в комментарии — если вы назначаете каждого получателя в поле BCC, вы можете собирать адреса электронной почты в цикле, но отправлять электронное письмо после цикла. Таким образом, каждый получатель увидит TO
адрес, но ни один из других получателей.
if( isset( $userID, $rank, $type, $_POST['Email'] ) ) {
/* create sql with placholders and prepare */
$sql='select email from tblname where rank=? and type=?';
$premium = $con->prepare( $sql );
/* Only proceed if the prepared statement succeeded */
if( $premium ){
/* bind the variables to the placeholders and execute */
$premium->bind_param('ss',$rank,$type);
$premium->execute();
$premium->bind_result( $email );
$to = "ss@gmail.com";
$bcc= array( $to );
$subject = "New Resume";
$location = "http://www.website.com";
$sender = "info@website.com";
/* collect all email addresses and add to BCC */
while( $premium->fetch() ) {
$bcc[]=$email;
}
/* close the prepared statement */
$premium->close();
/* Close the db connection */
$link->close();
$message = '
<html>
<body>
<table rules="all" style="border-color: #666;" cellpadding="10"></table>
</body>
</html>';
$headers = "From: " . $sender . "rn";
$headers .= "BCC: " . implode( ',', $bcc ) . "rn";
$headers .= "Reply-To: ". strip_tags( $_POST['Email'] ) . "rn";
$headers .= "MIME-Version: 1.0rn";
$headers .= "Content-Type: text/html; charset=ISO-8859-1rn";
$status=@mail( $to, $subject, $message, $headers );
die( header( "Location: " . ( $status ? 'http://website.com/?mailsent=true' : 'http://website.com/?mailsent=false' ) ) );
}
} else {
echo "There is no User ID detected, try to refresh browser.";
}