Foreach tömb függvény eredmény probléma
2021-01-09T11:52:30+01:00
2021-01-09T17:35:06+01:00
2022-08-12T00:17:09+02:00
963
Az alábbi kód szívat:

// eddig a kapcsolodas van aza adtbázishoz $sql = "SELECT lastname,firstname,email,birthday FROM $table"; $sth = $pdo->prepare($sql); $sth->execute(); $res = $sth->fetchAll(); $day = trim((string)date("d")); $month = trim((string)date("m")); foreach($res as $row) { if(strlen($row['birthday'])>5) { $bdate = explode("-",$row['birthday']); $month_2 = $bdate[1]; $day_2 = $bdate[2]; if($day === $day_2 && $month === $month_2 ) $to = $row['email']; $subject = "Sok Boldog születésnapot a mai napon >>".$date; // email subject $message = ""; // email message $headers = 'From: x@y.hu' . "\r\n" . 'Reply-To: webmaster@y.hu' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers); } } exit;
Egy  automata születés napi köszöntő  emailt küldő LEG-LEG egyszerűbb scriptet akarom.

Az adatbázisból megtalálja és kiolvassa az adott napon lévő születés naposokat és küld nekik emailt.

DE sajnos
az elsőre megtalált embernek 1 db emailt küld
a másodikra megtalált embernek  2 db emailt küld
a harmadiknak megtalált embernek 3 db emailt küld
és valószínű így tovább...

Milyen megoldása lehetséges?

Thanks
Mutasd a teljes hozzászólást!
Hali!

Tehát valamiért már itt sincs adat.. hmmm..

Ugye, amikor az e-mail küldést próbálod, akkor kikommenteled az első fetchAll()-hívást (amit a teszt miatt, a lekérdezés eredményének kiíratása érdekében raktál a kódba)?

