v2.0.x Probleme mit PHP 5.4....

Thema wurde von Avenger, 22. August 2012 erstellt.

  1. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ich habe mir einen neuen Rechner gegönnt (mit Core I5 3. Generation, 8GB Speicher, SSD Systwmlauferk: das rockt!), und da das aktuellste XAMPP mit PHP 5.4.4 und MySQL 5.5.25a installiert.

    Und da gibt es einige Probleme.

    MySQL versteht "TYPE=" im "CREATE DATABASE"-Statement nicht mehr, das muss jetzt "ENGINE=" sein (betrifft das Backup und z.B. MySQLDumper/PHPMyAdmin).

    Bei PHP sind jetzt einige Dinge nicht mehr nur "DEPRECATED", sondern schlicht weg!

    z.B. die "session_is_registered" und "session_register" und "session_unregister" in "includes/functions/sessions.php". (http://php.net/manual/en/function.session-register.php)

    Lösung:

    in "includes/functions/sessions.php"

    nach

    PHP:
    if (STORE_SESSIONS == 'mysql') {
    einfügen:

    PHP:
      //Avenger
      
    if (!function_exists('session_register')) 
      {
        function 
    session_register()
        {
          
    $args func_get_args();
          foreach (
    $args as $key)
          {
            
    $_SESSION[$key]=$GLOBALS[$key];
          }
        }
        function 
    session_is_registered($key)
        {
          return isset(
    $_SESSION[$key]);
        }
        function 
    session_unregister($key)
        {
          unset(
    $_SESSION[$key]);
        }
      };
      
    //Avenger
    Da werden sicher noch einige Dinge mehr kommen....
     
  2. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ein weiteres Problem:

    Die "htmlspecialchars"-Funktion liefert bei Strings mit Umlauten einen leeren String zurück!

    Grund: UTF-8 ist jetzt der Standard-Zeichensatz.....
     
  3. Die Vision

    Die Vision Aktives Mitglied

    Registriert seit:
    20. Juli 2012
    Beiträge:
    28
    Danke erhalten:
    2
    Danke vergeben:
    2
    Ach deswegen verschwinden bei mir immer die Artikeltitel wenn ein Umlaut drin ist
    Da lassen sich ja einige Probleme auf PHP 5.4 zurückführen
     
  4. britodo

    britodo Erfahrener Benutzer

    Registriert seit:
    7. November 2011
    Beiträge:
    167
    Danke erhalten:
    18
    Danke vergeben:
    10
    Oha... Mir grauts schon jetzt bei den nächsten Updates...
     
  5. adjustMan

    adjustMan Erfahrener Benutzer

    Registriert seit:
    19. Juli 2012
    Beiträge:
    60
    Danke erhalten:
    1
    Danke vergeben:
    28
  6. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
  7. adjustMan

    adjustMan Erfahrener Benutzer

    Registriert seit:
    19. Juli 2012
    Beiträge:
    60
    Danke erhalten:
    1
    Danke vergeben:
    28
    ok, danke. Und wie geht man am Besten live damit um?
    Die wenigsten haben ja Einfluss auf die PHP Version ;)
     
  8. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    #8 Avenger, 30. August 2012
    Zuletzt bearbeitet: 30. August 2012
    Dazu gehört auch "Call time pass by reference"....

    Also so was:

    Und davon gibt es jede Menge in Gambio.
     
  9. adjustMan

    adjustMan Erfahrener Benutzer

    Registriert seit:
    19. Juli 2012
    Beiträge:
    60
    Danke erhalten:
    1
    Danke vergeben:
    28
    Das heisst also definitiv: Finger weg von PHP 5.4.*! (Soweit beeinflussbar)
     
  10. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Da habe ich lange 'rumgebastelt:

    Um auch in Shops mit nicht UTF-8-Zeichensatz Strings mit Sonderzeichen richtig zu konvertieren, muss man "htmlspecialchars" wie folgt aufrufen:

    PHP:
    htmlspecialchars($string,ENT_SUBSTITUTE,$_SESSION['language_charset']),
    $_SESSION['language_charset'] sollte bei der Initialisierung in eine Konstante konvertiert werden

    PHP:
    define('LANGUAGE_CHARSET',$_SESSION['language_charset']);
    damit nicht jedesmal "$_SESSION['language_charset']" ausgewertet werden muss, so dass man die Funktion dann so aufruft:

    PHP:
    htmlspecialchars($string,ENT_SUBSTITUTE,LANGUAGE_CHARSET),
    Ohne das wird in einem solchen Fall ab PHP 5.4 ein leerer String zurückgeliefert.

    Also, liebe Gambioner, frisch an's Werk, es gibt viel zu tun.... :)
     
  11. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Die einfachere Lösung dürfte sein, eine eigene "htmlspecialchars"-Funktion zu definieren ("pt_htmlspecialchars"), die die neuen Gegebenheiten berücksichtigt.

    Dann kann man nämlich im Shop-Code einfach global "htmlspecialchars" in "pt_htmlspecialchars" ändern, und muss nicht jedes einzelne Auftreten von "htmlspecialchars" anpacken.

    PHP:
    //Adjust for different "htmlspecialchars" handling from PHP 5.4. onwards
    //Default charset is then "UTF-8", so that empty strings are returned in different charsets
    //if the string contains special characters 

    define('LANGUAGE_CHARSET',strtoupper($_SESSION['language_charset']));
    if (!
    defined('ENT_SUBSTITUTE')) 
    {
      
    define('ENT_SUBSTITUTE'0);
    }

    function 
    pt_htmlspecialchars($string)
    {
      return 
    htmlspecialchars($string,ENT_QUOTES ENT_SUBSTITUTE,LANGUAGE_CHARSET);
    }
    Ich habe die Routine in meine "ApplicationTopExtender"-Overloads im Shop und Admin gepackt.

    Gambio kann das sicher in direkt in die "application_top.php" packen....
     
  12. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Diese Implementierung war nicht ausreichend, da teilweise im Gambio-Code auch optionale Parameter mitgegeben werden.

    Das ist das, was ich derzeit verwende:

    PHP:
    $s='LANGUAGE_CHARSET';
    if (!
    defined($s))
    {
      
    define($s,strtoupper($_SESSION['language_charset']));
      if (!
    defined('ENT_SUBSTITUTE')) 
      {
        
    define('ENT_SUBSTITUTE'0);
      }

      function 
    pt_htmlspecialchars($string$flags 0$encoding ''$double_encode false)
      {
        
    $flags=$flags ENT_QUOTES ENT_SUBSTITUTE;
        if (!
    $encoding)
        {
          
    $encoding=LANGUAGE_CHARSET;
        }
        return 
    htmlspecialchars($string$flags$encoding$double_encode);
      }
    }
    Diesen Code habe ich in meine "AdminApplicationTopExtenderComponent"- und "ApplicationTopExtenderComponent"-Overloads eingebaut.
     
  13. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Ein großes Problem ist, dass man normalerweise Fehler erst bemerkt, wenn man im Rahmen der Shop-Ausführung darauf stößt.

    Was natürlich sehr unbefriedigend ist.

    Und den Code systematisch aufgrund der PHP 5.4-Restriktionen danach zu durchsuchen, ist kaum möglich.

    Ich habe aber eine Lösung für dieses Problem gefunden: IonCube!

    IonCube ist ja eigentlich dazu gedacht, PHP-Programme zu verschlüsseln, aber vor der Verschlüsselung macht IonCube eine komplette Syntax-Prüfung der Module!

    Und gibt eine wunderbare Fehlerliste aus, wo es Fehler entdeckt hat...

    Problem im Moment ist, dass es erst bei Version PHP 5.3.x steht, aber eine PHP 5.4 basierende Version ist angekündigt.

    Das dürfte die Code-Bereinigung enorm erleichtern.
     
  14. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Das "htmlspecialchars"-Problem kann man auch dadurch lösen, dass man die Datenbank-Daten zu UTF-8 kopiert (was ja künftig sowieso der Gambio-Standard werden soll).

    Ich habe mir dazu ein Proggy entwickelt, das eine DB zu dem gewünschten "charset" und der gewünschten "collation" konvertiert.

    Das Programm "convert_db_charset.php" aus anhängendem Archiv in die Shop-Root kopieren,

    Am Anfang des Programms findet man die folgenden Befehle, mit denen man die Zieldaten wählen kann:

    PHP:
    $target_charset='utf8';
    $target_collation='utf8_general_ci';
    Als Admin einloggen, und dann in der Adresszeile aufrufen.

    Es gibt keinerlei Gewährleistung, Anwendung auf eigenes Risiko.

    Datenbank vor Anwendung sichern.

    Am besten auf Kopie der Datenbank anwenden.


     

    Anhänge:

  15. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    Hallo Avenger,

    ich habe mir das Script nicht angesehen; wollte aber eben erwähnen, dass die Kollation latin1_general_cs für die gm_url_keywords-Spalte in der content_manager, categories_description und products_description erhalten bleiben muss! Die Spalte MUSS case-sensitive sein.
     
  16. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    MySQL ist per se nicht case-sensitive...

    Die "case-sensitive" Suche wird in GMSeoboost aber (bei alten MySQL-Versionen) durch das Vorsetzen von 'BINARY ' vor dem Suchbegriff erzwungen....

    PHP:
        function set_binary_string()
        {
            if(
    $this->is_collation_supported() === false)
            {
                
    $this->v_binary_string 'BINARY ';
            }
            else
            {
                
    $this->v_binary_string '';
            }
        }
    Wenn man das immer erzwingt, dann hat man das Problem los.
     
  17. adjustMan

    adjustMan Erfahrener Benutzer

    Registriert seit:
    19. Juli 2012
    Beiträge:
    60
    Danke erhalten:
    1
    Danke vergeben:
    28
    Bloss zur Klarstellung! Wenn ich das richtig verstehe, löst dein Script das PHP 5.4.* Problem und man kann
    dann problemlos updaten?
     
  18. Avenger

    Avenger G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    4.771
    Danke erhalten:
    1.478
    Danke vergeben:
    89
    Nein.

    Es löst ein Problem....

    Und bringt die DB auf einen modernen Character-Set-Stand.
     
  19. adjustMan

    adjustMan Erfahrener Benutzer

    Registriert seit:
    19. Juli 2012
    Beiträge:
    60
    Danke erhalten:
    1
    Danke vergeben:
    28
    :D Ok, da ich die "anderen" Probleme nicht kenne, lass ich das also … :p
     
  20. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    Die BINARY-Variante ist ultralangsam und daher eine nicht zumutbare Zumutung ;). Es spricht auch nichts gegen latin1_general_cs, da in der Spalte nie Zeichen gespeichert werden die in UTF-8 anders kodiert wären.