2013-01-23 11 views
12

Voglio eliminare più righe dal database MYSQL. Ho creato questo file delete.php per selezionare vari collegamenti ed eliminarli usando le caselle di controllo.Elimina più righe selezionando le caselle di controllo usando PHP

<html> 
<head> 

<title>Links Page</title> 

</head> 

<body> 

<h2>Choose and delete selected links.</h2> 

<?php 

$dbc = mysqli_connect('localhost','root','admin','sample') 
or die('Error connecting to MySQL server'); 

$query = "select * from links ORDER BY link_id"; 

$result = mysqli_query($dbc,$query) 
or die('Error querying database'); 

$count=mysqli_num_rows($result); 
?> 

<table width="400" border="0" cellspacing="1" cellpadding="0"> 
<tr> 
<td><form name="form1" method="post" action=""> 
<table width="400" border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC"> 
<tr> 
<td bgcolor="#FFFFFF">&nbsp;</td> 
<td colspan="3" bgcolor="#FFFFFF"><strong>Delete multiple links</strong> </td> 
</tr> 
<tr> 
<td align="center" bgcolor="#FFFFFF">#</td> 
<td align="center" bgcolor="#FFFFFF"><strong>Link ID</strong></td> 
<td align="center" bgcolor="#FFFFFF"><strong>Link Name</strong></td> 
<td align="center" bgcolor="#FFFFFF"><strong>Link URL</strong></td> 
</tr> 

<?php 

while ($row=mysqli_fetch_array($result)) { 
?> 

<tr> 
<td align="center" bgcolor="#FFFFFF"><input name="checkbox" type="checkbox" value="<?php echo $row['link_id']; ?>"></td> 
<td bgcolor="#FFFFFF"><?php echo $row['link_id']; ?></td> 
<td bgcolor="#FFFFFF"><?php echo $row['link_name']; ?></td> 
<td bgcolor="#FFFFFF"><?php echo $row['link_url']; ?></td> 
</tr> 

<?php 
} 
?> 

<tr> 
<td colspan="4" align="center" bgcolor="#FFFFFF"><input name="delete" type="submit" value="Delete"></td> 
</tr> 
<table width="400" border="0" cellspacing="1" cellpadding="0"> 
<tr> 
<td><form name="form1" method="post" action=""> 
<table width="400" border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC"> 
<tr> 
<td bgcolor="#FFFFFF">&nbsp;</td> 
<td colspan="3" bgcolor="#FFFFFF"><strong>Delete multiple links</strong> </td> 
</tr> 
<tr> 
<td align="center" bgcolor="#FFFFFF">#</td> 
<td align="center" bgcolor="#FFFFFF"><strong>Link ID</strong></td> 
<td align="center" bgcolor="#FFFFFF"><strong>Link Name</strong></td> 
<td align="center" bgcolor="#FFFFFF"><strong>Link URL</strong></td> 
</tr> 

<?php 

while ($row=mysqli_fetch_array($result)) { 
?> 

<tr> 
<td align="center" bgcolor="#FFFFFF"><input name="checkbox" type="checkbox" value="<?php echo $row['link_id']; ?>"></td> 
<td bgcolor="#FFFFFF"><?php echo $row['link_id']; ?></td> 
<td bgcolor="#FFFFFF"><?php echo $row['link_name']; ?></td> 
<td bgcolor="#FFFFFF"><?php echo $row['link_url']; ?></td> 
</tr> 

<?php 
} 
?> 

<tr> 
<td colspan="4" align="center" bgcolor="#FFFFFF"><input name="delete" type="submit" value="Delete"></td> 
</tr> 



<?php 

// Check if delete button active, start this 

if(isset($_POST['delete'])) 
{ 
    $checkbox = $_POST['checkbox']; 

for($i=0;$i<count($checkbox);$i++){ 

$del_id = $checkbox[$i]; 
$sql = "DELETE FROM links WHERE link_id='$del_id'"; 
$result = mysqli_query($sql); 
} 
// if successful redirect to delete_multiple.php 
if($result){ 
echo "<meta http-equiv=\"refresh\" content=\"0;URL=view_links.php\">"; 
} 
} 

mysqli_close($dbc); 

?> 

</table> 
</form> 
</td> 
</tr> 
</table> 

</body> 

</html> 

Questo non sembra cancellare alcuna riga. I miei dati sono popolati nella tabella. Immagino che il problema sia con il codice PHP. Per favore aiutami qui.

+0

Sono completamente nuovo di programmazione in PHP. Potete per favore fatemi sapere su uno strumento PHP di debug gratuito? – spyder

+1

attiva la segnalazione degli errori e impara a leggere i messaggi. – tradyblix

+0

