Ankündigung

Einklappen
Keine Ankündigung bisher.

Mehrere Datensätze updaten, die zuvor durch Checkboxen ausgewählt wurden.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrere Datensätze updaten, die zuvor durch Checkboxen ausgewählt wurden.

    Werte Programmiererinnen und Programmierer,

    im folgenden Skript wähle ich Datensätze per Checkbox aus, die ich zuvor aus der MySQL-Datenbank eingelesen habe. Mit einem Klick auf den Button "Ausgewählte Datensätze bearbeiten" (den ich per CSS zu einem Link umgewandelt habe), erscheint ein Listen-Formular mit den ausgewählten Datensätzen, wo ich die bisherigen (änderbaren) Datenbestände verändern "kann". Diese gliedern sich in E-Mail, Name sowie Firma. Bis hierhin klappt es.

    Wenn ich die Zeichenketten in den Formularfeldern verändert habe und die Checkboxen neben den Zeilen aktiviert habe, klicke ich also auf "Änderungen durchführen".

    Mit POST werden die veränderten Datensätze richtig weitergegeben:

    $_POST =
    array (
    'foo' =>
    array (
    0 => '',
    1 => '',
    2 => '',
    ),
    'id' => '12',
    'email' =>
    array (
    10 => 'test1',
    11 => 'test2',
    12 => 'test3',
    ),
    'name' =>
    array (
    10 => 'test',
    11 => 'testblabla',
    12 => 'test',
    ),
    'firma' =>
    array (
    10 => 'test77',
    11 => 'test',
    12 => 'tester',
    ),
    'datum' =>
    array (
    10 => '2008-10-19 01:33:04',
    11 => '2008-10-19 01:33:13',
    12 => '2008-10-19 01:33:20',
    ),
    'bearbeitet' => 'Änderungen durchführen',
    );
    Die MySQL-Anweisung sieht dagegen jedoch fehlerhaft aus:

    UPDATE serienmailer SET email='Array', name='Array', firma='Array'
    WHERE ID='12'UPDATE serienmailer SET email='Array', name='Array',
    firma='Array' WHERE ID='12'UPDATE serienmailer SET email='Array',
    name='Array', firma='Array' WHERE ID='12'
    Zudem wird nur der letzte übergebene Datensatz verändert. Vermutlich liegt es daran,
    dass alle Feldernamen gleich sind und sich gegenseitig überschreiben. Ich habe es
    mit Arrays versucht, doch das bescheerte mir nur diesen fehlerhaften MySQL-Befehl.

    Nun folgt der Code aus dem Skript "installation.php", welcher die Ausgabe der Daten-
    sätze und das Formular zum Ändern der Daten beinhaltet. Dem wahrscheinlich interessantesten Teil habe ich einen Kommentar vorangestellt.

    PHP-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    <html> 
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link href="style.css" rel="stylesheet" type="text/css" />
    <meta http-equiv="Content-Script-Type" content="text/javascript"> 

    <script type="text/javascript">
        function checkall(checkname,thestate){
            var el_collection = document.getElementsByName(checkname)
            for (c=0;c<el_collection.length;c++)
                el_collection[c].checked=thestate
        }
    </script>

    </head>
    <body>
    <?

    include ('mysql.inc.php');
    $connection = mysql_connect($con['host'],$con['uid'],$con['pwd']);
    mysql_select_db($con['db']);
    $con['db'] = $db;
    $table = "serienmailer";

    if(mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$table."'"))==1) {
    }else{  
    $sql = mysql_query("CREATE TABLE IF NOT EXISTS serienmailer ( 
                        id INT(255) NOT NULL auto_increment,
                        email varchar(60) NOT NULL,
                        name varchar(60) NULL,
                        firma varchar(60) NULL,
                        TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
                        PRIMARY KEY (id) );");
        
        if(mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$table."'"))==1) { echo "Die Tabelle konnte erfolgreich erstellt werden.";
            }else{ echo "Der MySQL-Server konnte nicht erreicht werden. Die Zugangsdaten sind möglichweise fehlerhaft."; 

        }

    }

    ?>

    <form action="<? echo htmlentities($_SERVER['PHP_SELF']); ?>" enctype="multipart/form-data" method="post" name="config" id="config">
    <table>
    <? if (!isset ($_REQUEST['hinzufuegen'])) {?>
      <tr>
        <th>Auswahl</th>
        <th>ID</th>
        <th>E-Mail</th>
        <th>Name</th>
        <th>Firma</th>
        <th>Datum des Eintrags</th>
      </tr>
    <?}?>
    <?

    // In nachfolgener erstellt PHP eine Liste aller ausgewählten Datensätze
    if (isset ($_REQUEST['bearbeiten'])) {

    $sql = 'SELECT id,email,name,firma,datum from serienmailer where id IN ("'.implode('", "', $_POST['foo']).'")';
    $ergebnis_two = mysql_query($sql);

        while ($row = mysql_fetch_assoc($ergebnis_two)) {?>
    <tr>
        <td><input type="checkbox" name="foo[]" value="<?echo $row->id;?>"></td>
        <td><?echo $row['id'];?></td>
        <input type="hidden" name="id" value="<?echo $row['id'];?>">
        <td><input class="unimportant" name="email[<?echo $row['id'];?>];" type="text" size="30" value="<?echo $row['email'];?>"></td>
        <td><input class="unimportant" name="name[<?echo $row['id'];?>]" type="text" size="30" value="<?echo $row['name'];?>"></td>
        <td><input class="unimportant" name="firma[<?echo $row['id'];?>]" type="text" size="30" value="<?echo $row['firma'];?>"></td>
        <td><input class="unimportant" name="datum[<?echo $row['id'];?>]" type="text" size="30" value="<?echo $row['datum'];?>"></td>
      </tr>
        <?}?> 
    <tr>
        <th><a href="#" onclick="checkall('foo[]',true)">Alle auswählen</a></th>
        <th><a href="#" onclick="checkall('foo[]',false)">Auswahl entfernen</a></th>
        <th><input type="submit" name="bearbeitet" value="Änderungen durchführen" class="link_important" /></th>
        <th><input type="submit" name="hinzufuegen" value="Datensätze hinzufügen" class="link" /></th>
        <th><input type="submit" name="loeschen" value="Ausgewählte Datensätze löschen" class="link" /></th>
      </tr>  
    <?}
    //echo mysql_errno() . ": " . mysql_error(). "\n";

    // Nachfolgend werden die Daten an das Skript übergeben, welches den MySQL-Query enthält:

    if (isset ($_REQUEST['bearbeitet'])) {
    include ('update.php');
    }

    if (isset ($_REQUEST['hinzufuegen'])) {

    ?>
      <tr>
        <th>email</th>
        <th>name</th>
        <th>firma</th>
      </tr>
    <tr>
        <td><input class="unimportant" name="email" type="text" size="30" value=""></td>
        <td><input class="unimportant" name="name" type="text" size="30" value=""></td>
        <td><input class="unimportant" name="firma" type="text" size="30" value=""></td>
      </tr>
    <tr>
        <th><a href="#" onclick="checkall('foo[]',true)">Alle auswählen</a></th>
        <th><a href="#" onclick="checkall('foo[]',false)">Auswahl entfernen</a></th>
        <th><input type="submit" name="bearbeitet" value="Änderungen durchführen" class="link_important" /></th>
        <th><input type="submit" name="hinzugefuegt" value="Datensätze hinzufügen" class="link" /></th>
        <th><input type="submit" name="loeschen" value="Ausgewählte Datensätze löschen" class="link" /></th>
      </tr>  

    <?}

    if (isset ($_POST['hinzugefuegt'])) {
    include ('update.php');
    }

    if (!isset ($_REQUEST['bearbeiten']) && !isset ($_REQUEST['hinzufuegen'])) {

    $abfrage = "SELECT id,email,name,firma,datum FROM serienmailer";
    $ergebnis = mysql_query($abfrage);

    while($row = mysql_fetch_object($ergebnis))
        {?>
      <tr>
        <td><input type="checkbox" name="foo[]" value="<?echo $row->id;?>"></td>
        <td><?echo $row->id;?></td>
        <td><?echo $row->email;?></td>
        <td><?echo $row->name;?></td>
        <td><?echo $row->firma;?></td>
        <td><?echo $row->datum;?></td>
      </tr>

    <?}?>
    <tr>
        <th><a href="#" onclick="checkall('foo[]',true)">Alle auswählen</a></th>
        <th><a href="#" onclick="checkall('foo[]',false)">Auswahl entfernen</a></th>
        <th><input type="submit" name="bearbeiten" value="Ausgewählte Datensätze bearbeiten" class="link" /></th>
        <th><input type="submit" name="hinzufuegen" value="Datensätze hinzufügen" class="link" /></th>
        <th><input type="submit" name="loeschen" value="Ausgewählte Datensätze löschen" class="link" /></th>
      </tr>
    <?}
    var_dump($_POST);
    ?>
    </table>
    </form>
    </body>
    </HTML>
    Nun folgt das Skript "update.php" mit der Foreach-Schleife, welche die Datensätze abändern "soll". Weil dieses Skript in das vorhergehende included ist, geht der PHP-Zeiger am Schluss in "installation.php" über. Auch hierbei habe ich vor der wichtigsten Stelle einen Kommentar gesetzt.

    PHP-Code:
    <?
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE); // evtl. hilfreich


    function printGlobals()
    {
        $globals = array( 'POST',
                          'GET',
                          'SESSION',
                          'COOKIE',
                          'SERVER',
                          'REQUEST',
                          'ENV',
                          'FILES',
                        );
                       
        foreach($globals as $name)
        {
          if(isset($GLOBALS["_$name"]))
          {
            echo "<strong>\$_$name = </strong><br />";
            echo '<pre>';
            var_export($GLOBALS["_$name"]);
            echo ';</pre><br />';
          }
        }
    }

    // testcode
    printGlobals();
    //$id=$row['id']; 
    $TABLENAME="serienmailer";

    // Nachfolgend die Schleife, die den benötigten SQL-Query durchführt
    if (isset ($_POST['bearbeitet'])) {
    foreach($_POST['foo'] as $_POST['foo_two'])
    {
      $update = "UPDATE $TABLENAME SET email='$email', name='$name', firma='$firma' WHERE ID='$_POST[id]'";  
      $change = mysql_query($update) or die(mysql_error());
    echo $update;
    }
    }

    if (isset ($_POST['hinzugefuegt'])) {
    $add = "INSERT INTO $TABLENAME (email, name, firma) VALUES ('$_POST[email]', '$_POST[name]', '$_POST[firma]')";
    $new = mysql_query($add) or die(mysql_error());
    }

    /* $datum = date('d.m.y');

     
    /*Die Folgende MySQL-Eingabe ist performant, da Sie die Werte "in einem Ruck" in
    die DB einträgt. $db ist durch ein mysqli zustande gekommen und die Werte sind escaped -
    daher gegen MySQl-Injections geschützt. 

    $params = array(
        'email'                   => $_POST['email'],
        'name'               => $_POST['name'],
        'firma'                  => $_POST['firma']
    );

    //Diese Schleife schützt vor SQL-Injections:

    foreach ($params as &$value) {
        $value = "'" . $db->real_escape_string($value) . "'";
    }

    $sql = sprintf(
               "UPDATE `schriftsteller` SET ( %s ) VALUES ( %s )",
               implode(', ', array_keys($params)),
               implode(', ', array_values($params))
    );


    $db->query($sql);
    echo mysql_errno() . ": " . mysql_error(). "\n";
    echo $sql;*/
    var_dump($_POST['email']);
    ?>
    Mit der Arbeit an jenen Skripten habe ich etliche Stunden verbracht, gegoogelt, Bücher gewälzt, im IRC gefragt und alsdann gelesen, gelesen, gelesen. Hoffe hier findet sich jemand, der mehr Erfahrung als ich hat und mir sozusagen ehrenamtlich hilft.

    Schließlich möchte ich mich an dieser Stelle für eure Zeit und Aufmerksamkeit herzlich bedanken.

    Beste Grüße,
    peefonic
    Ich bedanke mich für eure Zeit und Aufmerksamkeit - beste Grüße, netzor


  • #2
    schreib mal deine mysql anweisung

    Kommentar


    • #3
      Hier ist der Schnippsel:

      PHP-Code:
      if (isset ($_POST['bearbeitet'])) {
      foreach(
      $_POST['foo'] as $_POST['foo_two'])
      {
        
      $update "UPDATE $TABLENAME SET email='$email', name='$name', firma='$firma' WHERE ID='$_POST[id]'";  
        
      $change mysql_query($update) or die(mysql_error());
      echo 
      $update;
      }

      Oben ist der gesamte Code.
      Ich bedanke mich für eure Zeit und Aufmerksamkeit - beste Grüße, netzor

      Kommentar


      • #4
        Zitat von peefonic Beitrag anzeigen
        Hier ist der Schnippsel:

        PHP-Code:
        if (isset ($_POST['bearbeitet'])) {
        foreach(
        $_POST['foo'] as $_POST['foo_two'])
        {
          
        $update "UPDATE $TABLENAME SET email='$email', name='$name', firma='$firma' WHERE ID='$_POST[id]'";  
          
        $change mysql_query($update) or die(mysql_error());
        echo 
        $update;
        }

        Oben ist der gesamte Code.

        Ich weiß nicht, ob das Thema noch aktuell ist, aber auch falls das nicht der Fall sein sollte, hilft es vielleicht anderen noch.

        Ich habe den Verdacht, dass es daran liegen könnte, dass du die Felder, mit Variablen befüllst, die du nie über die POST-Methode geholt hast ($email, $name, $firma). Versuchs mal, wie bei der id mit $_POST['email'], ...

        Lg Andi
        Zwei Dinge sind unendlich - das Universum und die Dummheit der Menschen. Beim Universum bin ich mir allerdings noch nicht sicher.
        - Albert Einstein

        Kommentar


        • #5
          Das problem liegt daran, dass er auf das Array als solches zugreift. Sprich, die Variable $email ist ein Array. Und wenn die dann in einen String umgewandelt wird/ in einen solchen eingebaut wird, wird daraus der Text "Array", wie im Beispiel oben zu sehen.
          Sprich, er hätte irgenwie $email[blabla] nutzen sollen.

          Achja: Willkommen im Forum. Und bitte keine Leichenschändung. Wenn jemand ein ähnliches Problem haben sollte, kann er das Thema ggf. selbst hochholen oder neu posten.
          www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
          Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih

          Kommentar

          Lädt...
          X