5 Stimmen

mysql_real_escape_string und einfaches Anführungszeichen

Ich bin ziemlich frustriert. Ich möchte in der Lage sein, in meine Datenbank Namen mit einfachen Anführungszeichen einzufügen - zum Beispiel O'Connor.

Beim Einfügen in die DB tue ich das also:

 $lname = mysql_real_escape_string($_POST['lname']);

Und dann füge ich $lname in die DB ein.

Wenn es in der DB ist, erscheint es als O\'Connor.

Wenn ich also diesen Nachnamen in meiner Webanwendung abrufen möchte, muss ich ihn verwenden:

 $lname = stripslashes($r["lname"]);

Das scheint alles gut zu funktionieren. Ich habe jedoch eine Suchfunktion, die nach Nachnamen sucht und die Ergebnisse anzeigt. Wenn ich suche, muss ich nach O\'Connor suchen, um Ergebnisse zu erhalten.

Nachdem ich eine Suche durchgeführt habe, speichert das Textfeld automatisch den Wert dessen, wonach gerade gesucht wurde (unter Verwendung von Sitzungen). Mein Code ist also dieser:

 $search = mysql_real_escape_string($_GET['search']);
 $_SESSION['search'] = $search;

Wie ich bereits sagte, muss ich bei der Suche "O\'Connor" verwenden, und nach der Suche wird der Wert im Textfeld zu "O \\\\ Connor"

Es war frustrierend, das herauszufinden. Weiß jemand, was ich falsch mache? Danke!

EDIT:

Hier ist meine php5.ini-Datei, die magische Anführungszeichen betrifft:

 ; Magic quotes
 ;

 ; Magic quotes for incoming GET/POST/Cookie data.
 magic_quotes_gpc = On

 ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
 magic_quotes_runtime = Off

 ; Use Sybase-style magic quotes (escape ' with '' instead of \').
 magic_quotes_sybase = Off

Allerdings ist meine Website bei GoDaddy gehostet, und ich habe keine Berechtigung, die Datei zu bearbeiten :(

7voto

jimyi Punkte 29803

Es klingt wie Magie Zitate in Ihrer PHP-Konfiguration aktiviert sind.

Um zu überprüfen, ob sie tatsächlich aktiviert ist:

echo get_magic_quotes_gpc();

Zum Deaktivieren bearbeiten Sie Ihre php.ini-Datei:

; Magic quotes
;

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

Oder fügen Sie diese Zeile in Ihre .htaccess ein:

php_flag magic_quotes_gpc Off

0voto

krdluzni Punkte 799

Magische Anführungszeichen sind aktiviert. Das bedeutet, dass alles, was in post oder get oder an ähnlichen Stellen steht, automatisch in Anführungszeichen gesetzt wird, so dass sich Programmieranfänger nicht mehr so viele Gedanken darüber machen müssen. Wenn ich mich richtig erinnere, ist dies in der aktuellen Version von PHP veraltet.

Um dies zu umgehen und das Skript in jeder Konfiguration gleich ablaufen zu lassen, müssen Sie folgendes tun:

function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    return mysql_real_escape_string($value);
}

Möglicherweise möchten Sie dies weiter abändern, um nicht numerische Daten in Anführungszeichen zu setzen, was eine gängige Variante ist, aber ich finde es besser, diese Anführungszeichen manuell zu setzen.

0voto

Phil Rae Punkte 33

Kleine Änderung an der Funktion fixinput, um zu prüfen, ob Ihre PHP-Installation tatsächlich einen echten Escape-String hat (ältere Versionen haben keinen):

  function fixinput($value){
    if (get_magic_quotes_gpc()){
      $value = stripslashes($value);
    }

    if (function_exists('mysql_real_escape_string')) {
      return mysql_real_escape_string($value);
    }
    else {
      return mysql_escape_string($value);
    }
  }

-1voto

TigerTiger Punkte 10278

Ich prüfe nicht auf get_magic_quotes_gpc ist an/aus.

Ich tue nur $lname = mysql_real_escape_string(stripslashes($_POST['lname'])); Wenn es also keine Anführungszeichen gibt, werden keine Schrägstriche entfernt. Wenn es Anführungszeichen gibt, werden sie entfernt.

und es wirkt bei mir Wunder!

-1voto

troelskn Punkte 110542

Wenn er in der DB ist, erscheint er als O\'Connor.

Wenn ich also diesen Nachnamen in meiner Webanwendung abrufen möchte, muss ich ihn verwenden:

 $lname = stripslashes($r["lname"]);

Falsch! Wenn Sie Zeichenketten mit mysql_real_escape_string werden sie nur in der Abfrage ausgeblendet. Die Datenbank interpretiert die Abfrage, so dass die Daten ohne Escape-Zeichen in der Datenbank landen. Sie nicht verwenden müssen stripslashes beim Abrufen von Daten aus der Datenbank. Wenn Sie das glauben, dann bedeutet das, dass die Daten in Ihrer Datenbank fehlerhaft sind. Höchstwahrscheinlich, weil Sie die magischen Anführungszeichen aktiviert haben.

Das sollten Sie:

  • Deaktivieren Sie magische Anführungszeichen oder kehren Sie ihre Wirkung global um. Siehe das Handbuch für Einzelheiten.
  • Entweder verwenden Sie gebundene Parameter (Die beste Lösung) o alle Variablen mit mysql_real_escape_string . Sie sollten dies dort tun, wo Sie die Abfrage erstellen.
  • Die Daten, die Sie aus der Datenbank entnehmen, werden nicht weiter bearbeitet.

Machen Sie insbesondere keine Funktion a la fixinput und Varianten, die in einigen der Antworten hier aufgeführt sind. Es ist der falsche Weg, um das Problem zu lösen, weil es alle Daten, die nicht von einer http-Anfrage kommen, durcheinander bringen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X