Редактировать: я решил проблему! Это была проблема, не связанная с кодом, который я выложил - у меня в сценарии была команда выхода - но все ваши советы все же помогли другим способом.
Я пытаюсь автоматически отправить электронное письмо пользователю, когда он заполняет свои выборы на спортивном веб-сайте. Ранняя часть скрипта работает: их выборы правильно вставлены или обновлены в базе данных. Сценарий прерывается, когда я пытаюсь извлечь адрес электронной почты пользователя из таблицы в базе данных MySQL и использовать его для отправки ему сообщения. Но что очень странно в этой ошибке, так это то, что она не приводит к появлению каких-либо сообщений об ошибках и по какой-то причине препятствует запуску некоторых операторов echo, в то же время позволяя другим.
Вот соответствующий код:
...
//set variable for the userID, grabbed from the session array
$userID = $_SESSION['identifier'];
...
//write query to get user's e-mail from the database
$getEmail = "SELECT `email` FROM `useraccounts` WHERE `userID` = '".$userID."'";
//execute query
$result = $db->query($getEmail);
//check if query failed
try
{
if (!$result)
{
throw new customexception("Some kind of database problem occurred when trying to find your e-mail address.");
}
}
catch (customexception $e)
{
include 'error.html';
echo $e;
$db->close();
include 'footer.php';
exit;
}
//get the info from the row
$row = $result->fetch_assoc();
//check if function ran, catch exception if it failed
try
{
if ($row === false)
{
throw new customexception("Some kind of database problem occurred when trying to get your e-mail address from your user record in the database.");
}
}
catch (customexception $e)
{
include 'error.html';
echo $e;
$db->close();
include 'footer.php';
exit;
}
//set e-mail variable
$email = $row['email'];
//set up e-mail information to send a record of their picks to the user
$toAddress = "$email";
$subject = "Your Picks";
$fromAddress = "From: picks@mysite.com";
//take the info the user submitted, format it for the e-mail, and assign to variable $mailContent
//the $winner1, $spread1, etc. variables are defined earlier in the function, and were successfully submitted into the database
$mailContent = "You picked $winner1 to win by $spread1 points, $winner2 to win by $spread2 points, $winner3 to win by $spread3 points, $winner4 to win by $spread4 points, and $winner5 to win by $spread5 points. \n".
"You can change your picks at any time before 1:00pm EST, February 27, 2011. Just go back to the form on the game page and enter your new picks. Good luck!";
//use wordwrap to limit lines of $mailContent to 70 characters
$mailContent = wordwrap($mailContent, 70);
//send the e-mail
$isMailed = mail($toAddress, $subject, $mailContent, $fromAddress);
//debug: check if mail failed
if (!$isMailed)
{
echo "Mail failed.";
}
//debug: echo $email to see if there's anything in there
echo "<p>E-mail: $email</p>";
//debug: echo $toAddress to see if there's anything in there
echo "<p>To address: $toAddress</p>";
//if everything succeeded, write reply and close database
echo $reply;
$db->close();
?>
Просто чтобы прояснить, $ userID установлен правильно, потому что их выборки поступают в базу данных, как и предполагалось. Ни одно из исключений, перечисленных в коде, не появляется, что означает, что запрос, похоже, успешно выполнен. Я снова проверил запрос, скопировав его из кода PHP и запустив его непосредственно в базе данных MySQL. Когда он запускался напрямую, он находил правильный адрес электронной почты для каждого введенного мной значения ID пользователя.
Но почта никогда не доставляется, и когда я пытаюсь отобразить переменные $ email и $ toAddress, чтобы увидеть, являются ли они пустыми:
//debug: echo $email to see if there's anything in there
echo "<p>E-mail: $email</p>";
//debug: echo $toAddress to see if there's anything in there
echo "<p>To address: $toAddress</p>";
... ничего не появляется. Даже не сообщение об ошибке. И это не обязательно означает, что переменные пусты: даже метки не отображаются.
Я также попробовал код с моей личной электронной почтой, жестко закодированной вместо $ toAddress, и письмо не было отправлено. Так что функция почты не работает.
Следует также отметить, что скрипт все еще успешно отображает $ reply (строка, определенная намного раньше) в конце.
Что действительно странно, так это то, что скрипт входа в систему для моего веб-сайта использует практически идентичный фрагмент кода и отлично работает:
$getuserID = "SELECT `userID` FROM `useraccounts` WHERE `u_name` = '".$login."' AND `p_word` = SHA1('".$password."')";
$result = $db->query($getuserID);
//check if query ran, catch exception if it failed
try
{
if ($result === false)
{
throw new customexception("Some kind of database problem occurred when trying to find your user ID.");
}
}
catch (customexception $e)
{
include 'error.html';
echo $e;
$db->close();
include 'footer.php';
exit;
}
//get the info from the row
$row = $result->fetch_assoc();
//check if function ran, catch exception if it failed
try
{
if ($row === false)
{
throw new customexception("Some kind of database problem occurred when trying to get info from your user record in the database.");
}
}
catch (customexception $e)
{
include 'error.html';
echo $e;
$db->close();
include 'footer.php';
exit;
}
//set userID variable
$userID = $row['userID'];
//assign the session identifier and include successfullogin.html if all is well
$_SESSION['identifier'] = $userID;
И я имел обыкновение, чтобы скрипт регистрации отправлял мне электронные письма каждый раз, когда я получал нового пользователя, поэтому я знаю, что mail () в целом работает с моим хостинг-провайдером:
//set up static e-mail information
$toAddress = "myemail@mysite.com";
$subject = "Advance Sign-Up";
$mailContent = "Name: $firstName $lastName \n".
"Username: $username \n".
"Password: $password \n".
"E-mail: $email \n".
"Country: $country \n".
"State: $state \n".
"City: $city \n".
"ZIP: $zip \n";
$fromAddress = "From: $email";
...
mail($toAddress, $subject, $mailContent, $fromAddress);
Эта ошибка совершенно загадочна для меня. Хотел бы я иметь какое-то сообщение об ошибке для работы, по крайней мере. Кто-нибудь может увидеть, что не так?