Неопределенная переменная в PHP при обращении к элементу MySQL - PullRequest
0 голосов
/ 28 февраля 2011

Редактировать: я решил проблему! Это была проблема, не связанная с кодом, который я выложил - у меня в сценарии была команда выхода - но все ваши советы все же помогли другим способом.

Я пытаюсь автоматически отправить электронное письмо пользователю, когда он заполняет свои выборы на спортивном веб-сайте. Ранняя часть скрипта работает: их выборы правильно вставлены или обновлены в базе данных. Сценарий прерывается, когда я пытаюсь извлечь адрес электронной почты пользователя из таблицы в базе данных 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);

Эта ошибка совершенно загадочна для меня. Хотел бы я иметь какое-то сообщение об ошибке для работы, по крайней мере. Кто-нибудь может увидеть, что не так?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Это должен быть комментарий, но только для форматирования.
Ваш способ обработки ошибок довольно необычен.
Если вы действительно хотите использовать исключения, это следует сделать по-другому: один блок try и несколькоброски:

  try
  {
    $getEmail = "SELECT `email` FROM `useraccounts` WHERE `userID` = '".$userID."'";
    $result = $db->query($getEmail);
    if (!$result)
    {
      throw new customexception("Some kind of database problem occurred when trying to find your e-mail address.");
    }
    $row = $result->fetch_assoc();
    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.");
    }
    $email = $row['email'];
    $toAddress = "$email";
    $subject = "Your Picks";
    $fromAddress = "From: picks@mysite.com";
    $mailContent =  "yadda yadda yadda";
    $mailContent = wordwrap($mailContent, 70);

    mail($toAddress, $subject, $mailContent, $fromAddress);

  }
  catch (customexception $e)
  {
    include 'error.html';
    echo $e;
    $db->close();
    include 'footer.php';
    exit;
  }
?>
0 голосов
/ 28 февраля 2011

Лучший способ игнорировать такие уведомления - убедиться, что переменные существуют или в простом PHP, использовать isset (), если! Isset () генерирует исключение / ошибку и обрабатывает ее правильно

0 голосов
/ 28 февраля 2011

Вы уверены, что переменные базы данных имеют содержимое? Я использую echo (или print), чтобы быстро убедиться, что переменные не пусты. Вы уверены, что ваш почтовый код работает? Попробуйте установить значения (например, свой личный адрес электронной почты), чтобы убедиться, что он работает.

...