2017-04-16 4 views
0

Ich möchte alle meine Saiten entkommen, die ich in meine Datenbank einfügen möchte. Aber mein Problem ist, weil ich mehr als 10.000 Saiten zu überprüfen, würden die Datenbankabfragen zu viel ...MySQL echte Flucht - eigene Flucht - o zu ö?

So verwende ich diese Escape-Funktion, die ich hier in stackoverflow.com gefunden:

function escape($value) { 
    $return = ''; 
    for($i = 0; $i < strlen($value); ++$i) { 
     $char = $value[$i]; 
     $ord = ord($char); 
     if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) 
      $return .= $char; 
     else 
      $return .= '\\x' . dechex($ord); 
    } 
    return $return; 
} 

Es funktioniert. Aber mein Problem ist, dass ich habe keine ö, ä oder Zeichen wie die ...

Bevor ich nenne diese Funktion ich eine Zeichenfolge wie diese: Königsedition und nachdem ich diese Funktion aufgerufen, soll ich K\xc3\x83\xc2\xb6nigsedition bekommen. Aber das Problem ist, dass ich aus irgendeinem Grund Kxc3xb6nigsedition in meiner Datenbank bekomme ...

Wie kann ich das zurück zu Königsedition?

Oder, gibt es eine andere Möglichkeit, die Zeichenfolge zu entkommen, ohne dass die SQL echten Escape-Funktion zu verwenden, denn dann muß ich mehr als 10.000 SQL-Abfragen, um eine Zeichenfolge zu entkommen und die UTF 8 Formatierung zu halten? (Ich würde diesen Weg bevorzugen!)

Grüße und Danke!

+1

Was ist mit parametrisierten Abfrage? – frz3993

+0

"aus irgendeinem Grund" erhalten Sie eine Zeichenfolge in Ihrer Datenbank ... nicht vom Aufruf dieser "Escape" -Funktion Sie nicht. Sie würden eine Zeichenfolge in Ihrer Datenbank erhalten, weil Sie eine INSERT- oder UPDATE-Anweisung ausgeführt haben. Wenn Sie die Zeichenfolgenrückgabe von dieser "Escape" -Funktion einfügen, dann wäre das ein "Grund", dass Sie eine Zeichenfolge in Ihrer Datenbank erhalten. Ich verstehe nicht, warum Sie eine * andere * Zeichenkette erwarten als die, die Sie eingefügt haben, um in der Datenbank zu sein. Warum verwenden Sie diese Escape-Funktion? Ich verstehe den Zweck nicht. – spencer7593

+0

Verwenden Sie einfach eine vorbereitete Anweisung mit Bindeplatzhaltern und geben Sie den Wert der einzufügenden Zeichenfolge an. Stellen Sie sicher, dass die Codierung der Zeichenfolgen als Werte übergeben wird, die * mit dem für den MySQL-Client und die Spalten angegebenen Zeichensatz übereinstimmen. https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html – spencer7593

Antwort

2

Sie sollten nicht zur Codierung Ihrer Strings "entkommen" müssen. Stellen Sie sicher, dass die Tabelle, die Verbindung und Ihre Eingabe alle die gleiche Kodierung haben (wie UTF-8).

Für Ihre Tabelle sicherstellen, dass die Spalten (und vorzugsweise die Tabelle selbst) haben, d. H. Utf8_general_ci Kollation.

Wenn Sie PDO verwenden, fügen Sie Ihrem DSN ;charset:utf8 hinzu, oder wenn Sie PDO nicht verwenden, führen Sie die Abfrage SET NAMES utf8 aus, bevor Sie die anderen Abfragen ausführen. Ein Beispiel für einen DSN mit Zeichensatz wäre mysql:host=HOSTNAME;dbname=DATABASE;charset=utf8.

Stellen Sie sicher, dass Ihre Seiten die UTF-8-Kodierung haben, senden Sie den Content-Type-Header Content-Type: text/html; charset=utf-8 für HTML-Seiten, damit Browser Inhalte (nach Formularen) in UTF-8 senden.

+0

Ich habe UTF-8 überhaupt! - Aber wenn ich die 'escape' -Funktion verwende, bekomme ich UTF-8 nicht. –

+0

Warum müssen Sie 'entkommen', wenn Sie einfach parametrisierte Abfragen oder PDO 'quote()' Methode verwenden, sollten Sie in Ordnung sein – Dygnus

+0

Wenn ich 'quote (...)' verwende, schlägt die Abfrage fehl ... –