Этот сценарий, над которым я работаю, извлекает электронные письма из базы данных, и если они удовлетворяют любому из условий, электронное письмо будет отправлено, а база данных будет обновлена с указанием того, что электронное письмо было отправлено.
Я могу заставить скрипт сделать это, но я не могу заставить его перебирать все электронные письма внутри массива. Он запустит скрипт для одного письма, а затем будет ошибка: вызов функции execute () для необъекта. Итак, из этого я понимаю, что когда цикл foreach выполняет итерации по другому электронному письму, внутри этой переменной нет ничего для запроса, который можно вставить в базу данных.
Если я снова запустю сценарий, обновив страницу, он вставит электронное письмо, которое не было во время предыдущего вызова, но при следующем письме внутри массива выдаст такую же ошибку.
Итак, мой вопрос: как я могу заставить свой скрипт перебирать все электронные письма в массиве, чтобы он не выдавал ошибку?
date_default_timezone_set('America/Los_Angeles');
$today = date('m/d/Y h:i:s a');
$time = time();
require('addrow_info.php');
//connect to database
$mysqli = new mysqli('localhost', $username, $password, $database);
if(!$mysqli){
die('Not connected :' . mysqli_error($mysqli));
}
$query = $mysqli->query("SELECT * FROM abandoned WHERE orderStatus IS NULL ORDER BY time DESC");
if(!$query){
die('Invalid query :' . mysqli_error($mysqli));
}
while($email = mysqli_fetch_array($query)){
$abandoned[] = array(
'email' => $email['email'],
'time' => $email['time'],
'status' => $email['orderStatus'],
'attempts' => $email['attempts']
);
}
$mysqli->close();
//open new connection
$mysqli = new mysqli('localhost',$username,$password,$database);
if(!$mysqli){
die('Not connected : ' . mysqli_error($mysqli));
}
foreach($abandoned as $viewAbandoned){
$timeAbandoned = strtotime($viewAbandoned['time']);
if($timeAbandoned < strtotime('-1 hour') && $viewAbandoned['attempts'] == '0'){
echo "Order by " . $viewAbandoned['email'] . " was abandoned more than 1 hour ago<br/>";
//send email to remind them of items in their cart
$to = '[email protected]';
$subject = 'new abandoned email';
$message = $viewAbandoned['email'];
$sendmail = mail($to,$subject,$message);
if(!$sendmail){
echo "Mail not sent!";
}
else{
echo "Mail sent!";
//update database with email attempt
$update = $mysqli->query("UPDATE abandoned SET attempts = '1' WHERE email = '".$viewAbandoned['email']."' ");
$updateResult = $update->execute();
}//end if Mail was sent, database was updated with attempt
}//end if abandoned cart is more than 1 hour old
//if email has been sent once, send after 6 hours
elseif($timeAbandoned < strtotime('-6 hours') && $viewAbandoned['attempts'] == '1'){
//send email to remind them of items in their cart
$to = '[email protected]';
$subject = 'new abandoned email';
$message = 'Second notice ' . $viewAbandoned['email'];
$sendmail = mail($to,$subject,$message);
if(!$sendmail){
echo "Mail not sent!";
}
//if mail is sent
else{
echo "Mail sent!";
//update database with email attempt
$update = $mysqli->query("UPDATE abandoned SET attempts = '2' WHERE email = '".$viewAbandoned['email']."' ");
$updateResult = $update->execute();
}//end if Mail was sent
//database was updated with attempt
}
//send email after 24 hours
elseif($timeAbandoned < strtotime('-24 hours') && $viewAbandoned['attempts'] == '2'){
//send email to remind them of items in their cart
$to = '[email protected]';
$subject = 'new abandoned email';
$message = 'third notice' . $viewAbandoned['email'];
$sendmail = mail($to,$subject,$message);
if(!$sendmail){
echo "Mail not sent!";
}
else{
echo "Mail sent!";
//update database with email attempt
$update = $mysqli->query("UPDATE abandoned SET attempts = '3' WHERE email = '".$viewAbandoned['email']."' ");
$updateResult = $update->execute();
}//end if Mail was sent
//database was updated with attempt
}
//send email after one week
elseif($timeAbandoned < strtotime('-168 hours') && $viewAbandoned['attempts'] == '3'){
//send email to remind them of items in their cart
$to = '[email protected]';
$subject = 'new abandoned email';
$message = 'It has been one week already' . $viewAbandoned['email'];
$sendmail = mail($to,$subject,$message);
if(!$sendmail){
echo "Mail not sent!";
}
else{
echo "Mail sent!";
//update database with email attempt
$update = $mysqli->query("UPDATE abandoned SET attempts = '4' WHERE email = '".$viewAbandoned['email']."' ");
$updateResult = $update->execute();
}//end if Mail was sent
//database was updated with attempt
}
}//end foreach loop
Я считаю, что ваша программа ломается, когда она попадает в вашу $updateResult = $update->execute();
линия, потому что $mysqli->query()
вернуть истину для DML успешные запросы. Документация Здесь
Я считаю, что если вы удалите строки с вызовами execute, это должно исправить вашу проблему.
Если вы хотите сохранить строки выполнения, вам нужно изменить query()
в prepare()
Других решений пока нет …