winkelwagen met phpmailer mailen
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)
1
2
3
2
3
<?php
$get_row['name'].' '.$value.' stuk(s) prijs €'.number_format($get_row['price'], 2).' = €'.number_format($sub, 2);
?>
$get_row['name'].' '.$value.' stuk(s) prijs €'.number_format($get_row['price'], 2).' = €'.number_format($sub, 2);
?>
In de functie winkelwagen staat:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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 €'.number_format($get_row['price'], 2).' = €'.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 />';
?>
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 €'.number_format($get_row['price'], 2).' = €'.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
wat is de code daarvan ?
waar verstuur je je mail ?
De code:
Code (php)
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
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 €'.number_format($get_row['price'], 2).' = €'.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!
?>
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 €'.number_format($get_row['price'], 2).' = €'.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!
?>
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
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)
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
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.';
}
}
?>
/**
* 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.';
}
}
?>
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?
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.
msyql_*** wordt afgeraden door PHP.net zelf: 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
als je een sportauto hebt ( PDO ) wil je toch ook niet op een fiets rijden? ( MySQL ) :)
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:
Daarna vul je die array met als key het product id en als waarde het aantal:
Code (php)
1
2
3
4
5
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!
?>
//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
Ger van Steenderen op 30/07/2012 17:48:31:
$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 -
- SanThe - op 30/07/2012 17:54:59:
$session['cart'] = array();
moet zijn:
$_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.
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?
Nee hoor, ik doe dat met een trigger (before on insert)
Gewijzigd op 30/07/2012 18:24:36 door Ger van Steenderen
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
Hier heeft TS niets aan, de discussie over PDO, MySQLi, mysql kunnen we beter in een ander topic voeren?
@Ger van Steenderen
Ik verstuur een bcc van de factuur naar mezelf en naar het e-mailadres van de printer(voor het "analoge" archief)