Announcement

Collapse
No announcement yet.

Problem mit "Update"

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit "Update"

    Hi,
    ich habe mit dem folgenden Codeschnipsel Probleme:

    In einem Script lasse ich verschiedene editierbare Einträge mit einer Checkbox ausgeben

    PHP Code:
       <?php
                
    require('mysql.php');
            
    $sqlselect_search"SELECT * FROM xyz ORDER BY `name` ASC";    
            if(!
    $res_id mysql_query($sqlselect_search)){
            die(
    mysql_error());
            }
            
    $id_string 0;
            while(
    $search=mysql_fetch_array($res_id)){
            echo 
    '<tr>
            <td><input type="checkbox" name="wert_'
    .$id_string.'" id="wert_'.$id_string.'" value="'.$search['id'].'"></td>
              <td>'
    .$search['typus'].'</td>
              <td><strong>'
    .$search['name'].'</strong></td>
              <td>'
    .$search['vorname'].'</td>
              <td>'
    .$search['karten'].'</td>
            </tr>'
    ;
            
    $id_string $id_string 1;
            }    
        
    ?>
    Nun werden das machmal etwa 30 Stk. und dann möchte ich die Einträge, sofern das, was ich verändere, bei mehreren gleich ist, mit der Checkbox auswählen und dann mit dem anderen Script...

    PHP Code:
    <?php
        
    require('mysql.php');
        
    $sql_rows "SELECT distinct email FROM `xyz`";
        
    $erg_rows mysql_query($sql_rows);
        
    $num_rows mysql_num_rows($erg_rows); 
            
        if(!(
    $_POST['button']==null)){
        echo 
    'Markiert wurde...:';
        echo 
    '<ul>';
            for(
    $a=0$a<=$num_rows$a++){
            
    $id_a 'wert_'.$a;
                if(!(
    $_POST[$id_a]==null)){            
                            
                require(
    'mysql.php');
                
    $sqlselect_search_List_id_a"SELECT * FROM xyz WHERE `id`='".$_POST[$id_a]."'";    
                if(!
    $res_id_List_id_a mysql_query($sqlselect_search_List_id_a)){
                die(
    mysql_error());
                }
                while(
    $search_List_id_a=mysql_fetch_array($res_id_List_id_a)){
                echo 
    '<li>'.$search_List_id_a['name'].', '.$search_List_id_a['vorname'].'</li>';
                }            
                
                require (
    'mysql.php');
                
    mysql_query("UPDATE `xyz` SET `karten`='2' WHERE `id`='".$_POST[$id_a]."'") or die(mysql_error());
                }
            }
        echo 
    '</ul>';
        }
    ... updaten doch hier ist das Problem. Von ausgewählt 30 Leuten werden dann nur ein paar Elemente bearbeitet und ein paar bleiben auf der Strecke, d.h. das diese nicht verändert werden.

    Wieso

    Ich bin es mehrfach durchgegangen und ich habe keinen Fehler gefunden.

    Danke für Antworten.
    PHP Code:
    <?php
    echo 'http://acs-it-worx.de/';
    echo 
    'http://www.youtube.com/user/ACSITWorx/'// mein YouTube Kanal
    echo '-----------------------------------------------------------------';
    echo 
    'http://www.autoservice-asberg.de/';
    ?>

  • #2
    Hallo,

    irgendwie erscheint mir dein Vorgehen sehr ... ähm ... unlogisch.

    Zuerstmal sollte man NIE Variablen die von außen belegt werden können (also $_POST, $_GET, $_COOKIE, etc.) ungeprüft und unmaskiert in einen SQL-String einbauen! Stichwort: SQL-Injektion.
    Desweiteren frage ich mich warum es ein mehrfaches require für mysql.php gibt?

    Und was letzten Endes wahrscheinlich dein Problem ist - warum vergleichst du Äpfel mit Birnen?
    Dein Ausgabescript gibt das Ergebnis von "SELECT * FROM xyz ORDER BY `name` ASC" aus und numeriert die Einträge von 0 bis rowcount - 1. Du hast also eine Anzahl X an möglichen Änderungen.
    Dein Updatescript läuft über eine Schleife von "SELECT distinct email FROM `xyz`" und verwendet dafür einen Counter von 0 - rowcount (also schonmal einer zuviel). Dies ist dann eine Anzahl Y, die nicht mit Anzahl X zu tun hat. Dieser Counter wird als Index verwendet um deine Änderungen in die DB zu schreiben. Aber in welchem Bezug steht "SELECT distinct email FROM `xyz`" zu "SELECT * FROM xyz ORDER BY `name` ASC"? Nach meiner Meinung in Keinem! Dein Update erfolgt völlig willkürlich anhand der Anzahl der "email"-Abfrage.
    Und ganz nebenbei ist es natürlich Resourcenverschwendung die gesamte DB zu durchforsten um dann nur einige wenige Updates zu machen, anstatt gezielt nur die Updates durchzuführen die auch gefordert sind.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hi Falk Prüfer,

      Danke für die Hilfe.

      Besonders dein Satz...
      Dein Updatescript läuft über eine Schleife von "SELECT distinct email FROM `xyz`" und verwendet dafür einen Counter von 0 - rowcount (also schonmal einer zuviel).
      ... hat mich auf die Einstellung "distinct `email`" aufmerksam gemacht, die ich immer übersehen habe. Der zählt da zuwenig durch. Er soll alle Checkboxen mit der for- Schleife durchgehen und dann testen, ob die aktiviert sind, oder nicht. "mysql_num_rows" soll nur die Zahl geben, die ich für das Durchzählen brauche. Deswegen auch...
      PHP Code:
       if(!($_POST[$id_a]==null)){ 
      Nun schein es zu klappen. Mal sehen, wann der nächste Fehler auftritt. Das passiert ja des Öfteren.

      Zu Deiner anderen Frage:
      Desweiteren frage ich mich warum es ein mehrfaches require für mysql.php gibt?
      Meinst Du, dass es reicht, wenn man das an den Anfang des Codes setzt und dann das z.B. 3fache Wiederholen lässt? Hab ich mir auch gedacht, dann hat das Script mir allerdings immer Fehler ausgespuckt (in der Vergangenheit) und dann hatte ich mir angewöhnt, dass öfter einzusetztn. Diese Fehler könnten allerdings auch Fehler im Code gewesen sein, da allerdings das Script "mysql.php" nur eine Verbindung zu der DB herstellt und mir sonst keine Scherereien macht, kann ich das öfters verweden.

      Zu der SQL-Injektion:
      Schon vorher auf einen anderen Thread habe ich den Tipp bekommen, doch SQL-Injektion zu benutzen, aber ich hatte noch keine Zeit, mich darum zu kümmern. Werde es aber demnächst machen, wenn ich Zeit finde.
      Zuletzt editiert von creator90; 13.05.2009, 16:10.
      PHP Code:
      <?php
      echo 'http://acs-it-worx.de/';
      echo 
      'http://www.youtube.com/user/ACSITWorx/'// mein YouTube Kanal
      echo '-----------------------------------------------------------------';
      echo 
      'http://www.autoservice-asberg.de/';
      ?>

      Comment

      Working...
      X