Jump to content

Recommended Posts

I am having a LOOP problem but cannot seem to resolve it.  Maybe some better skilled eyes can re-organize and remedy this.  In its presented form, I receive 4 blank emails to '[email protected]' which is connecting to my table 'x' which holds 213 records (of which I am querying records with ID>=210.  The problem is that the content is missing.

 

At best, I've been able to get the content to display in the first email sent [iD: 210] and then the next email (which would be for ID 211 is blank.  No other emails follow, so I assume the loop is being broken.

 

Please assist.


echo "HELLLOOOO <br />";

  
    $email_to = "[email protected]";        
    $email_subject = " email subject line";

$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];

  $query  = "SELECT * FROM x WHERE id>='210'  "; 


$result = mysqli_query($link, $query);    

if (mysqli_num_rows($result) > 0) {

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

@mail($email_to, $email_subject, $email_message, $headers); 

 echo "A message was sent to " .$row['first_name']. " >>> ID: " .$row['id']. "<br />" ;

 
}


$headers = 'From: '.$row['email']."\r\n".
'Reply-To: '.$row['email']."\r\n" .
'X-Mailer: PHP/' . phpversion();
//mail($email_to, $email_subject, $email_message, $headers);  

    $email_message = "Form details below.\n\n";    
 
     
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    } 
 

    $email_message .= "ID: ".clean_string($row['id'])."\n";
    $email_message .= "First Name: ".clean_string($row['first_name'])."\n";
    $email_message .= "Last Name: ".clean_string($row['last_name'])."\n";
    $email_message .= "Email: ".clean_string($row['email'])."\n";
    $email_message .= "Telephone: ".clean_string($row['telephone'])."\n\n";

  
echo "end <br/>";


/*

$headers = 'From: '.$row['email']."\r\n".
'Reply-To: '.$row['email']."\r\n" .
'X-Mailer: PHP/' . phpversion();
//  @mail($email_to, $email_subject, $email_message, $headers);  

 */

 } 
 
 
echo "Thank you for contacting us. We will be in touch with you very soon.<br />";


Link to comment
https://forums.phpfreaks.com/topic/307289-send-email-from-database-problem/
Share on other sites

You've got alot of things out of order here. You're creating your headers after you send the e-mail. You've got the ending bracket for your database loop before the headers.  This may not be perfect. But it should get you closer. 


echo "HELLLOOOO <br />";

  
    $email_to = "[email protected]";        
    $email_subject = " email subject line";

$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];

  $query  = "SELECT * FROM x WHERE id>='210'  "; 


$result = mysqli_query($link, $query);    

if (mysqli_num_rows($result) > 0) {
 
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

// Let's create the headers //
$headers = 'From: '.$row['email']."\r\n".
'Reply-To: '.$row['email']."\r\n" .
'X-Mailer: PHP/' . phpversion();

$email_message = "Form details below.\n\n"; 
$email_message .= "ID: ".clean_string($row['id'])."\n";
$email_message .= "First Name: ".clean_string($row['first_name'])."\n";
$email_message .= "Last Name: ".clean_string($row['last_name'])."\n";
$email_message .= "Email: ".clean_string($row['email'])."\n";
$email_message .= "Telephone: ".clean_string($row['telephone'])."\n\n";
@mail($email_to, $email_subject, $email_message, $headers); 

 echo "A message was sent to " .$row['first_name']. " >>> ID: " .$row['id']. "<br />" ;

 
}

           
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    } 
 

   

  
echo "end <br/>";

 } 
 
 
echo "Thank you for contacting us. We will be in touch with you very soon.<br />";


Yes, table x has those columns.

As indicated initially in my second paragraph, I have managed to receive 1 email that has complete message content. My problem at that point, is that only one additional email is dispatched, and it has a totally blank message.

I am convinced that there is an issue with my loop but I don't see it.

Are you posting your actual code?

 

The first code you posted sent all four emails before any content was put into the $email_message variable, so it's hard to see how you managed to get even one correct email.


$count = 0;
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

// create header and message here

if ( mail($email_to, $email_subject, $email_message, $headers) ) {
++$count;
echo "A message was sent to " .$row['first_name']. " >>> ID: " .$row['id']. "<br />" ;
}
}
echo "$count messages were sent<br>";

Substituted //@mail($email_to, $email_subject, $email_message, $headers);
print_r($row);

 

and got no results. 

 

Although I've not used print_r and am unsure of what to expect I have been monitoring my live email. the results are as follows:

My initial 'bad' script sends ONLY one email with a blank message.

