naja: Update

Hallo,
ich muss urlaubsmäßig einen Kollegen vertreten und habe leider keine Ahnung von php usw. Und es kam, wie es kommen muss. Es traten Probleme auf bzw. es müssen sofort Erweiterungen vorgenommen werden.
Mein Problem: Ich benötige eine Funktion, mit der ich Datensätze in einer mysql-Datenbank ändern kann. Also 'ne Update Funktion.
Die Funktion zum Senden der Daten sieht folgendermaßen aus:

<?php
$varnames = $varvalues = array();
foreach ($_POST as $varname => $varvalue) {
$varnames[]=$varname; $varvalues[]=$varvalue;
}

//  Zugriff auf die SQL-Datenbank
if(!($sql = mysql_connect("...", "...", ""))) { die("kein SQL-Server gefunden"); }
if(!($db  = mysql_select_db("...", $sql))) { die("Datenbank wurde nicht gefunden"); }

$query = "INSERT INTO tabelle    (";  
foreach ($varnames as $varname) {  

$query .= $varname.", ";
}
$query = substr($query,0,strlen($query)-2);
$query .=") VALUES (";
foreach ($varnames as $varname) {
     $query .= "'".$_POST[$varname]."', ";
}
$query = substr($query,0,strlen($query)-2);
$query .=")";

printf("\n<p>so sieht der SQL-String aus:<br />\n $query</p>");  

if (!mysql\_query($query)) {  
	printf("<strong>Funktioniert nicht.</strong><br>");  
};  
  

printf("hier nur zur Info alle Werte noch mal ausgegeben: <br />\n");  
printf("<ol>\n");  
foreach ($\_POST as $varname => $varvalue) {  

printf(" <li>varname: $varname | wert: $varvalue </li>\n");
}
printf("</ol>\n");
?>

Ich dachte nu, man kann vielleicht einfach das Select durch ein Update ersetzen. Funktioniert natürlich nicht.
Die Daten des jeweils aktuellen Datensatzes müssen geändert werden.

Wenn das zuviel verlangt ist, sagt es einfach. Ansonsten wär ich natürlich für jede Hilfe dankbar.