Prova anche a spostare l'ultima porzione PHP (isset ($ _ POST ['delete'])) prima dei tag HTML per assicurarti che nessuno dei dati venga ripristinato quando la pagina viene inviata. Potrebbe anche essere d'aiuto usare i tag form: '

' –

risposta

9

si dovrebbe trattare come un array come questo,

<input name="checkbox[]" type="checkbox" value="<?php echo $row['link_id']; ?>"> 

Solo allora, si può prendere il suo numero e loop per l'eliminazione.

È inoltre necessario passare la connessione al database alla query.

$result = mysqli_query($dbc, $sql); 

Distinti non lo ha incluso:

$result = mysqli_query($sql); 
+0

cambiato da name = " checkbox "to name =" checkbox [] ".... ancora, non cancellando alcun dato – spyder

+0

metti echo per la tua query di eliminazione per vedere se i dati $ del_id arrivano perfettamente. Se il valore $ del_id è perfetto, esegui la query nel tuo editor mysql. verrai a sapere se qualche errore nel lato database –

+0

@spyder Il motivo per cui non è stato eliminato dopo che Edwin ha pubblicato la sua risposta è che, non hai mai passato la connessione db a '$ result = mysqli_query ($ sql);'. Che dovrebbe avere letto come '$ result = mysqli_query ($ dbc, $ sql);'. @ Edwin: ho fatto la modifica. –

12

Usa notazione di matrice come name="checkbox[]" nel vostro elemento input. Questo ti darà $_POST['checkbox'] come array. Nella query è possibile utilizzarlo come

$sql = "DELETE FROM links WHERE link_id in "; 
$sql.= "('".implode("','",array_values($_POST['checkbox']))."')"; 

Questa è una singola query per eliminarli tutti.

Nota: avete bisogno di sfuggire i valori passati in $_POST['checkbox'] con mysql_real_escape_string o simili per evitare SQL Injection.

1

Qualcosa che a volte affiora si può/maynot essere a conoscenza di

non sarà sempre raccolto da da $ _POST [ 'cancella'] quando si utilizza IE. Firefox e Chrome dovrebbero funzionare bene però. Io uso un isntead separato che risolve il problema per IE

Per quanto riguarda la cancellazione del codice qui sopra, sembra che stiate facendo eco a due insiemi di caselle di controllo che tirano entrambi gli stessi dati? Questo è solo un errore di copia + incolla o è in realtà come è il tuo codice?

Se il suo codice è il problema, l'utente potrebbe spuntare un elemento della casella di controllo, ma l'altro verrà deselezionato, quindi il codice php per l'eliminazione si confonderà. Rinominare la seconda casella di controllo o eliminare quel blocco di html sicuramente non è necessario visualizzare la stessa lista due volte?

+0

voglio che il modulo visualizzi l'id come una colonna separata ... inoltre, ho bisogno delle caselle di controllo per collegarmi alla chiave primaria, che è di nuovo la colonna link_id..thus, gli stessi dati per entrambe le colonne – spyder

+0

erm perché no tutto in un'unica tabella in un singolo ciclo non c'è bisogno letteralmente di ripetere due volte lo stesso set di dati, poiché in realtà si stanno visualizzando informazioni identiche in entrambi in base al proprio codice. – Dave

+0

ho rimosso un set di dati/colonna :) – spyder

3
<?php $sql = "SELECT * FROM guest_book"; 
          $res = mysql_query($sql); 
          if (mysql_num_rows($res)) { 
          $query = mysql_query("SELECT * FROM guest_book ORDER BY id"); 
          $i=1; 
          while($row = mysql_fetch_assoc($query)){ 
          ?> 


<input type="checkbox" name="checkboxstatus[<?php echo $i; ?>]" value="<?php echo $row['id']; ?>" /> 

<?php $i++; }} ?> 


<input type="submit" value="Delete" name="Delete" /> 

if($_REQUEST['Delete'] != '') 
{ 
    if(!empty($_REQUEST['checkboxstatus'])) { 
     $checked_values = $_REQUEST['checkboxstatus']; 
     foreach($checked_values as $val) { 
      $sqldel = "DELETE from guest_book WHERE id = '$val'"; 
      mysql_query($sqldel); 

     } 
    } 
} 
4

Elimina casella multipla usando PHP Codice

<input type="checkbox" name="chkbox[] value=".$row[0]."/> 
<input type="submit" name="delete" value="delete"/> 
<?php 
if(isset($_POST['delete'])) 
{ 
$cnt=array(); 
$cnt=count($_POST['chkbox']); 
for($i=0;$i<$cnt;$i++) 
    { 
    $del_id=$_POST['chkbox'][$i]; 
    $query="delete from $tablename where Id=".$del_id; 
    mysql_query($query); 
    } 
} 
0
$deleted = $_POST['checkbox']; 
$sql = "DELETE FROM $tbl_name WHERE id IN (".implode(",", $deleted) . ")";