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:
Die MySQL-Anweisung sieht dagegen jedoch fehlerhaft aus:
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.
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.
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
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',
);
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',
);
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'
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'
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>
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']);
?>
Schließlich möchte ich mich an dieser Stelle für eure Zeit und Aufmerksamkeit herzlich bedanken.
Beste Grüße,
peefonic
Kommentar