mysql_real escape ohne gewünschtes Ergebnis

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysql_real escape ohne gewünschtes Ergebnis

    Hallo Community,
    ich ärgere mich nun seit Wochen mit der Problematik von Sonderzeichen.
    Ich parse ein xml Dokument und will es in eine mysql Tab. schreiben. In dem Dokument sind viele Sonderzeichen als auch Steuerzeichen. Das Parsen funktioniert einwandfrei,
    wenn ich mir die Variablen mit den geparseten Inhalten ausgeben
    lasse sieht alles sehr schön aus, doch sobald ich in die db schreibe sind z.bsp. einfache Anführungszeichen falsch ( ’ ) als auch Steuerzeichen.

    Habe mir dann mal den insert Befehl ausgeben lassen und mit query browser eingefügt,
    auch hier werden dann alle Zeichen korrekt angezeigt.

    PHP-Code:
    function seems_utf8($Str) {
     for (
    $i=0$i<strlen($Str); $i++) {
      if (
    ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
      
    elseif ((ord($Str[$i]) & 0xE0) == 0xC0$n=1# 110bbbbb
      
    elseif ((ord($Str[$i]) & 0xF0) == 0xE0$n=2# 1110bbbb
      
    elseif ((ord($Str[$i]) & 0xF8) == 0xF0$n=3# 11110bbb
      
    elseif ((ord($Str[$i]) & 0xFC) == 0xF8$n=4# 111110bb
      
    elseif ((ord($Str[$i]) & 0xFE) == 0xFC$n=5# 1111110b
      
    else return false# Does not match any model
      
    for ($j=0$j<$n$j++) { # n bytes matching 10bbbbbb follow ?
       
    if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
        return 
    false;
      }
     }
     return 
    true;
    }

    function 
    utf8_ensure($str) {
        return 
    seems_utf8($str)? $strutf8_encode($str);
    }

    ....
    hier wir geparsed


                            $entry_title 
    mysql_real_escape_string(utf8_ensure($item->get_title()));
                            
    $entry_description mysql_real_escape_string(utf8_ensure($item->get_description()));
                            
    $entry_content mysql_real_escape_string(utf8_ensure($item->get_content()));
                        
                            
    $entry_date strftime('%Y-%m-%d',$item->get_date());
                            if(
    $entry_date == "1970-01-01")
                                
    $entry_date=date('Y-m-d');
                        
    #echo $encoding."<br>".$entry_date."<br>".$item->get_link()."
    <br>".$entry_title."<br>".$entry_description."<br><hr>";                
                        echo "
    $entry_title<br";
                        #exit;
                        
    $query = "INSERT INTO blog_items_copy
    (id,blog_id,blog_item_url,blog_item_title,blog_item_date,blog_item_desc,blog_item_content,run_date)
    VALUES 
    ('','".$feed_ids[$i]."''".$item->get_link()."''".$entry_title."','".$entry_date."','".$entry_description."','".
    $entry_content."'
    ,NOW())
                        
    ";
                        
                        echo 
    $query;
                            if(strlen(
    $query) > 1) {
                                mysql_query(
    $query);
                            } 
    Um der Sache auf den Grund zu gehen habe ich mittels ngrep mir mal angeschaut, was überhaupt gesendet wird.
    Und da sind Anführungszeichen auch nur als "..." dargestellt. Irgendwas scheint mit dem insert nicht zu stimmen.
    Php läuft auf der Kommandozeile mit charset utf8 als auch mysql mit utf8. Ich bin mittlerweile ratlos und freue mich über eure Hilfe.
    Zuletzt geändert von iberican; 20.02.2008, 13:30.

  • #2
    wie es der Zufall will stoße ich gerade auf

    PHP-Code:
    mysql_query("SET NAMES utf8"); 
    und es funktioniert. Kann mir jmd. erklären wozu das nötigt ist, alle Laufzeitvariablen meines mysql servers sind auf utf8

    Kommentar


    • #3
      Die Query setzt den Zeichensatz der Verbindung deines Skriptes mit der Datenbank auf UTF-8. Standard ist glaube ich ISO-8859-1, wodurch alle Inhalte von der DB entsprechend konvertiert werden. Mit set names legst du diesen Zeichensatz neu fest!

      Kommentar


      • #4
        thx,habe ich mittlerweile rausgefunden. doch sauber ist diese lösung nicht, ich will das nicht über den client steuern.
        in der doku von mysql heißt es man soll in der my.cnf
        unter [crond] folgenden eintrag machen
        Code:
        init-connect='SET NAMES utf8'
        weiter habe ich dort
        Code:
        SET NAMES utf8;
        SET CHARACTER_SET utf8;
        hat alles nicht funktioniert (habe neu gestartet)
        dann habe ich es selbst unter [client] eingetragen und es tut nicht.

        ich weiß wirklich nicht mehr an welchem rädchen ich noch drehen kann...
        thx for help

        Kommentar


        • #5
          Afaik kannst du das nur so machen! Das Senden einer solchen Query ist aber auch viel portabler, als in den Datenbankkonfigurationen rumzuwerkeln!

          Kommentar


          • #6
            so nach nach weiterem werkeln die lösung

            Code:
            # client
            [client]
            default-character-set=utf8
            port            = 3306
            socket          = /tmp/mysql.sock
            
            # The MySQL server
            [mysqld]
            init-connect='SET NAMES utf8'
            skip-character-set-client-handshake
            der handshake eintrag ist wichtig.

            @desaster. du hast schon recht. aber so eine global config des servers bevorzuge ich, da werden dann meine kollegen nicht mit dem gleich problem konfrontiert..

            Kommentar


            • #7
              du hast schon recht. aber so eine global config des servers bevorzuge ich, da werden dann meine kollegen nicht mit dem gleich problem konfrontiert..
              Ok, das stimmt natürlich. Hängt immer vom Einsatzbereich ab. Wenn ihr jetzt eure Software vertreiben würdet, wäre der andere Weg der bessere

              Kommentar


              • #8
                ja allerrdings das leuchtet ein. ist aber in diesem fall nur ein developer server. trotzdem muss ich sagen, war das äußerst tricky. war lange zeit von einer falschen php config ausgegagen

                Kommentar


                • #9
                  PHP-Code:
                  function utf8_ensure($str) {     return seems_utf8($str)? $strutf8_encode($str); } 
                  Geht auch einfacher: mb_detect_encoding
                  Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                  Kommentar


                  • #10
                    ah jetzt ja. kannte ich nicht... thx

                    Kommentar

                    Lädt...
                    X