условные операторы для выполнения запросов MySQL

Этот сценарий, над которым я работаю, извлекает электронные письма из базы данных, и если они удовлетворяют любому из условий, электронное письмо будет отправлено, а база данных будет обновлена ​​с указанием того, что электронное письмо было отправлено.

Я могу заставить скрипт сделать это, но я не могу заставить его перебирать все электронные письма внутри массива. Он запустит скрипт для одного письма, а затем будет ошибка: вызов функции 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 = 'josan.iracheta@gmail.com';
$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 = 'josan.iracheta@gmail.com';
$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 = 'josan.iracheta@gmail.com';
$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 = 'josan.iracheta@gmail.com';
$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

0

Решение

Я считаю, что ваша программа ломается, когда она попадает в вашу $updateResult = $update->execute(); линия, потому что $mysqli->query() вернуть истину для DML успешные запросы. Документация Здесь

Я считаю, что если вы удалите строки с вызовами execute, это должно исправить вашу проблему.

Если вы хотите сохранить строки выполнения, вам нужно изменить query() в prepare()

1

Другие решения

Других решений пока нет …