Simpel probleempje met een while loop en include

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Furio Scripting

Furio Scripting

10/07/2019 11:41:46
Quote Anchor link
Beste forumleden,

Moet nog 1 probleempje oplossen in mijn project maar zie door de bomen het bos niet meer.

Ik heb een cronjob die elke dag om 14:00 checkt of er een mailtje uit moet naar een klant, zo ja stuur een mail, het probleem is enkel dat ik niet de juiste taal kan inladen waarschijnlijk omdat het in een loop gebeurd.

Zie hier:

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
<?php     function verkrijgKlantTaalCrobjob($land)
    {

    

     // Laad de taal file in op basis van de klant zijn ingestelde taal.
     switch (strtolower($land)) {
    case
"netherlands":
        include '/home/admin/domains/xxxx/public_html/customers/languages/nl.php';
        break;
    case
"spain":
        include '/home/admin/domains/xxxx/public_html/customers/languages/es.php';
        break;
    case
"italy":
        include '/home/admin/domains/xxxx/public_html/customers/languages/it.php';
        break;
    case
"germany":
        include '/home/admin/domains/xxxx/public_html/customers/languages/de.php';
        break;
    case
"united kingdom":
         include '/home/admin/domains/xxxx/public_html/customers/languages/en.php';
        break;
    case
"france":
        include '/home/admin/domains/xxxx/public_html/customers/languages/fr.php';
        break;  

    default:

         include '/home/admin/domains/xxxx/public_html/customers/languages/en.php';
}
    
    }
?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php $q = 'SELECT * FROM bestellingen WHERE DATE(bestel_datum) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)';
$result = $database->query($q);



while ($rows = mysqli_fetch_assoc($result))
{


    verkrijgKlantTaalCrobjob($rows['land']);
    echo 'Onderwerp: '.  MAIL_REMINDER_DAY_1_SUBJECT.'<br/>';
}
?>


Het probleem is dat hij altijd de taal pakt van de eerste in de while loop dus nederlandse klanten krijgen ook een spaanse mail als de eerste record spanje is. Lijkt wel alsof die de include altijd laat staan en niet de nieuwe goed inlaad.
Gewijzigd op 10/07/2019 11:43:11 door Furio Scripting
 
PHP hulp

PHP hulp

28/03/2024 14:51:36
 
Rob Doemaarwat

Rob Doemaarwat

10/07/2019 11:48:30
Quote Anchor link
Zo te zien staan er in die taal bestanden (nl.php, es.php, enz) een hoop defines (ala MAIL_REMINDER_DAY_1_SUBJECT)? Die kun je niet opnieuw definen (waarschijnlijk krijg je een sloot warnings). De eerste taal blijft dus behouden. Ipv daarvan zul je dan met variabelen moeten gaan werken - die kun je wel overschrijven.
Gewijzigd op 10/07/2019 12:03:35 door Rob Doemaarwat
 
- Ariën  -
Beheerder

- Ariën -

10/07/2019 11:50:53
Quote Anchor link
Echo eens (wel in testomgeving met dummy-personen) wat er in $rows['land'] staat. Dan weet je zeker wat er gebeurt.

Overigens heb je het in je functie over Crobjob, terwijl je Cronjob bedoelt.
 
Furio Scripting

Furio Scripting

10/07/2019 11:52:40
Quote Anchor link
Rob Doemaarwat op 10/07/2019 11:48:30:
Zo te zien staan er in die taal bestanden (nl.php, es.php, enz) een hoop defines (ala MAIL_REMINDER_DAY_1_SUBJECT)? Die kun je niet opnieuw definen (waarschijnlijk krijg je een sloot warnings). De eerste taal blijft dus behouden. Ipv daarvan zul je dan met variabelen moeten gaan werken - die kun je wel overschrijven.


Dat klopt Rob, in de taal bestanden zijn dezelfde defines op deze manier:

define("MAIL_REMINDER_DAY_1_SUBJECT", "stukje content");

Het hele systeem is zo gebouwd dus hoop stiekem dat er toch een manier is om het makkelijk op te lossen of moet ik toch variablen gaan gebruiken? Is in principe geen ramp daar het maar om 3 mailtjes gaat en 6 talen.


Toevoeging op 10/07/2019 11:53:47:

- Ariën - op 10/07/2019 11:50:53:
Echo eens (wel in testomgeving met dummy-personen) wat er in $rows['land'] staat. Dan weet je zeker wat er gebeurt.

Overigens heb je het in je functie over Crobjob, terwijl je Cronjob bedoelt.


Bedankt voor je reactie, dit heb ik ook gedaan en daar komt netjes NL of ES uit, enkel de taal haalt die niet lekker op (altijd dezelfde taal).

Ik test nog wat door...
 
- Ariën  -
Beheerder

- Ariën -

10/07/2019 11:53:54
Quote Anchor link
Nee, defines zijn statisch, en kunnen niet meer halverwege wijzigen. Daarom zijn variabelen de beste oplossing voor taalbestanden.
 
Rob Doemaarwat

Rob Doemaarwat

10/07/2019 12:03:46
Quote Anchor link
Overigens vind ik dit soort "vertaal systemen" (met constanten) altijd onhandig. D'r komt een dag dat je een vertalingen aan een van die bestanden vergeet toe te voegen, en dan heb je een warning te pakken (die je misschien niet ziet), en een gat in je output. En bovenstaand probleem dus.

