mysql_real_escape_string
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anwenden
array
aufbau
aufbauen
bau
befehl
code
datenbank
idee
info
kleines beispiel
not
problem
schleife
server
start
statement
string
verbindung
verhindern
-
Hallo
kann man mysql_real_escape_string() auch auf den "fertigen" SQL Befehl anwenden,
anstatt auf die einzelnen Variablen ?
also anstattt so
$sql = "INSERT INTO ".$table1." ( name, info, numb ) VALUES ( '" . mysql_real_escape_string($new_name1) . "', '" . mysql_real_escape_string($new_info1) . "', '" . $new_numb1 . "' ), ( '" . mysql_real_escape_string($new_name2) . "', '" . mysql_real_escape_string($new_info2) . "', '" . $new_numb2 . "' ) ";
erst nach dem Zusammen-Bau des MySQL Befehls (auf den "fertigen" Befehl)
$sql = "INSERT INTO ".$table1." ( name, info, numb ) VALUES ( '" . $new_name1 . "', '" . $new_info1 . "', '" . $new_numb1 . "' ), ( '" . $new_name2 . "', '" . $new_info2 . "', '" . $new_numb2 . "' ) "; $sql = mysql_real_escape_string($sql);
oder macht das Probleme, weil VALUES Werte ja in (einfache) Hochkomma drin stehen?
... mein Problem ist, dass der Zusammen-Bau des MySQL-Befehls in einer Schleife läuft
(in der die einzutragenden Daten "gesammelt" werden)
und so lange dauert, dass zwar die PHP-Script-Laufzeit ausrecht, aber die MySQL-Verbindung weg ist,
aber ich brauche ja die MySQL-Verbindung um mysql_real_escape_string() anwenden zu können,
daher die Idee, den gesamten SQL-String (Mysql-Befehl) vor Verbindungsaufbau zusammen zu stellen
und dann erst Verbindung aufbauen und diesen "fertigen" SQL-String (Mysql-Befehl) escapen ?!?
... das klappt aber irgendwie nicht ??? ... wie kann ich es sonst machen (das "richtig" escapen)
Beitrag zuletzt geändert: 19.1.2013 12:36:11 von ktowxl -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wahrscheinlich nicht ganz so sicher, aber mir addslashes(), kannst du ebenfalls escapen.
-
Es wird nicht funktionieren, weil escape_string unter anderem dazu verwendet wird, um SQL-Injections zu verhindern.
D. h. Wenn du die gesamte Abfrage escapest, wird diese als formatierter Stringzur Datenbank gesendetvon der Datenbank interpretiert und nicht als SQL-Befehl.
Du musst aber alle einzelnen Strings escapen, um zu verhindern, dass jemand von außen dir die Datenbank kaputtmacht, indem er SQL-Befehle in dein Formular schreibt.
Was du machen könntest, um nicht so oft mysql_real_escape_string in den Code zu schreiben:
$array = array("String 1", "String 2", "String 3"); foreach ($arras AS &$string) { $string = mysql_real_escape_string($string); }
Hier werden alle einzelnen Daten in ein Array geladen und anschließend in einer foreach-Schleife alle escaped. -
ja Danke,
dachte mir schon, das mysql_real_escape_string() auf die "einzelnen" Werte angewendet
werden muss und nicht auf den "fertigen" SQL-Befehl
das ist ne gute idee, ich sammle die Variablen vor Verbindungas-Aufbau in ein Array
dann kann ich - nach dem Verbindungs-Aufbau - die Werte in diesem Array richtig escapen
so kann ich die Verbindung erst aufbauen, wenn schon alle Werte zusammen gesammelt
wurden und dann bleibt die MySQL-Verbindung auch lange genug bestehen.
PS: das Problem, das die Verbindung nicht lange genug bleibt ist auf anderem Server
(nicht Lima-City) ... wenn ich es hier ausprobiere, geht es auch "direkt" ...
aber auf dem anderen kommt nach paar Sekunden die Meldung: "MySQL Server gone away"
aber mit dem "zuerst in Array ablegen" klappt es auch dort.
mal so ganz grob ... Ablauf in 5 Schritten:
// ------ (1) --- build data array before mysql connect --- $indata = array(); $indata[0] = array($new_name1, $new_info1, $new_numb1); $indata[1] = array($new_name2, $new_info2, $new_numb2); // ... usw. // ------ (2) --- connect to mysql and select database --- $con = mysql_connect($mysql_host, $mysql_user, $mysql_pass); if (!$con) { print "<br />Could not connect: <br />\n" . mysql_error(); exit; } $sel = mysql_select_db($mysql_name, $con); if (!$sel) { print "<br />Could not select: <br />\n" . mysql_error(); exit; } // ------ (3) --- escape strings --- // ---------------------------------- function escaped_values($array) { $escdata = '' // ---- start values string foreach ($array as $item) { $escdata .= "\n("; // ---- start values row foreach ($item as $key => $value ) { $escdata .= "'".mysql_real_escape_string($value)."',"; // ---- insert value in row } $escdata = rtrim($escdata,','); $escdata .= '),'; // ---- close values row } $escdata = rtrim($escdata,','); return $escdata; } // ---------------------------------- $str_indata = escape_values($indata); // ------ (4) --- build SQL Query String --- $sql = "INSERT INTO ".$table1." ( name, info, numb ) VALUES ".$str_indata.""; // ------ (5) --- run MySQl Query --- $result = mysql_query($sql); if (!$result) { print "<br />MySQL ... Error ... <br />\n" . mysql_error(); exit; } else { print "<br />MySQL ... OK <br />\n"; } // -------------------------
dabei wird zwar auch Wert für numb escaped, obwohl esein INT-Wert ist,, aber wohl egal
hauptsache es funktioniert :)
.... Danke !
-
Stichwort PDO und prepared Statements, damit sparst du dir das Escapen und musst auch nicht alles in einen großen String reinschreiben.
Kleines Beispiel:
/* Connect to an ODBC database using driver invocation */ $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; $user = 'dbuser'; $password = 'dbpass'; try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } $statement = "INSERT INTO table1 (name, info, numb) VALUES (:name, :info, :numb)"; $stmt = $dbh->prepare($statement ); $input_param = array(); foreach($array as $values) { $input_param['name'] = $values['name']; $input_param['info'] = $values['info']; $input_param['numb'] = $values['numb']; $stmt->execute($input_param); }
Mit dieser Methode schreibe ich ca 10.000 Einträge in einem Bruchteil einer Sek. in die Datenbank. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage