winkelwagen met phpmailer mailen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Alex van Dijk

Alex van Dijk

29/07/2012 13:24:08
Quote Anchor link
Beste mensen,

De afgelopen tijd ben ik druk bezig geweest met het maken van een webwinkel maar ik ben een vervelend probleem tegen gekomen bij het mailen van de factuur. Als ik namelijk 'de winkelwagen' wil mailen stuurt het script voor elk product een aparte mail.

Ik probeer het volgende te mailen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$get_row
['name'].' '.$value.' stuk(s)    prijs &euro;'.number_format($get_row['price'], 2).' = &euro;'.number_format($sub, 2);
?>


In de functie winkelwagen staat:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php    

foreach($_SESSION as $name => $value){
       if ($value>0){
         if(substr($name, 0, 5)=='cart_'){
         $id = substr($name, 5, (strlen($name)-5));
         $get = mysql_query('SELECT id, name, price FROM products WHERE id='.mysql_real_escape_string((int)$id));
          while ($get_row = mysql_fetch_assoc($get)) {
              $sub = $get_row['price']*$value;
              echo $get_row['name'].' '.$value.' stuk(s)    prijs &euro;'.number_format($get_row['price'], 2).' = &euro;'.number_format($sub, 2). ' <a href="cart.php?remove='.$id.'">[-]</a> <a href="cart.php?add='.$id.'">[+]</a> <a href="cart.php?delete='.$id.'">[Delete]</a><br />';
?>


Ik heb zelf al een lange tijd naar een oplossing gezocht maar het lukt me niet. Zou iemand me hiermee alsjeblieft kunnen helpen?
Gewijzigd op 29/07/2012 13:34:31 door Alex van Dijk
 
PHP hulp

PHP hulp

26/12/2024 05:11:12
 
Marco PHPJunky

Marco PHPJunky

29/07/2012 14:25:57
Quote Anchor link
hoe ziet de opbouw van je mail eruit ?
wat is de code daarvan ?

waar verstuur je je mail ?
 
Alex van Dijk

Alex van Dijk

29/07/2012 15:26:53
Quote Anchor link
Oohja sorry helemaal vergeten. Ik verstuur mijn mail met phpmailer.

De code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
35
36
37
38
39
40
<?php
if (isset($_POST['Submit'])) {
     foreach($_SESSION as $name => $value){
       if ($value>0){
         if(substr($name, 0, 5)=='cart_'){
         $id = substr($name, 5, (strlen($name)-5));
         $get = mysql_query('SELECT id, name, price FROM products WHERE id='.mysql_real_escape_string((int)$id));
          while ($get_row = mysql_fetch_assoc($get)) {
              $sub = $get_row['price']*$value;

require_once('PHPMailer_5.2.1/class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

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

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "mail.website"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->Host       = "mail.website"; // sets the SMTP server
  $mail->Port       = 587;                    // set the SMTP port for the GMAIL server
  $mail->Username   = "sales@website"; // SMTP account username
  $mail->Password   = "wachtwoord";        // SMTP account password
  $mail->AddReplyTo('sales@lwebsite', 'First Last');
  $mail->AddAddress("[email protected]");
  $mail->SetFrom('sales@website', 'First Last');
  $mail->AddReplyTo('sales@website', 'First Last');
  $mail->Subject = 'PHPMailer Test Subject via mail(), advanced';
  $mail->Body = $get_row['name'].' '.$value.' stuk(s)    prijs &euro;'.number_format($get_row['price'], 2).' = &euro;'.number_format($sub, 2);
  $mail->IsHTML(true);  
  $mail->Send();
  echo "Message Sent OK<p></p>\n";
}
catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!

?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/07/2012 16:10:35
Quote Anchor link
de while op regel 8 zorgt ervoor dat $get_row leeg is, en is niet nodig omdat maar 1 record terug krijgt.
Maar je moet de de body van de mail in die foreach daar samenstellen.
Ik zou trouwens ook van de $_SESSION['cart'] een array maken, met het product id als key het aantal als value
 

29/07/2012 22:31:00
Quote Anchor link
Ik zou eerst en vooral zoals Ger van Steenderen zegt een $_SESSION['cart'] maken. Dus het voorbeeld hieronder toon hoe het moet met een $_SESSION['cart'].

Er kunnen wel errors inzitten omdat ik het gewoon even geschreven heb en dus laat ik het even aan u over om het allemaal te testen.

Als u het script dat hieronder staat dan nog even aanpast met een goede query afhandeling en het verzenden van een mail moet het normaal lukken. Tevens raad ik ook mysql_ af, daarvoor hebben we nu de vervanger mysqli, PDO of een andere database driver.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php

    /**
     * When the user posted the form, we'll run the hole code and
     * send an email:
     */

    if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])) {
    
        /**
         * When the cart array exists, we are going to check everything, else
         * we show an error:
         */

        if(isset($_SESSION['cart']) && count($_SESSION['cart']) > 0) {
        
            /**
             * Run true all the sessions and catch those with cart_ as
             * the first letters. But first make a var with all the ids of
             * the articles:
             */

            $ids = '';
            foreach($_SESSION['cart'] as $name => $value) {
                if(strlen(preg_replace('/[^0-9]/', '', $name)) > 0 && strlen(preg_replace('/[^0-9]/', '', $value)) > 0) {
                    $ids .= '"'.preg_replace('/[^0-9]/', '', $name).'",';
                    $_SESSION['cart'][preg_replace('/[^0-9]/', '', $name)] = preg_replace('/[^0-9]/', '', $value);
                }
            }

            
            /**
             * When there aren't any ids found, then we are going to notice the
             * user that he/she needs to select some products:
             */

            if(strlen($ids) == 0) {
                echo 'Please add some products to your cart.';
            }

            
            else {
            
                /**
                 * Get all the records from the products in the database with the
                 * matching id:
                 */

                $result = mysql_query("SELECT id, name, price FROM products WHERE id IN(".substr($ids, 0, -1).")");
                
                /**
                 * When there is a result, we are going to loop true it, otherwhise we'll
                 * notice the user:
                 */

                if($result != false) {
                
                    /**
                     * Check if there are some product. Otherwhise show and notification that the
                     * user need to add some products:
                     */

                    if(mysql_num_rows($result) > 0) {
                
                        /**
                         * When there are some products found. Loop true them and show the information
                         * on the screen:
                         */

                        while($row = mysql_fetch_assoc($result)) {
                            echo '<p><b>Product ID:</b> '.$row['id'].'<br /><b>Name:</b> '.$row['name'].'<br /><b>Price:</b> '.$row['price'].'<br />';
                            echo '<b>Total price:</b> '.$row['price'] * $_SESSION['cart'][$row['id']].'</p>';
                        }
                        
                    }

                    
                    else {
                        echo 'Please add some products.';
                    }
                    
                }

                
                else {
                
                    /**
                     * Add some optionally error handling for the adminster. To make it easy
                     * to solve problems, but for the example just show a message:
                     */

                    echo 'There went something wrong while selecting the products.';
                    
                }
            
            }
            
        }

        
        else {
            echo 'Please add some products to your cart.';
        }
        
    }

    
?>
Gewijzigd op 29/07/2012 22:43:19 door
 
Alex van Dijk

Alex van Dijk

30/07/2012 16:18:43
Quote Anchor link
Bedankt Ger van Steenderen en Aaron, ik had die foreach helemaal over het hoofd gezien. Zouden jullie kunnen uitleggen waarom het handig is om een $_SESSION['cart']te maken, en Aaron waarom je mysql_ afraad?
 
Eddy E

Eddy E

30/07/2012 16:20:34
Quote Anchor link
msyql_*** wordt afgeraden door PHP.net zelf: mysql_query
Klik maar even.

$_SESSION['cart] kan je gewoon een array maken met alles van je wagentje. En dat kan ook een array zijn met al je bestelde dingen.
Gewijzigd op 30/07/2012 16:26:50 door Eddy E
 
Reshad F

Reshad F

30/07/2012 16:51:20
Quote Anchor link
als je een sportauto hebt ( PDO ) wil je toch ook niet op een fiets rijden? ( MySQL ) :)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/07/2012 17:48:31
Quote Anchor link
Offtopic:
De Nederlandse regering en heel veel milieu organisaties zouden daar hartstikke blij mee zijn ;-)
Ik zou trouwens PDO ook geen sportwagen willen noemen, maar meer een multifunctionele fiets met zijwieltjes.

Back to topic:
$_SESSION is een super global variabele van het type array, maar een array item kan ook weer een array zijn.
Dus op het moment dat iemand gaat bestellen maak je een $_SESSION['cart'] aan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
session_start();
$_SESSION['cart'] = array();
?>

Daarna vul je die array met als key het product id en als waarde het aantal:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
//als iemand 3 stukst product met id 345609 besteld
$_SESSION['cart'][345609] = 3;
// in php hoeven numerieke keys niet opeenvolgend te zijn!
?>

Even nog een heel belangrijke opmerking:
In je beginpost zeg dat je facturen via email verstuurt, let wel dat je die voor de belastingdienst op de een of andere manier moet kunnen reproduceren.
Gewijzigd op 30/07/2012 17:59:03 door Ger van Steenderen
 
- SanThe -

- SanThe -

30/07/2012 17:54:59
Quote Anchor link
Ger van Steenderen op 30/07/2012 17:48:31:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
session_start();
$session['cart'] = array();
?>


$session['cart'] = array();
moet zijn:
$_SESSION['cart'] = array();

Quote:
// in php hoeven numerieke keys niet opeenvolgend te zijn!


In SQL ook niet. Het is echter lekker eenvoudig om de database dit te laten doen met auto_increment.
Gewijzigd op 30/07/2012 17:58:55 door - SanThe -
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/07/2012 18:06:40
Quote Anchor link
- SanThe - op 30/07/2012 17:54:59:
$session['cart'] = array();
moet zijn:
$_SESSION['cart'] = array();

Je hebt helemaal gelijk, is aangepast.
- SanThe - op 30/07/2012 17:54:59:
In SQL ook niet. Het is echter lekker eenvoudig om de database dit te laten doen met auto_increment.

auto_increment is geen standaard SQL, en daarom gebruik ik het maar zelden.
 
- SanThe -

- SanThe -

30/07/2012 18:08:42
Quote Anchor link
Ger van Steenderen op 30/07/2012 18:06:40:
auto_increment is geen standaard SQL, en daarom gebruik ik het maar zelden.


Wist ik niet. Hoe doe jij dat dan? Zelf een waarde bijhouden?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/07/2012 18:20:54
Quote Anchor link
Lol, ik en zelf iets bijhouden.
Nee hoor, ik doe dat met een trigger (before on insert)
Gewijzigd op 30/07/2012 18:24:36 door Ger van Steenderen
 
Eddy E

Eddy E

30/07/2012 18:58:58
Quote Anchor link
Reshad F op 30/07/2012 16:51:20:
als je een sportauto hebt ( PDO ) wil je toch ook niet op een fiets rijden? ( MySQL ) :)


Onzin!
Lees php.net eens:
Quote:
The overall performance of all three extensions is considered to be about the same. Although the performance of the extension contributes only a fraction of the total run time of a PHP web request. Often, the impact is as low as 0.1%.

Bron: http://nl3.php.net/manual/en/mysqlinfo.api.choosing.php
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/07/2012 19:35:36
Quote Anchor link
Hier heeft TS niets aan, de discussie over PDO, MySQLi, mysql kunnen we beter in een ander topic voeren?
 
Alex van Dijk

Alex van Dijk

01/08/2012 18:08:48
Quote Anchor link
Bedankt iedereen voor de reactie's het is me gelukt!

@Ger van Steenderen

Ik verstuur een bcc van de factuur naar mezelf en naar het e-mailadres van de printer(voor het "analoge" archief)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.