The repaired script sends no emails but displays my "HELLO" message only.

The repaired script with an invalid database name sends no emails but displays my "HELLO" and "Thank you...." messages.

 

Clearly, the items in the loop are not making contact correctly.

HELP, please.

Post the exact code you have right now, so we can verify that you've implemented the diagnostics correct.

 

On the face of it, having no output indicates that the query is either failing entirely or generating no results, so that explains why you would have no email. 

Then went back to code from my original post.

Why? We told you it's wrong. Or do you think if you run it enough times it may work?

 

Why haven't you got error reporting turned on? You should be getting a screenful of warnings and notices from that code.

 

From what you have told us so far, I think the fault is with the data (database, table, connection or the query).

 

Each print_r() should output something like

 

Array ( [ID] => 1 [firstname] => John [last_name] => Doe [email] => [email protected] [telephone] => 1236549087 )

showing the column names with their values.

Even my limited knowledge has allowed me to have confidence in the db and table that I am using.

I have a separate script with the same or similar connections to the same table and it successfully echoes all variables in a table.

My sense is that there is a disorder in the format of my email or a misplaced } .

Either way it appears that the code is allowing a break in the loop (which actually seems NOT to be looping, but rather only running once(at best).

Sadly, my original code still comes closest to a successful outcome (since it at least Manfred to send one email. LoL

You have more confidence in your db than I have.

 

I have created a test table

CREATE TABLE `x` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) DEFAULT NULL,
  `last_name` varchar(45) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `telephone` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

and put a couple of records into it

+----+------------+-----------+--------------+-----------+
| id | first_name | last_name | email        | telephone |
+----+------------+-----------+--------------+-----------+
|  1 | John       | Doe       | [email protected]  | 123       |
|  2 | Jane       | Doe       | janed.gm.com | 234       |
+----+------------+-----------+--------------+-----------+

This code, which is basically what taquitosensei posted

echo "HELLLOOOO <br />";

 
$email_to = "[email protected]";        
$email_subject = " email subject line";

$query  = "SELECT * FROM x WHERE id>='1'  ";

$result = mysqli_query($link, $query);    

if (mysqli_num_rows($result) > 0) {

    $count = 0;
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

        // Let's create the headers //
        $headers = 'From: '.$row['email']."\r\n".
        'Reply-To: '.$row['email']."\r\n" .
        'X-Mailer: PHP/' . phpversion();

        $email_message = "Form details below.\n\n";
        $email_message .= "ID: ".clean_string($row['id'])."\n";
        $email_message .= "First Name: ".clean_string($row['first_name'])."\n";
        $email_message .= "Last Name: ".clean_string($row['last_name'])."\n";
        $email_message .= "Email: ".clean_string($row['email'])."\n";
        $email_message .= "Telephone: ".clean_string($row['telephone'])."\n\n";
    //    if ( mail($email_to, $email_subject, $email_message, $headers) ) {          // temporarily suppress email
        if (true) {
            echo '<pre>', print_r($row, 1), '</pre>';
            echo "<pre>$email_message</pre>";
            ++$count;
            echo "A message was sent to " .$row['first_name']. " >>> ID: " .$row['id']. "<br />" ;
        }
    }
    echo "$count emails sent <br/>";
    echo "Thank you for contacting us. We will be in touch with you very soon.<br />";

 }
 
 
 
         
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }
 

gave this result

Edited by Barand

I had decided not to let this script bother me, but I couldn't keep away from it. Then I saw your reply.

Created a new file with my connection info and WHAM-O, I got a printout of 223 records (not Ordered By) with the printed message stop of each one and all data fields for each.

THANK YOU.

I notice that you "suppressed email" and I don't want to damage this code. If you can guide me to enable it I can give it a real run.

I will compare it with the other messes that I have to see where my mistakes were.

Thank you for the lesson.

Uncomment the if (mail() ) line and remove the if (true) line.

 

You also need to change your WHERE clause back to your value.

 

You can now remove the debugging print lines too.

 

Also, noticed that you left function clean_string at the bottom of script. Does this make it ineffective? Do I actually need it anyway (if variables are being validated before inserting into db?

That is where function definitions should go (or at the top), not in the middle of the flow of code logic.

Tested live and all confirmation messages printed as desired.

Then waited for email.

And waited.

And worried.

And waited.

Then remembered a little thing called a spam folder. ROFLMAO.

Emails were received and message contents corresponds accordingly.

Thanks again.

(I'll wait till next week to compare and educate.)

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.