[php] foreach gebruiken in body van e-mail (php mailer)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor onze online catalogus wil ik nadat een bezoeker zijn bestelling heeft bevestigd hem/haar een e-mail versturen ter bevestiging van zijn/haar bestelling. In de email wil ik nogmaals herhalen wat hij/zij heeft besteld.

De email verstuur ik mbv PHPMailer, hoe kan ik nogmaals de inhoud van zijn/haar winkelwagentje weergeven in de mail?

Ik heb onderstaande script geprobeerd maar dit werkt niet!


PHP: mailer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
require("../phpmailer/class.phpmailer.php");

$mail = new PHPMailer();

$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = "smtp.xs4all.nl"; // SMTP server

$mail->From = "dont-reply@domein.nl";
$mail->FromName = "Catalogus ";
$mail->AddAddress("test@domein.nl"); 

$mail->Subject = "Er is een ".$_SESSION['type_aanvraag']." geplaatst.";
$mail->Body = '<table>'.if (count($_SESSION['winkelwagen']) > 0) {
        foreach ($_SESSION['winkelwagen'] as $id => $aantal) {
            $query = "SELECT * FROM artikelen WHERE Id={$id};";
            $result = mysql_query($query);
            $rij = mysql_fetch_object($result);
            print '
    <tr vertical-align="middle">
        <td width="100">'.$rij->Artikel_code.'</td>
        <td>'.$rij->Omschrijving.'</td>
        <td align="right" width="50">'.$aantal.'</td>
        <td align="center" width="20"></td>
        <td align="center" width="20"></td>
    </tr>';
        } .'</table>';

$mail->AltBody="Alternatieve tekst in mail"; 

if(!$mail->Send())
{
   echo "Er is een fout opgetreden, neem a.u.b. contact op.";
   echo "Mailer Error: " . $mail->ErrorInfo;
}

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
What the fuck? Je gebruikt een complete "if"-statement alsof 't een string is?! 8)7

Trouwens, "het werkt niet", krijg je nog een foutmelding ofzo? Check je error_reporting()-instelling en/of je logs?


PHP: mailer
1
2
3
4
5
6
7
8
9
10
$mail->Body = '<table>';

if (count($_SESSION['winkelwagen']) > 0) {
    foreach ($_SESSION['winkelwagen'] as $id => $aantal) {
        $query = "SELECT * FROM artikelen WHERE Id={$id};";
            $result = mysql_query($query);
            $rij = mysql_fetch_object($result);
            $mail->Body .= //hier iets neerplempen waardoor het wél werkt, maar dat mag je zelf verzinnen... Dr staat al een subtiele hint.
    }
}


Oh, ennuh, je pretendeert HTML te sturen, maar ik zie verder nergens een Content-Type terug en je begint zo te zien ook zomaar met een table... Lijkt me niet echt succesvolle HTML :P

[ Voor 105% gewijzigd door Osiris op 09-11-2006 14:13 . Reden: Wel ff in de loop zetten :+ ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Om te beginnen heb je geen loop nodig, je kan gewoon alle records tegelijk ophalen. Kijk eens naar de IN-operator. Daarnaast lijkt wat Osiris zegt me ook zonder meer waar. Zo'n vreemde constructie heb ik serieus nog nooit gezien. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

PHP: mailer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$mail->Body = '<table>';
if (count($_SESSION['winkelwagen']) > 0) {
    foreach ($_SESSION['winkelwagen'] as $id => $aantal) {
        $query = "SELECT * FROM artikelen WHERE Id={$id};";
        $result = mysql_query($query);
        $rij = mysql_fetch_object($result);
        $mail->Body .= '
            <tr vertical-align="middle">
                <td width="100">'.$rij->Artikel_code.'</td>
                <td>'.$rij->Omschrijving.'</td>
                <td align="right" width="50">'.$aantal.'</td>
                <td align="center" width="20"></td>
                <td align="center" width="20"></td>
            </tr>';
    } 
}
$mail->Body = '</table>';


De door jouw geposte code kan uberhaupt nooit werken en moet verschillende errors geven als je het mij vraagt... :/

Zoek iets in de richting van bovenstaande, dit is nog verre van optimaal, maar dit is een stapje in de richting waar je het moet zoeken.

Edit: ah jullie waren schneller ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geweldig bedankt!

tja... ik wist wel dat 'dat in die string niet zou gaan werken maar ik wist niet hoe ik dat uit moest leggen, ik zag ook geen andere oplossing.


Bedankt!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En nu neem je de code van R4NCOR gewoon een op een over terwijl je verteld wordt dat die nog lang niet optimaal is? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tja... ik pas hem natuurlijk wat aan naar mijn eigen wensen en smaak, maar het werkt toch...? Wat zou een optimale zijn dan?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Is het niet beter om van de query dit te maken:
PHP:
1
$query = "SELECT * FROM artikelen WHERE Id IN (" . implode(",", array_keys($_SESSION['winkelwagen'])) . ");";

En dan aantal middels:
PHP:
1
$_SESSION['winkelwagen'][$rij->Id]

op te vragen.

Je moet zo natuurlijk wel door de gehele resultset heen lopen, ipv maar 1 keer fetchen.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Verwijderd schreef op donderdag 09 november 2006 @ 14:28:
Tja... ik pas hem natuurlijk wat aan naar mijn eigen wensen en smaak, maar het werkt toch...? Wat zou een optimale zijn dan?
Zoals * Michali al enigzins aangeeft haalt die code voor elk ID apart een resultaat op, in plaats van voor de hele winkelwagen in één keer. Bij grotere bestellingen wordt dat natuurlijk wat inefficient :) .

DM!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 09 november 2006 @ 14:28:
Tja... ik pas hem natuurlijk wat aan naar mijn eigen wensen en smaak, maar het werkt toch...? Wat zou een optimale zijn dan?
Naast dat Michali het al voor je voorkauwt, staat dat ook al in mijn vorige post. ;)

Overigens, met opmerkingen als "het werkt toch?" moet je oppassen. Jouw oplossing voert een query per iteratie van de loop uit. Dat betekent dat het snel erg langzaam wordt als er honderden mensen tegelijk tientallen dingen bestellen. Eén enkele query versnelt het proces en maakt dat je site over het algemeen beter werkt en blijft werken. Maak genoeg van dit soort optimalisaties, dan bespaar je aanzienlijk in de kosten van serverhardware. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1