Mutasd a teljes hozzászólást!

  • Hali!

    A kódod alapján a „levélküldés” minden egyes sorra lefut (és vagy küld e-mailt vagy nem), függetlenül attól, hogy a születésnapja van-e az aktuális sor által jelzett embernek vagy nincs. Ugyanis, a cikluson belül az if csak az utána lévő $to beállításra vonatkozik. Az egész utána való részt az if-ben kapcsos zárójelek közé kellene tenni.

    De miért nem csak azokat kérdezed le elve, akiknek születésnapjuk van? Például:
    $day = (int) date('j'); $month = (int) date('n'); $sql = "SELECT `lastname`, `firstname`, `email` FROM $table WHERE MONTH(`birthday`) = :month AND DAY(`birthday`) = :day"; $sth = $pdo->prepare($sql); $sth->execute([':month' => $month, ':day' => $day]); $subject = "Sok boldog születésnapot a mai napon >> $date"; $headers = [ 'From' => 'x@y.hu', 'Reply-To' => 'webmaster@y.hu', 'X-Mailer' => 'PHP/'.phpversion(), ]; foreach (($sth->fetchAll(PDO::FETCH_ASSOC) ?? []) as $row) { $message = ""; mail($row['email'], $subject, $message, $headers); }
    Mutasd a teljes hozzászólást!
  • OK próbálom, próbálom .... eddig nem küldi..de

    Az adatbázisbanban elmentet dátum formátum 2021-01-09

    A megoldásodban a a hónapokat/napokat 1,2,3 azaz  nem 01 , 02 stb adja meg
    de ezt kicseréltem     $day = (int) date('d'); >> $day = date('d');
    Ekkor már jól hozza 01 és 09

    De azt nem tudom kinézni, hogy a megoldásodban
    "
    MONTH(`birthday`) = :month
    "
    Milyen formátumban olvassa ki, a script nem akadt csak nem küldi az emailt.
    (Talán a dátum formátum eltérés)

    Mivel tudom ennek az eredményet kiíratni a képernyőre:
    MONTH(`birthday`) = :month
    Mutasd a teljes hozzászólást!
  • Hali!

    Az adatbázisbanban elmentet dátum formátum 2021-01-09

    Inkább az lenne a fontos, hogy a `birthday` mező DATE típusú legyen (semeddig nem tart átalakítani – egy ALTER TABLE-lel). Remélem, nem szöveges típus.

    A megoldásodban a a hónapokat/napokat 1,2,3 azaz  nem 01 , 02 stb adja meg de ezt kicseréltem     $day = (int) date('d'); >> $day = date('d');

    Teljesen felesleges volt, ugyanis mind a MONTH(), mind a DAY() MySQL-függvények numerikusan adják vissza a hónapot/napot.

    De azt nem tudom kinézni, hogy a megoldásodban…

    Ez egy szimpla paraméteres SQL-mondat, mégpedig nevesített paraméterekkel. Ahogy' láthatod is, a paraméterek értékét pl. a PDOStatement::execute() hívásban adhatod meg.

    Mivel tudom ennek az eredményet kiíratni a képernyőre…

    Készíts egy egyszerű teszt-szkriptet, pl.:
    $day = (int) date('j'); $month = (int) date('n'); $sql = "SELECT `lastname`, `firstname`, `email` FROM $table WHERE MONTH(`birthday`) = :month AND DAY(`birthday`) = :day"; $sth = $pdo->prepare($sql); $sth->execute([':month' => $month, ':day' => $day]); var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
    De, ismétlem, fontos, hogy a `birthday` mező valamilyen dátum-típus (célszerűen DATE) legyen és ne karakteres. Ebben az esetben tutira működni fog.

    Mutasd a teljes hozzászólást!
  • Bocs a sok kérdésért, nem vagyok profi programozó..

    DE
    Haladunk vissza mentem az alaphoz és:

    var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
    Eddig biztosan jó mert vissza adja a keresett értékeket pontosan.

    Ilyen formában adja vissza az adatokat tehát eddig működik 3 db-ot talál de csak egy részletét irom az elsőt:

    array(3) { [0]=> array(3) { ["lastname"]=> string(6) "Szűcs" ["firstname"]=> string(6) "Ferenc" ["email"]=> string(13) "ferenc@y.hu" } [1]=> array(3).....
    Sajna emailt nem küld. Ebben nagyobb hiba nem lehet:
    $subject = "Sok boldog születésnapot a mai napon >> $date"; $headers = [ 'From' => 'x@y.hu', 'Reply-To' => 'webmaster@y.hu', 'X-Mailer' => 'PHP/'.phpversion(), ];
    Nagy valószínűséggel ezt nem szereti:
    foreach (($sth->fetchAll(PDO::FETCH_ASSOC) ?? []) as $row)
    A többi a message  nem lehet probléma, és ebben sem látok semmi hibát:
    mail($row['email'], $subject, $message, $headers);
    Mutasd a teljes hozzászólást!
  • Hali!

    Nagy valószínűséggel ezt nem szereti

    Ha a PHP verziód kisebb, mint 7.0 – ekkor viszont hibát dobna. De igazad van, itt értelmetlen használni. Inkább így:
    … $res = $sth->fetchAll(PDO::FETCH_ASSOC); foreach (($res ?: []) as $row) { …
    Mutasd a teljes hozzászólást!
  • Köszi   (PHP verzióm 7.0.33)

    Tehát eddig összfoglalva:
    var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
    EZ OK. adatok jönnek

    Utánna ez:
    foreach (($sth->fetchAll(PDO::FETCH_ASSOC) ?? []) as $row) {
    Cserélve erre:

    $res = $sth->fetchAll(PDO::FETCH_ASSOC); foreach (($res ?: []) as $row) {
    Ebből próbálok emberei szem számára is látható eredményt kreálni (hogy lássam van-e eredmény):

    $res = $sth->fetchAll(PDO::FETCH_ASSOC); echo '<br>'. $res; foreach (($res ?: []) as $row) { $lathato = $row['email']; echo $lathato;
    Ennek
    echo '<br>'. $res;
    Array

    Ennek:
    $lathato = $row['email']; echo $lathato;
    Semmi redmény nem látható a képernyőn.

    Tehát azért nem küldi az email mert nincs hova.
    (vagy rosszul gondolom)


    Ezt meg most nyomozom:
    ?: []
    Mutasd a teljes hozzászólást!
  • Aha...

    var_dump($res);
    Eredmenye
     array(0) { }

    Tehát valamiért már itt sincs adat.. hmmm..
    Mutasd a teljes hozzászólást!
  • Hali!

    Tehát valamiért már itt sincs adat.. hmmm..

    Ugye, amikor az e-mail küldést próbálod, akkor kikommenteled az első fetchAll()-hívást (amit a teszt miatt, a lekérdezés eredményének kiíratása érdekében raktál a kódba)?

    Mutasd a teljes hozzászólást!
  • Hát nem igazad van de ha ki kommentelem:

    Warning: mail() expects parameter 4 to be string, array given in

    a kód most amikor a fenti hiba megjelenik:

    $day = (int) date('j'); $month = (int) date('n'); $sql = "SELECT `lastname`, `firstname`, `email` FROM $table WHERE MONTH(`birthday`) = :month AND DAY(`birthday`) = :day"; $sth = $pdo->prepare($sql); $sth->execute([':month' => $month, ':day' => $day]); //var_dump($sth->fetchAll(PDO::FETCH_ASSOC)); //foreach (($sth->fetchAll(PDO::FETCH_ASSOC) ?? []) as $row) { $res = $sth->fetchAll(PDO::FETCH_ASSOC); foreach (($res ?: []) as $row) { $subject = "Sok boldog születésnapot a mai napon >> $date"; $message = ""; $headers = [ 'From' => 'x@y.hu', 'Reply-To' => 'webmaster@y.hu', 'X-Mailer' => 'PHP/'.phpversion(), ]; $subject = "Sok boldog születésnapot a mai napon >> $date"; mail($row['email'], $subject, $message, $headers); }
    Mutasd a teljes hozzászólást!
  • Köszi

    Kevergeti még a dolgokat de azokkal már megbirkózom a lekérdezés és a mail küldés megy ez a lényeg.
    Mutasd a teljes hozzászólást!
  • Hali!

    Warning: mail() expects parameter 4 to be string, array given in

    Igen, mert a mail() függvénynél a további fejlécek (4. paraméter) tömbként történő megadása 7.2-es PHP-től lehetséges. Mivel neked 7.0-s PHP-d van, így nem marad más, mint sztringként megadni a fejléceket (ahogy' a nyitó hozzászólásodban található kódban is van).

    Mutasd a teljes hozzászólást!
abcd