André: PHP Parse error

Hallo,

ich möchte gerne alle Einträge haben, die mailInfo = 0 und wo die Mail Adresse nicht leer ist. Ich dachte, ich könnte dieses so umsetzten:

$stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = "" " );

erhalte aber eine Fehlermeldung:

PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

Wie müsste ich meine Zeile umschreiben, dass ich mein Vorhaben umsetzten kann?

  1. Hallo André,

    $stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = "" " );
    

    erhalte aber eine Fehlermeldung:

    PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

    Ursache sind die Anführungszeichen.

    Es wird _WHERE mailInfo = 0 AND NOT email =_[1] an $select angehängt. Danach folgt " ". Dies kann an dieser Stelle nicht verarbeitet werden.

    EDIT: siehe auch die Einleitung zum Kontextwechsel.

    Bis demnächst
    Matthias

    --
    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)

    1. Die Unterstriche stehen für Leerzeichen zur besseren Hervorhebung. ↩︎

    1. Hallo Matthias,

      Ursache sind die Anführungszeichen.

      Es wird _WHERE mailInfo = 0 AND NOT email =_[^1] an $select angehängt. Danach folgt " ". Dies kann an dieser Stelle nicht verarbeitet werden.

      danke für den Hinweis. Ich habe die "" durch '' ersetzt und es geht wieder.

  2. Tach,

    ich möchte gerne alle Einträge haben, die mailInfo = 0 und wo die Mail Adresse nicht leer ist. Ich dachte, ich könnte dieses so umsetzten:

    $stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = "" " );
    

    wenn du die Zeichen, die du zur Markierung eines Strings verwendest (hier "), innerhalb dieses Strings verwenden willst, musst du diese passend escapen.

    mfg
    Woodfighter

    1. Hallo,

      wenn du die Zeichen, die du zur Markierung eines Strings verwendest (hier "), innerhalb dieses Strings verwenden willst, musst du diese passend escapen.

      ich erhalte folgende Meldung wenn ich auf einen Link klicke:

      Wir konnten die Seite, die Sie suchen, leider nicht finden.

      Meinst du so?

      $stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = \"\" " );
      
      1. Hallo André,

        wenn du die Zeichen, die du zur Markierung eines Strings verwendest (hier "), innerhalb dieses Strings verwenden willst, musst du diese passend escapen.

        ich erhalte folgende Meldung wenn ich auf einen Link klicke:

        Wir konnten die Seite, die Sie suchen, leider nicht finden.

        Ja, da hat sich ein Fehler eingeschlichen. Ich habs repariert.

        Meinst du so?

        $stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = \"\" " );
        

        Zum Beispiel.

        Bis demnächst
        Matthias

        --
        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
        1. Tach,

          Ja, da hat sich ein Fehler eingeschlichen. Ich habs repariert.

          dann musst du aber auch noch den Anker mit einbauen.

          mfg
          Woodfighter

          1. Hallo woodfighter,

            dann musst du aber auch noch den Anker mit einbauen.

            Ich war schon dabei ;-)

            Bis demnächst
            Matthias

            --
            Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
      2. Tach,

        wenn du die Zeichen, die du zur Markierung eines Strings verwendest (hier "), innerhalb dieses Strings verwenden willst, musst du diese passend escapen. ich erhalte folgende Meldung wenn ich auf einen Link klicke:

        Wir konnten die Seite, die Sie suchen, leider nicht finden.

        oh, mein Fehler, https://secure.php.net/manual/en/language.types.string.php#language.types.string.syntax.double war gemeint.

        Meinst du so?

        $stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = \"\" " );
        

        Das sieht besser aus.

        mfg
        Woodfighter

        1. Hallo,

          Meinst du so?

          $stmt = $mysqli->prepare($select . " WHERE mailInfo = 0 AND NOT email = \"\" " );
          

          Das sieht besser aus.

          ich habe warscheinlich noch ein Fehler. Nach 60 Mail hört mein Script auf zu arbeiten. Die Laufzeit habe ich schon nach oben gesetzt

          set_time_limit(1200);
          

          In den Logs finde ich folgende Meldung

          [Wed Mar 09 22:28:15 2016] [error] Stack trace:

          [Wed Mar 09 22:28:15 2016] [error] #0 include/lib/Swift-5.0.3/lib/classes/Swift/Transport/AbstractSmtpTransport.php(291): Swift_Transport_AbstractSmtpTransport->_assertResponseCode('421 4.7.0 001ma...', Array)

          [Wed Mar 09 22:28:15 2016] [error] #1 include/lib/Swift-5.0.3/lib/classes/Swift/Transport/AbstractSmtpTransport.php(119): Swift_Transport_AbstractSmtpTransport->_readGreeting()

          [Wed Mar 09 22:28:15 2016] [error] #2 include/lib/Swift-5.0.3/lib/classes/Swift/Mailer.php(80): Swift_Transport_AbstractSmtpTransport->start()

          [Wed Mar 09 22:28:15 2016] [error] #3 include/lib/Swift-5.0.3/lib/classes/Swift/Transport/AbstractSmtpTransport.php on line 386

          Das Script rufe ich mit einer Schleife auf

          foreach($Newsletter as $KundenNewsletter){ 
            //Hier der Mail Versand
          }
          

          Im Datensatz Nummer 61 ist auch nichts drin, was den Fehler verursachen könnte. Hast du vielleicht eine Ahnung an was es liegen könnte?

          Müsste ich dem Script vielleicht eine "Pause" gönnen? Wenn ja, wie könnte ich dieses umsetzten?

          1. Hallo,

            ich habe ein sleep(15); bevor die Schleife geschlossen wird eingebaut. Jetzt erhalte ich eine

            504 Gateway Time-out

            Meldung. Keine Ahnung ob es am Server liegt, oder ob das Script schuld ist. Mails trudeln noch ein.

            Vielleicht sollte ich das sleep(15); nicht nach JEDEM durchlauf ausführen? Wäre es möglich dass ich nach jedem 40 Durchlauf das sleep(15); ausführe?

            1. Hallo,

              wenn ich es hier richtig verstanden habe, sollte es so gehen: http://stackoverflow.com/questions/21066428/php-foreach-every-100-times-sleep-then-continue

              $count=0;
              
              foreach($Newsletter as $KundenNewsletter){ 
                
                //Hier der Mail Versand
              
              if(($count%50)==0)
                  {
                      sleep(3);
                  }
              
              }
              

              Dann würde das Script nach jedem 50. Durchlauf eine Pause machen, richtig?

              1. Tach,

                $count=0;
                
                foreach($Newsletter as $KundenNewsletter){ 
                  
                  //Hier der Mail Versand
                
                if(($count%50)==0)
                    {
                        sleep(3);
                    }
                
                }
                

                Dann würde das Script nach jedem 50. Durchlauf eine Pause machen, richtig?

                nein, das macht nach jedem Durchlauf eine Pause; du hast das Inkrementieren des Counters vergessen.

                mfg
                Woodfighter

                1. Hallo,

                  nein, das macht nach jedem Durchlauf eine Pause; du hast das Inkrementieren des Counters vergessen.

                  also so?

                  $count=0;
                  
                  foreach($Newsletter as $KundenNewsletter){ 
                    
                    $count++; 
                    
                    //Hier der Mail Versand
                  
                    if(($count%50)==0)
                      {
                          sleep(3);
                      }
                  
                  }
                  
                  1. Tach,

                    nein, das macht nach jedem Durchlauf eine Pause; du hast das Inkrementieren des Counters vergessen.

                    also so?

                    $count=0;
                    
                    foreach($Newsletter as $KundenNewsletter){ 
                      
                      $count++; 
                      
                      //Hier der Mail Versand
                    
                      if(($count%50)==0)
                        {
                            sleep(3);
                        }
                    
                    }
                    

                    ja das sollte funktionieren; die Klammer um $count%50 kannst du dir übrigens sparen, da der Modulo-Operator immer vor dem Vergleichsoperator ausgewertet wird: https://secure.php.net/manual/en/language.operators.precedence.php

                    mfg
                    Woodfighter

                    1. Hallo,

                        if(($count%50)==0)
                          {
                          }
                      

                      ja das sollte funktionieren; die Klammer um $count%50 kannst du dir übrigens sparen, da der Modulo-Operator immer vor dem Vergleichsoperator ausgewertet wird: https://secure.php.net/manual/en/language.operators.precedence.php

                      stimmt zwar, aber ich würde trotzdem nicht empfehlen, die Klammer wegzulassen. Nicht immer ist die Operator-Rangfolge so, wie man sie intuitiv erwarten würde, und Logikfehler aufgrund einer falschen Bearbeitungsreihenfolge sind verdammt schwer aufzuspüren.

                      Ich hatte erst neulich so einen Fall (allerdings in C), da hatte ich sinngemäß stehen:

                      if (flags & 1<<(i & 7))
                         ...
                      

                      Ich hatte gedacht, der Bit-Shift-Operator bindet stärker als ein Bitwise-And. Falsch gedacht. Nach einer längeren Debug-Session habe ich dann gemerkt, dass ich den Ausdruck 1<<(i & 7) nochmal klammern muss.

                      So long,
                       Martin

          2. Tach,

            In den Logs finde ich folgende Meldung

            [Wed Mar 09 22:28:15 2016] [error] Stack trace:

            [Wed Mar 09 22:28:15 2016] [error] #0 include/lib/Swift-5.0.3/lib/classes/Swift/Transport/AbstractSmtpTransport.php(291): Swift_Transport_AbstractSmtpTransport->_assertResponseCode('421 4.7.0 001ma...', Array)

            der SMTP-Server liefert einen Fehlercode zurück, wenn du keinen Zugriff auf dessen Log hast, musst du das Logging in SwiftMailer aktivieren: http://swiftmailer.org/docs/plugins.html#logger-plugin

            mfg
            Woodfighter