Gruß, naja

  1. Hi there,

    Wenn das zuviel verlangt ist, sagt es einfach. Ansonsten wär ich natürlich für jede Hilfe dankbar.

    die Syntax lautet UPDATE table_name SET feld1=wert1,feld2=wert2, feld3=wert3 usw usf...

    1. Hi, danke,
      aber ich möchte ungern jedes Feld einzeln aufzählen (wären an die 100), deshalb wär so eine Lösung mit einem array wie es in der Senden-Funktion steht, schon besser...

      Gruß, naja

      1. aber ich möchte ungern jedes Feld einzeln aufzählen (wären an die 100), deshalb wär so eine Lösung mit einem array wie es in der Senden-Funktion steht, schon besser...

        Mit denselben Sicherheitlücken? Gerne - warum baust du sie nicht einfach nach?

        1. Danke für eure Beiträge.

          Was genau sind die Sicherheitslücken im bisherigen INSERT-Statement? Damit ich meinen Kollegen mal dezent drauf hinweisen kann...

          Ansonsten probier ich mal weiter dank eurer Anregungen.

          Ein schönes Wochenende
          naja

          1. Mahlzeit naja,

            Was genau sind die Sicherheitslücken im bisherigen INSERT-Statement? Damit ich meinen Kollegen mal dezent drauf hinweisen kann...

            Du (bzw. Dein Kollege) übernimmst hier

            foreach ($_POST as $varname => $varvalue) {  
            $varnames[]=$varname; $varvalues[]=$varvalue;  
            }
            

            einfach ungeprüft *ALLE* von außen per POST an das Skript übermittelte Daten.

            Etwas weiter unten werden diese Daten ungeprüft und ohne Berücksichtigung des stattfindenden Kontextwechsels in einer SQL-Abfrage verwurstet:

            $query = "INSERT INTO tabelle    (";  
            foreach ($varnames as $varname) {  
                 $query .= $varname.", ";  
            }  
            $query = substr($query,0,strlen($query)-2);  
            $query .=") VALUES (";  
            foreach ($varnames as $varname) {  
                 $query .= "'".$_POST[$varname]."', ";  
            }
            

            Was passiert z.B. Deiner Meinung nach, wenn jemand als Wert einen String übergibt, der ein ' enthält? Und das wäre noch Dein geringstes Problem ...

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Was passiert z.B. Deiner Meinung nach, wenn jemand als Wert einen String übergibt, der ein ' enthält? Und das wäre noch Dein geringstes Problem ...

              Dazu immer wieder passen, die Fabel über den kleinen Bobby Tables :)

            2. Alles klar. Danke. Ich werd's weiter geben (und mich auch selbst damit befassen...so langsam muss ich wohl;))

              Nochmal Danke und Gruß,
              naja

      2. Hi there,

        aber ich möchte ungern jedes Feld einzeln aufzählen (wären an die 100), deshalb wär so eine Lösung mit einem array wie es in der Senden-Funktion steht, schon besser...

        Dann musst Du, einen existierenden primary-index vorausgesetzt, REPLACE INTO tablename etc. verwenden...

      3. Naja,

        aber ich möchte ungern jedes Feld einzeln aufzählen (wären an die 100), deshalb wär so eine Lösung mit einem array wie es in der Senden-Funktion steht, schon besser...

        der ebenso supergefährliche wie sträflich ungesicherte Code für das INSERT-Statement wird dynamisch zusammengeschustert, an diesem könntest Du Dich orientieren. Besser wäre es, diese Funktion neu zu erstellen.

        Beim UPDATE musst Du halt die Syntax des UPDATE-Statements hinbekommen, die durchaus einfacher ist als die des INSERT-Statements (abgesehen von der WHERE-Klausel).

        Kontextwechsel sind offensichtlich dem Codeersteller völlig fremd.

        Es wäre eine gute Idee, sich in eine Framework wie Symfony einzuarbeiten, das einem die Routinearbeiten wie das Ermöglichen von RUDI-Operationen (Read, Update, Delete, Insert - auch als CRUD bekannt) abnimmt.

        Freundliche Grüße

        Vinzenz

        1. Beim UPDATE musst Du halt die Syntax des UPDATE-Statements hinbekommen, die durchaus einfacher ist als die des INSERT-Statements (abgesehen von der WHERE-Klausel).

          Die SET-Variante der Syntax existiert in MySQL sowohl bei UPDATE alsauch INSERT - was soll da einfacher oder komplizierter sein?

          1. Hallo,

            Beim UPDATE musst Du halt die Syntax des UPDATE-Statements hinbekommen, die durchaus einfacher ist als die des INSERT-Statements (abgesehen von der WHERE-Klausel).
            Die SET-Variante der Syntax existiert in MySQL sowohl bei UPDATE alsauch INSERT - was soll da einfacher oder komplizierter sein?

            ergänze einfach: als die verwendete ...

            Freundliche Grüße

            Vinzenz

    2. WICHTIG !

      was ich vergessen habe zu erwähnen:

      die Syntax lautet UPDATE table_name SET feld1=wert1,feld2=wert2, feld3=wert3 usw usf...

      Die Bedingung muss natürlich mit und vor allem eindeutig sein, ohne Bedingung wird die ganze Tabelle mit den gleichen Werten upgedatet, also muss es heissen:

      UPDATE table_name SET feld1=wert1,feld2=wert2, feld3=wert3... WHERE bedingung

      alternativ kannst Du auch den INSERT-Befehl durch REPLACE ersetzen, dann ist die Syntax die vom INSERT, das funktioniert allerdings logischerweise nur, wenn Deine Table einen PRIMARY-Index verwendet...