Vraag over update functie
Even een schets van relevante items:
- een select
- een include van een functions bestand
- een if/else om te checken of de select uberhaubt rijen opleverd
- een while
- $row[] omgezet naar variabelen
- functie sendMailToMe aanroepen
- if (!sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID) == TRUE) hiermee hoop ik te checken of de functie niet antwoord met TRUE, in dat geval gaat hij naar de else, waar ik de volgende functie aanroep:
- UpdateProductRegel($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
echo 'update is uitgevoerd';
de functie UpdateProductRegel heb ik zo gemaakt en die werkt wel, maar update alle records, ipv alleen de reoords die uit de select komen:
function UpdateProductRegel($naam, $omschrijving, $ingangdatum, $einddatum, $productID) {
//insert script voor records waarbij een mail is verstuurd.
mysql_query("UPDATE producten
SET klant_geinformeerd_op = NOW()");
}
ik zit echt met mijn handen in het haar, want ik heb geen idee hoe ik de UpdateProductRegel functie moet inrichten om ervoor te zorgen dat alleen de records uit de select ge-update worden. Kan iemand me hiermee op weg helpen?
Waar is je select query?
Uiteraard update dit alle records.
Je mist de WHERE die de juiste records aan geeft.
de WHERE clausule zal moeten worden opgebouwd uit de SELECT, dus de vraag blijft... wat is je select query?
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
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
<?PHP
SELECT
COALESCE( klant.klant_bedrijf,
klant.klant_achternaam ) AS naam,
product.prod_omschrijving AS omschrijving,
klant.klant_van AS van,
DATE_FORMAT(product.prod_ingang_datum, '%d-%m-%Y') AS ingangdatum,
DATE_FORMAT(product.prod_eind_datum, '%d-%m-%Y') AS einddatum,
prod_productcode AS productcode,
prod_id AS productID
FROM producten AS product
JOIN klanten AS klant ON klant.klant_id = product.prod_klant_id
WHERE DATEDIFF(prod_eind_datum, CURRENT_DATE()) = 60
AND prod_verlopen = 'nee'
AND (prod_productcode = '1300'
OR prod_productcode = '1200'
OR prod_productcode = 'P0001'
OR prod_productcode = 'P0006'
OR prod_productcode = 'P0010'
OR prod_productcode = 'P0011'
OR prod_productcode = 'P0012'
OR prod_productcode = 'P0064'
OR prod_productcode = 'P0065'
OR prod_productcode = 'P0066'
OR prod_productcode = 'P0067'
OR prod_productcode = 'P0068'
OR prod_productcode = 'P0069'
OR prod_productcode = 'P0070'
OR prod_productcode = 'P0071'
OR prod_productcode = 'P0072')
?>
SELECT
COALESCE( klant.klant_bedrijf,
klant.klant_achternaam ) AS naam,
product.prod_omschrijving AS omschrijving,
klant.klant_van AS van,
DATE_FORMAT(product.prod_ingang_datum, '%d-%m-%Y') AS ingangdatum,
DATE_FORMAT(product.prod_eind_datum, '%d-%m-%Y') AS einddatum,
prod_productcode AS productcode,
prod_id AS productID
FROM producten AS product
JOIN klanten AS klant ON klant.klant_id = product.prod_klant_id
WHERE DATEDIFF(prod_eind_datum, CURRENT_DATE()) = 60
AND prod_verlopen = 'nee'
AND (prod_productcode = '1300'
OR prod_productcode = '1200'
OR prod_productcode = 'P0001'
OR prod_productcode = 'P0006'
OR prod_productcode = 'P0010'
OR prod_productcode = 'P0011'
OR prod_productcode = 'P0012'
OR prod_productcode = 'P0064'
OR prod_productcode = 'P0065'
OR prod_productcode = 'P0066'
OR prod_productcode = 'P0067'
OR prod_productcode = 'P0068'
OR prod_productcode = 'P0069'
OR prod_productcode = 'P0070'
OR prod_productcode = 'P0071'
OR prod_productcode = 'P0072')
?>
Toevoeging op 20/09/2012 12:33:12:
moet ik dan bij mijn update script dezelfde where gebruiken als bij mijn select?
is het niet mogelijk om die rijen dmv de variabelen door te geven aan de update functie, net zoals ik dat gedaan heb met de sendMailToMe functie?
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
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
<?php
//een array voor de up te daten productregels
$products2update = array()
//dan voer je die query uit
//controleer het resultaat
//en dan in the while lus
while ($row = mysql_fetch_assoc) {
//.....
if (!sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID)){
//doe wat je moet doen
}
else
$products2update [] = $productID;
}
//nu de functie aanroepen en de array als argument meegeven
UpdateProductRegels($products2update)
//De functie UpdateProductRegels
function UpdateProductRegels($productIDs) {
$sql = "UPDATE
producten
SET
klant_geinformeerd_op = NOW()
WHERE
prod_id
IN ('" . implode("','", $producIDs) . "')";
// en dan de query uitvoeren
}
?>
//een array voor de up te daten productregels
$products2update = array()
//dan voer je die query uit
//controleer het resultaat
//en dan in the while lus
while ($row = mysql_fetch_assoc) {
//.....
if (!sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID)){
//doe wat je moet doen
}
else
$products2update [] = $productID;
}
//nu de functie aanroepen en de array als argument meegeven
UpdateProductRegels($products2update)
//De functie UpdateProductRegels
function UpdateProductRegels($productIDs) {
$sql = "UPDATE
producten
SET
klant_geinformeerd_op = NOW()
WHERE
prod_id
IN ('" . implode("','", $producIDs) . "')";
// en dan de query uitvoeren
}
?>
- moet de $products2update = array() voor de select query staan?
- zie ik het goed dat de update functie altijd wordt uitgevoerd? moet deze niet in mijn else staan of begrijp ik het verkeerd?
- en nu moet ik de $sql ook nog uitvoeren toch?
Toevoeging op 20/09/2012 14:38:26:
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
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
<?php
//fout afhandeling
error_reporting(E_ALL);
// connectie met database
include 'database.php';
//ophalen gegevens
$result = mysql_query ( "SELECT
COALESCE( klant.klant_bedrijf,
klant.klant_achternaam ) AS naam,
product.prod_omschrijving AS omschrijving,
klant.klant_van AS van,
DATE_FORMAT(product.prod_ingang_datum, '%d-%m-%Y') AS ingangdatum,
DATE_FORMAT(product.prod_eind_datum, '%d-%m-%Y') AS einddatum,
prod_productcode AS productcode,
prod_id AS productID
FROM producten AS product
JOIN klanten AS klant ON klant.klant_id = product.prod_klant_id
WHERE DATEDIFF(prod_eind_datum, CURRENT_DATE()) = 60
AND prod_verlopen = 'nee'
AND (prod_productcode = '1300'
OR prod_productcode = '1200'
OR prod_productcode = 'P0001'
OR prod_productcode = 'P0006'
OR prod_productcode = 'P0010'
OR prod_productcode = 'P0011'
OR prod_productcode = 'P0012'
OR prod_productcode = 'P0064'
OR prod_productcode = 'P0065'
OR prod_productcode = 'P0066'
OR prod_productcode = 'P0067'
OR prod_productcode = 'P0068'
OR prod_productcode = 'P0069'
OR prod_productcode = 'P0070'
OR prod_productcode = 'P0071'
OR prod_productcode = 'P0072')
")
//debug: script stoppen indien iets fout zit in de sql
//en/of de verbinding met de database en melding tonen
or die('foutje: '.mysql_error());
include 'functions.php';
if($result === false)
{
}
else
{
//checken of er iets uit de query komt, zo niet.......
if(mysql_num_rows($result))
{
//rijen die ge-update moeten worden aan een array toevoegen
$products2update = array();
//de query heeft een resultaat, verwerk de resultaten uit de query
while ($row = mysql_fetch_assoc($result))
{
//stop de resultaten in variabelen
$naam = $row["naam"];
$omschrijving = $row["omschrijving"];
$ingangdatum = $row["ingangdatum"];
$einddatum = $row["einddatum"];
$productID = $row['productID'];
//doe iets met de variabelen
sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
//echo $naam . ' ' . $omschrijving . ' ' . $ingangdatum . ' t/m ' . $einddatum . '<BR/>';
//checken of de email functie tot zijn einde is gekomen, dan updaten
if (!sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID) == TRUE)
{
//
}
else
{
//UpdateProductRegel($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
$products2update [] = $productID;
}
UpdateProductRegel($products2update);
echo 'update is uitgevoerd';
}
}
else
{
//er komt niets uit de query
echo 'geen resultaten vandaag';
}
}
?>
//fout afhandeling
error_reporting(E_ALL);
// connectie met database
include 'database.php';
//ophalen gegevens
$result = mysql_query ( "SELECT
COALESCE( klant.klant_bedrijf,
klant.klant_achternaam ) AS naam,
product.prod_omschrijving AS omschrijving,
klant.klant_van AS van,
DATE_FORMAT(product.prod_ingang_datum, '%d-%m-%Y') AS ingangdatum,
DATE_FORMAT(product.prod_eind_datum, '%d-%m-%Y') AS einddatum,
prod_productcode AS productcode,
prod_id AS productID
FROM producten AS product
JOIN klanten AS klant ON klant.klant_id = product.prod_klant_id
WHERE DATEDIFF(prod_eind_datum, CURRENT_DATE()) = 60
AND prod_verlopen = 'nee'
AND (prod_productcode = '1300'
OR prod_productcode = '1200'
OR prod_productcode = 'P0001'
OR prod_productcode = 'P0006'
OR prod_productcode = 'P0010'
OR prod_productcode = 'P0011'
OR prod_productcode = 'P0012'
OR prod_productcode = 'P0064'
OR prod_productcode = 'P0065'
OR prod_productcode = 'P0066'
OR prod_productcode = 'P0067'
OR prod_productcode = 'P0068'
OR prod_productcode = 'P0069'
OR prod_productcode = 'P0070'
OR prod_productcode = 'P0071'
OR prod_productcode = 'P0072')
")
//debug: script stoppen indien iets fout zit in de sql
//en/of de verbinding met de database en melding tonen
or die('foutje: '.mysql_error());
include 'functions.php';
if($result === false)
{
}
else
{
//checken of er iets uit de query komt, zo niet.......
if(mysql_num_rows($result))
{
//rijen die ge-update moeten worden aan een array toevoegen
$products2update = array();
//de query heeft een resultaat, verwerk de resultaten uit de query
while ($row = mysql_fetch_assoc($result))
{
//stop de resultaten in variabelen
$naam = $row["naam"];
$omschrijving = $row["omschrijving"];
$ingangdatum = $row["ingangdatum"];
$einddatum = $row["einddatum"];
$productID = $row['productID'];
//doe iets met de variabelen
sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
//echo $naam . ' ' . $omschrijving . ' ' . $ingangdatum . ' t/m ' . $einddatum . '<BR/>';
//checken of de email functie tot zijn einde is gekomen, dan updaten
if (!sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID) == TRUE)
{
//
}
else
{
//UpdateProductRegel($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
$products2update [] = $productID;
}
UpdateProductRegel($products2update);
echo 'update is uitgevoerd';
}
}
else
{
//er komt niets uit de query
echo 'geen resultaten vandaag';
}
}
?>
en dan de update functie:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?PHP
function UpdateProductRegel($productID) {
//insert script voor records waarbij een mail is verstuurd.
$sql = ("UPDATE producten
SET klant_geinformeerd_op = NOW()
WHERE prod_id IN ('" . implode("','", $productID) . "')");
}
?>
function UpdateProductRegel($productID) {
//insert script voor records waarbij een mail is verstuurd.
$sql = ("UPDATE producten
SET klant_geinformeerd_op = NOW()
WHERE prod_id IN ('" . implode("','", $productID) . "')");
}
?>
na deze aanpassing, update hij helemaal niks meer
Je wil enkel de records die exact 60 dagen verwijderd zijn van vandaag. Niet 59, niet 61...
Leg eens uit wat daar de bedoeling van is
Gewijzigd op 20/09/2012 14:44:18 door Kris Peeters
Wouter W op 20/09/2012 14:17:58:
ok, het wordt me iets duidelijker. even om het helemaal goed te krijgen:
- moet de $products2update = array() voor de select query staan?
- moet de $products2update = array() voor de select query staan?
Nee, alleen voor de while waarin je de resultaten van de query doorloopt.
Quote:
- zie ik het goed dat de update functie altijd wordt uitgevoerd? moet deze niet in mijn else staan of begrijp ik het verkeerd?
Nee, niet in jouw else. Je stelt in de while lus een array samen van products ids die moeten worden geupdated. Daarna roep je de functie dus buiten de while aan, maar dan moet je controleren of er product ids in de array staan(i.e count($products2update) > 0)
Quote:
- en nu moet ik de $sql ook nog uitvoeren toch?
Vanzelfsprekend ;-)
Gewijzigd op 20/09/2012 14:46:35 door Ger van Steenderen
Kris Peeters op 20/09/2012 14:43:46:
... WHERE DATEDIFF(prod_eind_datum, CURRENT_DATE()) = 60 ...
Je wil enkel de records die exact 60 dagen verwijderd zijn van vandaag. Niet 59, niet 61...
Leg eens uit wat daar de bedoeling van is
Je wil enkel de records die exact 60 dagen verwijderd zijn van vandaag. Niet 59, niet 61...
Leg eens uit wat daar de bedoeling van is
het gaat om producten. ik wil een rappeleringssysteem maken. de 60 dagen is eigenlijk een trigger. als ik dit script elke dag draai in een cronjob, kan ik op die manier geen product missen.
Je verstuurt trouwens 2 maal de email (regel 68 en 72)
Wouter W op 20/09/2012 14:46:35:
... als ik dit script elke dag draai in een cronjob, ...
Okay.
Ger van Steenderen op 20/09/2012 14:50:56:
Je verstuurt trouwens 2 maal de email (regel 68 en 72)
Ja, dat is inderdaad niet de bedoeling.
Wat je in zo'n geval hoort te doen*:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
//doe iets met de variabelen
$email_is_verzonden = sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
//checken of de email functie tot zijn einde is gekomen, dan updaten
if ($email_is_verzonden === TRUE) {
...
?>
//doe iets met de variabelen
$email_is_verzonden = sendMailToMe($naam, $omschrijving, $ingangdatum, $einddatum, $productID);
//checken of de email functie tot zijn einde is gekomen, dan updaten
if ($email_is_verzonden === TRUE) {
...
?>
Dan voer je de functie niet dubbel uit.
Controleer trouwens nog eens goed of sendMailToMe() wel een TRUE en/of FALSE terug geeft. Anders heeft dit alles helemaal geen zin.
(* er zijn alternatieven die ook goed zijn)
Gewijzigd op 20/09/2012 15:12:52 door Kris Peeters
Ik heb geprobeerd om met return de TRUE of FALSE terug te geven in een if/else. Heb ik dat zo goed gedaan? want ik krijg namelijk geen echo te zien van mijn true of false.
(Een functie heeft een return. zomaar een return zetten die niet in een functie-definitie staat ... dat is niet de bedoeling.)
Wel ja ... die twee lijnen met echo worden niet uitgevoerd (lijn 5 en lijn 10). Na een return wordt sowieso de functie verlaten.
Voor de rest zou dat wel werken.
Je zou ook - veel korter - dit kunnen doen.
Code (php)
De functie mail() geeft een TRUE of FALSE terug, dus je kan die rechtstreeks in de return zetten.
Gewijzigd op 20/09/2012 18:07:20 door Kris Peeters
Kris Peeters op 20/09/2012 18:03:16:
Bedoel je functie sendMailToMe ?
(Een functie heeft een return. zomaar een return zetten die niet in een functie-definitie staat ... dat is niet de bedoeling.)
Wel ja ... die twee lijnen met echo worden niet uitgevoerd (lijn 5 en lijn 10). Na een return wordt sowieso de functie verlaten.
Voor de rest zou dat wel werken.
Je zou ook - veel korter - dit kunnen doen.
De functie mail() geeft een TRUE of FALSE terug, dus je kan die rechtstreeks in de return zetten.
(Een functie heeft een return. zomaar een return zetten die niet in een functie-definitie staat ... dat is niet de bedoeling.)
Wel ja ... die twee lijnen met echo worden niet uitgevoerd (lijn 5 en lijn 10). Na een return wordt sowieso de functie verlaten.
Voor de rest zou dat wel werken.
Je zou ook - veel korter - dit kunnen doen.
Code (php)
De functie mail() geeft een TRUE of FALSE terug, dus je kan die rechtstreeks in de return zetten.
ja, die functie bedoelde ik.
bedankt, dit werkt als een tierelier! :) ben ik heel erg blij mee!!
ik heb die functie aangepast!
wat ik me dan nog af vraag, als ik aan het einde van mijn script de rijen wil zien die ge-update zijn, kan ik die dan uit de $products2update array aanroepen? of is er een makkelijkere manier om een soort van rapportje te maken?