2012-01-10 3 views
0

Я пытаюсь использовать phpmailer для рассылки бюллетеней, но каждый раз, когда я пытаюсь запустить его, я получаю следующую ошибку. Я не уверен, правильный ли синтаксис sql или нет?phpmailer throwing mysql error

Warning: mysql_fetch_array() : supplied argument is not a valid MySQL result resource in view.html.php(38):eval()'d code on line 32

<?php 
$formid = $_GET[token]; 
$templatequery = mysql_query(" 
    SELECT * 
    FROM hqfjt_chronoforms_data_addmailinglistmessage 
    WHERE cf_id = '$formid'" 
) or die(mysql_error()); 

$templateData = mysql_fetch_object($templatequery); 

$gasoiluserTemplate = $templateData->gasoilusers; 
$dervuserTemplate = $templateData->dervusers; 
$kerouserTemplate = $templateData->kerousers; 
$templateMessage = $templateData->mailinglistgroupmessage; 
?> 

<?php 
require_once('./send/class.phpmailer.php'); 
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded 
$mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch 

// $body = file_get_contents('contents.html'); 
$body = 'Dear Test this is a test.'; 
// $body = preg_replace('/\\\\/i', $body); 

$mail->SetFrom('[email protected]', 'List manager'); 
$mail->AddReplyTo('[email protected]', 'List manager'); 

$mail->Subject = "Mailing List Test"; 

$query = " 
    SELECT leadname,businessname,email 
FROM hqfjt_chronoforms_data_addupdatelead 
WHERE keromailinglist='$kerolist' 
    AND dervmailinglist='$dervlist' 
    AND gasoilmailinglist='$gasoillist'"; 
$result = @MYSQL_QUERY($query); 

while ($row = mysql_fetch_array ($result)) { 
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 
    $mail->MsgHTML($body); 
    $mail->AddAddress($row["email"], $row["full_name"]); 
    $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg"); 

    if(!$mail->Send()) { 
     echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br>'; 
    } else { 
     echo "Message sent to :" . $row["full_name"] . ' (' . str_replace("@", "&#64;", $row["email"]) . ')<br>'; 
    } 
    // Clear all addresses and attachments for next loop 
    $mail->ClearAddresses(); 
    $mail->ClearAttachments(); 
} 
?> 

EDIT >>>>>>

Я теперь добавил проверку на наличие ошибок, но теперь просто получить пустую страницу без ошибок, но и не почта?

  <?php 

        $formid = $_GET[token]; 
      $templatequery = mysql_query("SELECT * FROM hqfjt_chronoforms_data_addmailinglistmessage WHERE cf_id = '$formid'") or die(mysql_error()); 
      $templateData = mysql_fetch_object($templatequery); 

      $gasoiluserTemplate = $templateData->gasoilusers; 
      $dervuserTemplate = $templateData->dervusers; 
      $kerouserTemplate = $templateData->kerousers; 
      $templateMessage = $templateData->mailinglistgroupmessage; 
       ?> 
        <?php 
      require_once('./send/class.phpmailer.php'); 
      //include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded 

      $mail = new PHPMailer(true); //defaults to using php "mail()"; the true param means it will throw exceptions on errors, which we need to catch 

      // $body    = file_get_contents('contents.html'); 

      $body = 'Dear Test this is a test.'; 

      // $body = preg_replace('/\\\\/i', $body); 

      $mail->SetFrom('[email protected]', 'List manager'); 
      $mail->AddReplyTo('[email protected]', 'List manager'); 

      $mail->Subject  = "Mailing List Test"; 

      $query = "SELECT leadname,businessname,email FROM hqfjt_chronoforms_data_addupdatelead WHERE keromailinglist='$kerolist' AND dervmailinglist='$dervlist' AND gasoilmailinglist='$gasoillist'"; 
      $result = mysql_query($query); 

      // Bail out on error 
if (!$result) 
    { 
    trigger_error("Database error: ".mysql_error()." Query used was:  ".htmlentities($query), E_USER_ERROR); 
    die(); 
    } 


      while ($row = mysql_fetch_array ($result)) { 
       $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test 
       $mail->MsgHTML($body); 
       $mail->AddAddress($row["email"], $row["full_name"]); 
       $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg"); 

       if(!$mail->Send()) { 
       echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br>'; 
       } else { 
       echo "Message sent to :" . $row["full_name"] . ' (' . str_replace("@", "&#64;", $row["email"]) . ')<br>'; 
       } 
       // Clear all addresses and attachments for next loop 
       $mail->ClearAddresses(); 
       $mail->ClearAttachments(); 
      } 
      ?> 
+0

Почему вы используете @MYSQL_QUERY –

+1

Попробуйте удалить символ @ перед вашей строкой MYSQL_QUERY ($ query), чтобы увидеть, что она делает. Скорее всего, вы подавляете сообщение об ошибке, которое более подробно сообщит вам, что пошло не так. – Tanoro

ответ

3

Ваш код не выполняет проверку ошибок, поэтому неудивительно, что запрос прерывается молча, когда он терпит неудачу. Проверьте наличие ошибок, и он скажет вам, что происходит не так - как это сделать, указано в manual on mysql_query() или в этом reference question.. И удалите @ перед mysql_query()! Пример:

$result = mysql_query($query); 

// Bail out on error 
if (!$result) 
    { 
    trigger_error("Database error: ". 
        mysql_error(). 
        " Query used was: ". 
        htmlentities($query), E_USER_ERROR); 
    die(); 
    } 

Это покажет вам, что именно не так, и как выглядит последний запрос.

В качестве побочного примечания (и, возможно, также решения для вашей основной причины) код, который вы показываете, уязвим для SQL injection. Возможно, это то, что нарушает ваш запрос.

Вам нужно сделать mysql_real_escape_string() на всех входящих значений следующим образом:

$formid = mysql_real_escape_string($_GET["token"]); 
+0

исправлено! Я понял, что использовал неправильные значения в запросе, я должен был использовать SELECT имя, имя, адрес электронной почты FROM hqfjt_chronoforms_data_addupdatelead WHERE keromailinglist = '$ kerouserTemplate' AND dervmailinglist = '$ dervuserTemplate' AND gasoilmailinglist = '$ gasoiluserTemplate ' он работает сейчас!, спасибо за головы, с GET real escape, я тоже это изменил :-) –

0

@ перед вызовом функции подавляет ошибку, которая должна сказать вам, что происходит.