Должен ли я использовать foreach для того, чтобы этот скрипт PHP работал как положено?
У меня есть скрипт, который ищет в каталоге файлы, содержащие определенную строку (например, 5126). Затем он переименовывает каждый файл, который имеет эту строку в своем имени файла, и добавляет к имени файла префикс другой строкой (например, 'coursefile5126). Этот бит отлично работает. После того, как строка была переименована, я хочу отправить электронное письмо человеку, чей файл это. На данный момент мой сценарий отправляет только письма последнего человека, возвращенного в массиве, со ссылками на все файлы. Пожалуйста, смотрите примеры и код ниже.
пример имени файла:
- Test_47-20120908-154525-5126.zip
- Test_48-20120908-155253-5126.zip
- Test_49-20120908-160226-5125.zip
пример массива:
- [email protected], 51, 26
- [email protected], 51, 25
Как видите, ссылки test_47 и test_48 следует отправлять на [email protected], а test_49 - на [email protected], но на данный момент все электронные письма отправляются на последнее электронное письмо в массиве ([email protected] в этом примере)
Может кто-нибудь, пожалуйста, дайте мне понять, где я не так с этим?
Благодарю.
$dh = scandir("courses/");
...some SQL query here that returns an array
$i=0;
while ($data= mysql_fetch_array($query)) {
$j=1;
//this is the array returned by the SQL query
echo $data["email"]."-".$data["id_cart"]."-".$data["id_product"]."<br/>";
while ($j<sizeof($dh)) { //Ensures there are courses to look for
// this looks for courses that have not yet been renamed and prefixes them with the string 'coursefile' if necessary
if(end(explode("-",$dh[$j]))==$data["id_product"].$data["id_cart"].".zip" && reset(explode("-",$dh[$j])) != 'coursefile')
{
rename('courses/'.$dh[$j],'courses/'.'coursefile-'.$dh[$j]);
//sends email ---- this is where my problem lies I think
$to = $data["email"];
$subject = 'Your link to download your course';
$message = 'Link: http://www.website.com/courses/'.'coursefile-'.$dh[$j];
$headers = 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n";
mail($to, $subject, $message, $headers);
}
$j++;
}
}
1 ответ
Ваш код немного сложен для понимания, но из вашего описания вот мое предложение:
Вы можете использовать glob, чтобы упростить ваш поиск и удалить все ненужные условия. Таким образом, код может стать:
// This needs to be adjusted to the current settings.
$full_path = $current_path . '/courses';
...some SQL query here that returns an array
while ($data = mysql_fetch_array($query))
{
// this is the array returned by the SQL query
echo $data["email"]."-".$data["id_cart"]."-".$data["id_product"]."<br/>";
// This is what we are looking for for every user
$key = $data["id_cart"] . $data["id_product"];
foreach (glob("{$full_path}/*-{$key}.zip") as $filename)
{
// glob returns the full path so we need to split it from
// the actual filename. I am assuming that the $full_path
// is known and it is the full path for the courses/ folder.
// $real_filename contains the name of the file processed
// (used in checking if the file has been renamed and in renaming)
$real_filename = str_replace($full_path, '', $filename);
// Check if the file has already been processed i.e. renamed
if (substr($real_filename, 0, 11) != 'coursefile-')
{
// There are files so, rename and then email
rename($filename, $full_path . 'coursefile-' . $real_filename);
// sends email
$to = $data["email"];
$subject = 'Your link to download your course';
$message = 'Link: http://www.website.com/courses/'
. 'coursefile-' . $real_filename;
$headers = 'From: [email protected]' . "\r\n"
. 'Reply-To: [email protected]' . "\r\n";
$mail_status = mail($to, $subject, $message, $headers);
}
}
}
НТН