löschproblem im Newsscript

WeisserWolf

Grünschnabel
Moin Moin :)

Ich habe ein kleines Problem in meinem Newsscript. Es läuft über eine Datenbank. Mein Input Feld sieht so aus:

PHP:
<?
$abfrage = "SELECT * FROM news"; 
echo mysql_error();
$result = mysql_query($abfrage);
echo mysql_error();
while ($row = mysql_fetch_assoc($result))
	{
    echo "<table width=\"155\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
	<tr>
    <td><input name=\"headline".$row['newsID']."\" type=\"text\" value=\"";
	echo $row['headline'];		   
	echo "\" size=\"50\" maxlength=\"50\"><br>   
	</td>
    <td>&nbsp;</td>
	</tr>
	<tr>
    <td><textarea name=\"news".$row['newsID']."\" cols=\"38\" rows=\"10\">".$row['news']."</textarea><br><br></td>
	<td>
    <center><input type=\"checkbox\" name=\"";
	echo $row['newsID'];
	echo "\" value=\"";
	echo $row['newsID'];
	echo "\"><strong>Löschen?</strong></center>
	</td>
	</tr>
	</table>";    
	}
echo "<input type=\"submit\" name=\"Submit\" value=\"Absenden\">
</form>";
mysql_free_result($result);
mysql_close($verbindung);
?>

Hab die DB Connection mal weggelassen. Nun werden alle meine News angezeigt. Daneben immer eine Checkbox um den Beitrag zu löschen. Zum verarbeiten hab ich den Code:

PHP:
$abfrage = "SELECT * FROM news"; 
echo mysql_error();
$result = mysql_query($abfrage);
echo mysql_error();
while ($row = mysql_fetch_assoc($result))
{

if (isset($_REQUEST[$row['newsID']])) 
	{
	$delabfr ="DELETE FROM `news` WHERE `newsID` = ".$row['newsID'];
	$result = mysql_query($delabfr);
	printf ("Datensätze gelöscht: %d\n", mysql_affected_rows());

	}
}
?>

Wenn ich nun 5 Nachrichten zum Löschen an ticke, und auf submit drücke, wird aber nur eines gelöscht.

Wo liegt mein Denkfehler

Wär echt nett wenn ihr mir helfen könntet, ich verzweifel schon ;)

Danke
Wolf
 
Ganz einfach, der Name des Checkbioxfeldes muss als Array gekennzeichnet werden, da ja mhere Wert möglich sein sollen. Das geschieht in dem man einfach [] an den Namen amnhängt. Der Name für alle Checkboxen bleibt dann aber gleich.
<input type="ceckbox" name="meinname[]">

In deinem Beispiel, um deinen Code auch mal etwas zu verkürzen:
PHP:
 <center><input type=\"checkbox\" name=\"delID\" value=\"$row[newsID]\"><strong>Löschen?</strong></center>

Da <center> veraltet ist solltest du entweder <div align="center"> nehmen oder einfacher, das ganze als Attribut der Tabellenspalte: <td align="center">.

So nun zum PHP-Code. Hier musst du das Array nun auch auslesen. Dies kannst du entweder unperfomant mit einer Schleife lösen und für jedes Element ein Delete Statement abschicken oder das ganze kummulieren und für die WHERE Bedingung im Statement IN() benutzen:

PHP:
if( $_REQUEST['delID'] )
{
  
   $sql = 'DELETE FROM `tabelle` WHERE ID ';
    
   //Wenn mehrere Datensätze ausgewählt wurden
  if( is_array($_REQUEST['delID']) )
           $sql  .= 'IN ('.implode(',', $_REQUEST['delID']).')';

  //bei nur einem Datensatz 
  else
           $sql .= '= '.$_REQUEST['delID'];

   //Statement ausführen
   @mysql_query($sql) or die(mysql_error());
}

Somit hast du in deinem Letzen PHP-Teil gleich das Query gespart mit dem du nur ausliest, vergleichst und dann löschst.
 
Ich hatte den Boxen doch immer ein neuen Namen gegeben,

<center><input type=\"checkbox\" name=\"";
echo $row['newsID'];

Ich versteh das jetzt nicht so ganz

Wolf
 
Das mag sein, müsste rein theroetisch auch funktionieren....
Hab ich übersehen.
Nur ganz ehrlich macht es meines Erachtens keinen Sinn, alle Datensätze
auszulesen, nur um diese zu durchlaufen und dann ggf. Ein DeleteStatement abzusetzen. Zumal dann noch die Ausgabe etwas unsinnig ist. Denn es wird immer nur eine Zeile gelöscht. Ansonsten ist die ID falsch, da sie nicht mehr eindeutig ist....
 