Zelf werk ik altijd met een functie, die ook meteen een log/mailtje doet als er een vertaling ontbreekt. Heel plat:
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
function translate($code){
  global $translations; //array met de actieve vertalingen (taal afhankelijk dus)

  if(array_key_exists($code,$translations)) return $translations[$code];
  mail('[email protected]','Ontbrekende vertaling',"$code ontbreekt in het {huidige taal}");
  return "<!-- $code -->"; //handig voor debuggen
}

//en dan in nl.php dus iets van:
$translations = [
  'MAIL_REMINDER_DAY_1_SUBJECT' => 'Je bent iets vergeten',
  'MAIL_REMINDER_DAY_1_MESSAGE' => '...',
  //enz
];

//en in je script
mail($to,translate('MAIL_REMINDER_DAY_1_SUBJECT'),translate('MAIL_REMINDER_DAY_1_MESSAGE'));
Gewijzigd op 10/07/2019 12:06:28 door Rob Doemaarwat
 
Furio Scripting

Furio Scripting

10/07/2019 12:07:34
Quote Anchor link
- Ariën - op 10/07/2019 11:53:54:
Nee, defines zijn statisch, en kunnen niet meer halverwege wijzigen. Daarom zijn variabelen de beste oplossing voor taalbestanden.


Het is mij duidelijk dat constanten niet overschreven kunnen worden, weer wat geleerd.

Heb nu even snel wat aangepast en stiekem gehoopt dat jullie dit bedoelen met variablen maar hij geeft nu leeg resultaat, wat gaat er mis?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
NL.php: <?php $MAIL_REMINDER_DAY_1_SUBJECT = "content Nederlands"; ?>
ES.php: <?php $MAIL_REMINDER_DAY_1_SUBJECT = "content Spaans"; ?>


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
<?php // 1 dag

$q = 'SELECT * FROM bestellingen WHERE DATE(bestel_datum) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)';
$result = $database->query($q);


while ($rows = mysqli_fetch_assoc($result))
{


    verkrijgKlantTaalCronjob($rows['land']);
    
    
if (checkOfKlantAbbonementHeeft($rows['klant_id']) == 0)
{

      

    
      
       echo 'webshop:  '.$rows['land'].'<br/>';
       echo 'Onderwerp: '.$MAIL_REMINDER_DAY_1_SUBJECT.'<br/>';
                          
        
      
        
        
}
?>


Toevoeging op 10/07/2019 12:21:41:

Dit geeft die aan: Notice: Undefined variable: MAIL_REMINDER_DAY_1_SUBJECT in /home/admin/domains/xxxxx/public_html/page/test.php on line 57

Dus ergens gaat het mis bij het inladen, de variable staat denk ik wel in orde zo.

Als ik het zo doe in de while loop gaat die wel goed:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
  if ($rows['land'] == 'netherlands')
  {

   include './customers/languages/nl.php';
  }

  elseif($rows['land'] == 'spain')
  {

   include './customers/languages/es.php';
  }
?>


Dus ik moet de functie eens nalopen
Gewijzigd op 10/07/2019 12:26:50 door Furio Scripting
 
- Ariën  -
Beheerder

- Ariën -

10/07/2019 12:49:42
Quote Anchor link
In een functie zijn de variabelen niet direct erbuiten te gebruiken. Je zult ze met global naar buiten moeten brengen. Maar met een tiental variabelen wordt het een hoop herhalend werk.

Ik denk dat het zinvoller is als je er een array van maakt:

NL.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$lang
['MAIL_REMINDER_DAY_1_SUBJECT'] = "content Nederlands";
?>

ES.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$lang
['MAIL_REMINDER_DAY_1_SUBJECT'] = "Contenido en españols";
?>


En in je verkrijgKlantTaalCronjob() kan je dan $lang in een global plaatsen.
Gewijzigd op 10/07/2019 12:50:05 door - Ariën -
 
Furio Scripting

Furio Scripting

10/07/2019 13:11:14
Quote Anchor link
Bedankt voor alle adviezen en hulp! Top forum dit!! Het is gelukt en ik heb weer wat geleerd :)
 
Thomas van den Heuvel

Thomas van den Heuvel

10/07/2019 14:54:54
Quote Anchor link
Quote:
Dit geeft die aan: Notice: Undefined variable: MAIL_REMINDER_DAY_1_SUBJECT in /home/admin/domains/xxxxx/public_html/page/test.php on line 57

Dus ergens gaat het mis bij het inladen, de variable staat denk ik wel in orde zo.

Dit heeft te maken met de scope (het geldigheidshgebied) van de include. In de documentatie staat hierover het volgende:
Quote:
If the include occurs inside a function within the calling file, then all of the code contained in the called file will behave as though it had been defined inside that function. So, it will follow the variable scope of that function.

Oftewel de vertalingen zijn alleen beschikbaar binnen de functie. Dit probleem had je voorheen niet omdat je constanten gebruikte. Deze leven in de globale scope, m.a.w. zijn altijd en overal beschikbaar. Maar daar werden waarschijnlijk tig waarschuwingen gegenereerd omdat je probeerde constanten te herdefiniëren.

In het algemeen lijkt het mij zeer de moeite waard om het melden + weergeven van fouten aan te zetten bij ontwikkeling zodat dit soort fouten in een vroeg stadium worden gedetecteerd. Dit scheelt je een heleboel stront, vooral als dit soort code al in gebruik is genomen op het moment dat je je realiseert dat er iets misgaat...
 



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.