phpbar.de logo

Mailinglisten-Archive

[php] update funktioniert nicht

[php] update funktioniert nicht

Nico Haase nico.haase at gmx.de
Fre Apr 1 15:09:47 CEST 2005


Moin.

> Ich hab dein Query etwas ueberarbeitet und wuerde sagen das du das so
> einruecken solltest, dann kannst du den Fehler besser lokalisieren weil
> die mySQL Fehlermeldung dir die richtige Zeile verraet. Und weiterhin
> solltest du alle Uservariablen ueberpruefen bevor du diese an das Query
> ranlaesst. Schon mal was von SQL Injection gehoert? ;)
>
> mysql_query("UPDATE
>                  benutzerdaten
>              SET
>                  `vorname` = '".$vorname."',
[...]
>                  `esr` = '".$esr."',
>                  `spende` = '".$spende."',
>                  `mahng` = '".$mahng."',
>                  `nummer` = '".$nummer."'
>              WHERE
>                  id = ".addslashes(htmlspecialchars($_GET[edit])).";")
> OR die(mysql_error());

Naja, aber bei $_GET['edit'] (man bedenke die Anführungzeichen um Edit!!!)
das ganze noch irgendwie kryptisch durch Funktionen zu schicken, ist doch
auch nicht so sinnvoll. Die ID ist (wenn man der Bezeichnung ID trauen darf)
doch nur eine Zahl, sinnvoller wäre also sowas wie

>              WHERE
>                  id = ".(int)$_GET['edit'.";")

Bei mir werkelt für solche Sachen übrigens eine MySQL-Klasse, die die
Funktion sql_update() kennt. Ihr wird der Tabellenname, ein Array mit den
Spaltennamen und -inhalten und eine Where-Bedingung sowie ein zweites Array
mit ggf. nicht zu verändernden Feldern übergeben. Das Array setzt die
Funktion dann zusammen. So sieht die Funktion aus:

public function sql_update ( $tabelle, $felder, $where, $noChange = false )
 {
 	$query = 'UPDATE ' . $tabelle . ' SET ';
 	$inhalte = array();
	if ( !$noChange ) $noChange = array();
 	foreach ( $felder as $feldname => $feldinhalt )
 	 {
 	 	$content = $feldname . ' = ';
 	 	if ( is_string ( $feldinhalt ) )
 	 	 {
 	 	 	$content .= '"' .
                  ( in_array ( $feldname, $noChange ) ?
                    $feldinhalt : mysql_escape_string ( $feldinhalt ) )
                    . '"';
 	 	 }
 	 	else
 	 	 {
 	 	 	$content .= $feldinhalt;
 	 	 }
 	 	$inhalte[] = $content;
 	 }
 	$query .= implode ( ', ', $inhalte );
 	$query .= ' WHERE ' . $where;
 	return $this->sql_query ( $query );
 }

So wird die ganze Sache von wegen mysql_escape_string überall setzen etwas
vereinfacht, wobei sicher auch hier noch nicht zu unterschätzende
Sicherheitslücken drinstecken könnten.
mfg
Nico

-- 
www.buchtips.net - Rezensionen online

php::bar PHP Wiki   -   Listenarchive