Wenn Du allen Checkboxen den selben Namen gibst, werden die Werte durch ein Komma getrennt in einer Variable übergeben.

Diese Variable kannst Du dann an Hand des Kommas (fungiert quasi als delimiter) auseinanderwurschteln und dementsprechend die Datensätze löschen.

MfG
Hans
 
@Hans: Ich glaube nicht das es so geht. Selbst wenn wäre dieses Splitten umständlicher, als einfach den HTML-Namen durch [] wie ich es im Quelltext stehen hatte als Array zu deklarieren und so auch auszulesen.

EDIT: Nach einem test, es geht so nicht. Es sieht dann bei einer Versendung via GET und dem Feldnamen "a" bei 3 Feldern so aus:
?a=123&a=456&a=789
Da kann kein , bei rauskommen.
 
Zuletzt bearbeitet:
oh ha... :rolleyes:

Das geht ja mit PHP tatsächlich nicht...
Ich benutze diese Art der Chekbox-Übergabe immer in ColdFusion und da gehts so..

naja... dann bitte meinen Beitrag ignorieren ;-)
 
Danke schonmal, aber ich bekomme das immernoch nicht hin. Das ist mir jetzt schon ein bisschen peinlich, aber ich bin halt nicht der Php Profi ;)

Hier noch mal mein Source:

PHP:
<html>
<head><title>AdminPlanel</title></head>
<center>
<form name="news" method="post" action="editingnews.php">
<?

$verbindung = @mysql_connect ("localhost","####","####");
  if (!$verbindung) 
  {
	 die ('Kann die Verbindung nicht herstellen.'.mysql_error());
  }
	if (!mysql_select_db("####")) 
	{
		die ('Kann keine Verbindung zur Datenbank herstellen.'.mysql_error());
	}
	echo mysql_error();
$abfrage = "SELECT * FROM news"; 
echo mysql_error();
$result = mysql_query($abfrage);
echo mysql_error();
while ($row = mysql_fetch_assoc($result))
	{
    echo "<table width=\"155\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
	<tr>
    <td><input name=\"headline".$row['newsID']."\" type=\"text\" value=\"";
	echo $row['headline'];		   
	echo "\" size=\"50\" maxlength=\"50\"><br>   
	</td>
    <td>&nbsp;</td>
	</tr>
	<tr>
    <td><textarea name=\"news".$row['newsID']."\" cols=\"38\" rows=\"10\">".$row['news']."</textarea><br><br></td>
	<td>
	<center><input type=\"checkbox\" name=\"delID\"><strong>Löschen?</strong></center>
	</td>
	</tr>
	</table>";    
	}
echo "<input type=\"submit\" name=\"Submit\" value=\"Absenden\">
</form>";
mysql_free_result($result);
mysql_close($verbindung);
?>


HIer noch mal die Abfrage
PHP:
<html>
<head><title>AdminPlanel</title></head>
<center>
<form name="news" method="post" action="editingnews.php">
<?
$verbindung = @mysql_connect ("localhost","####","####");
  if (!$verbindung) 
  {
	 die ('Kann die Verbindung nicht herstellen.'.mysql_error());
  }
	if (!mysql_select_db("####")) 
	{
		die ('Kann keine Verbindung zur Datenbank herstellen.'.mysql_error());
	}
	echo mysql_error();
$abfrage = "SELECT * FROM news"; 
echo mysql_error();
$result = mysql_query($abfrage);
echo mysql_error();

if( $_REQUEST['delID'] ) 
{ 
   
   $sql = 'DELETE FROM `news` WHERE ID '; 
     
   //Wenn mehrere Datensätze ausgewählt wurden 
  if( is_array($_REQUEST['delID']) ) 
           $sql  .= 'IN ('.implode(',', $_REQUEST['delID']).')'; 

  //bei nur einem Datensatz 
  else 
           $sql .= '= '.$_REQUEST['delID']; 

   //Statement ausführen 
   @mysql_query($sql) or die(mysql_error()); 
}
mysql_close($verbindung);
?>

Vielen Dank
WeisserWolf
 
Das
PHP:
<center><input type=\"checkbox\" name=\"delID\"><strong>Löschen?</strong></center>

musst du in
PHP:
<center><input type=\"checkbox\" name=\"delID[]\"><strong>Löschen?</strong></center>

ändern.
 
Zurück