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
12345$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)
1234567$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:
1234$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:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455// ------ (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