kostenloser Webspace werbefrei: lima-city


mysql_real_escape_string

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    ktowxl

    ktowxl hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Wahrscheinlich nicht ganz so sicher, aber mir addslashes(), kannst du ebenfalls escapen.
  4. 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 String zur Datenbank gesendet von 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.
  5. Autor dieses Themas

    ktowxl

    ktowxl hat kostenlosen Webspace.

    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 !
  6. 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.
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!