Vraag over update functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wouter W

Wouter W

20/09/2012 11:24:14
Quote Anchor link
voor een script waar ik mee bezig ben, zoek ik een oplossing om de resultaten uit een select te updaten, indien deze zijn opgepakt door een functie. in een eerder topic kreeg ik een suggestie om de resultaten in een array te zetten, maar daar kom ik niet uit.

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?
 
PHP hulp

PHP hulp

23/12/2024 15:11:19
 
Marvin H

Marvin H

20/09/2012 11:28:09
Quote Anchor link
Waar is je select query?
 
- SanThe -

- SanThe -

20/09/2012 11:45:10
Quote Anchor link
UPDATE producten SET klant_geinformeerd_op = NOW()

Uiteraard update dit alle records.
Je mist de WHERE die de juiste records aan geeft.
 
Marvin H

Marvin H

20/09/2012 11:51:09
Quote Anchor link
de WHERE clausule zal moeten worden opgebouwd uit de SELECT, dus de vraag blijft... wat is je select query?
 
Wouter W

Wouter W

20/09/2012 12:08:05
Quote Anchor link
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
<?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')
?>


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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/09/2012 13:17:36
Quote Anchor link
Nogmaals:
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
<?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
}
?>
 
Wouter W

Wouter W

20/09/2012 14:17:58
Quote Anchor link
ok, het wordt me iets duidelijker. even om het helemaal goed te krijgen:
- 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)
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
<?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';
    }
}

?>


en dan de update functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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) . "')");

}

?>


na deze aanpassing, update hij helemaal niks meer
 
Kris Peeters

Kris Peeters

20/09/2012 14:43:46
Quote Anchor link
... 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
Gewijzigd op 20/09/2012 14:44:18 door Kris Peeters
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/09/2012 14:44:25
Quote Anchor link
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?

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
 
Wouter W

Wouter W

20/09/2012 14:46:35
Quote Anchor link
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



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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

20/09/2012 14:50:56
Quote Anchor link
Je verstuurt trouwens 2 maal de email (regel 68 en 72)
 
Kris Peeters

Kris Peeters

20/09/2012 15:09:58
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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) {
...

?>


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
 
Wouter W

Wouter W

20/09/2012 17:30:17
Quote Anchor link
ja, ik kreeg inderdaad de mail 2x binnen :) nu weet ik waarom.

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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?PHP
if (mail($to, $subject, $message, $headers))
            {

                return TRUE;
                echo 'TRUE';
            }

            else
            {
                return FALSE;
                echo 'FALSE';
            }

?>
 
Kris Peeters

Kris Peeters

20/09/2012 18:03:16
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function sendMailToMe ($to, $subject, $message, $headers) {
  return mail($to, $subject, $message, $headers);
}

?>

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
 
Wouter W

Wouter W

20/09/2012 19:26:33
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
function sendMailToMe ($to, $subject, $message, $headers) {
  return mail($to, $subject, $message, $headers);
}

?>

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?
 



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.