php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.10.2008, 14:58  
Neuer Benutzer
 
Benutzerbild von peefonic
 
Registriert seit: 20.07.2008
Beiträge: 7
peefonic befindet sich auf einem aufstrebenden Ast
peefonic eine Nachricht über ICQ schicken
Standard 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:

Zitat:
$_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:

Zitat:
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
peefonic ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.10.2008, 16:20  
Benutzer
 
Registriert seit: 07.10.2008
Beiträge: 72
amateur_php befindet sich auf einem aufstrebenden Ast
Standard

schreib mal deine mysql anweisung
amateur_php ist offline  
Alt 19.10.2008, 22:40  
Neuer Benutzer
 
Benutzerbild von peefonic
 
Registriert seit: 20.07.2008
Beiträge: 7
peefonic befindet sich auf einem aufstrebenden Ast
peefonic eine Nachricht über ICQ schicken
Standard

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
peefonic ist offline  
Alt 21.09.2009, 20:21  
Neuer Benutzer
 
Registriert seit: 21.09.2009
Beiträge: 1
PHP-Kenntnisse:
Anfänger
andreas87 befindet sich auf einem aufstrebenden Ast
andreas87 eine Nachricht über ICQ schicken
Standard

Zitat:
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
andreas87 ist offline  
Alt 22.09.2009, 11:23  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 4.651
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblickmepeisen ist ein Lichtblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

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.
__________________
Entwickler aus Leidenschaft und ein Zahnrad in einem der größten Java-Projekte der Welt.
mepeisen ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Datensätze löschen nach Auswahl aus Formular (checkboxen) asyoulikeit Datenbanken 3 13.06.2008 15:56
Mehrere Datensätze in Datenbank updaten PHP-Fortgeschrittene 9 23.10.2005 11:04
[Erledigt] Mehrere Datensätze in Datenbank updaten PHP Tipps 2005-2 4 23.10.2005 10:44
checkboxen wizzardxx PHP Tipps 2005-2 7 16.10.2005 22:58
db updaten per textfeld (mehrere datensätze gleichzeitig) php-newbie83 PHP Tipps 2004 11 09.08.2004 13:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
neuer kommentar xhtml 1.0 strict, http://www.php.de/php-tipps-2008/48256-mehrere-datensaetze-updaten-die-zuvor-durch-checkboxen-ausgewaehlt-wurden.html, mysql php mehrere daten gleichzeitig ändern, php onclick checkbox session array ändern, mehrere datensätze update php, php alle ausgewählten löschen, mysql mehrere datensätze updaten, allintext:neuer kommentar xhtml 1.0 strict, php mehrere checkboxen updaten, mehrere datensätze updaten mysql, php mehrere checkboxen abfragen, php mehrere datensätze löschen, mysql update mehrere datensätze, php mehrere checkboxen, php mysql datensatz per checkbox ändern, php ,ehrere datensätze checkbox bearbeiten, php update mehrerer einträge, mehrere datensätze auswählen und ändern, php mysql beispiel checkbox datensatz bearbeiten, php ausgewählten datensatz ändern

Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum