associare un bottone per ogni riga di una tabella

  • Creatore Discussione Creatore Discussione pape86
  • Data di inizio Data di inizio

pape86

Nuovo Utente
15 Gen 2010
19
0
0
Ciao a tutti!
ho un problema, ho creato una tabella che mostra i post di un blog del sito che sto sviluppando andando a recuperare le informazioni dal database: in particolare, le varie colonne sono: autore - titolo - anteprima - data - cancella.
Per quest'ultima colonna, vorrei associare un bottone "elimina" ad ogni riga della tabella (quindi ad ogni post presente nel db) in modo da poter poi eliminare il post dal database.
Adesso, per creare la tabella con i relativi dati e pulsanti non ho problemi, vi posto il codice:

HTML:
<table align="center" width="800" class="tab">
<caption><div align="center" class="caption">News</div><br></caption>
<tr><th width="150">AUTORE</th><th width="150">TITOLO</th><th width="250">ANTEPRIMA</th><th width="100">DATA</th><th width="100">ELIMINA</th></tr>
<form action="prova_form.php" method="post">
PHP:
<?php
while($post_array = mysql_fetch_array($post_sql, MYSQL_ASSOC)) {
  echo "<tr><td align='center'>" .$post_array['autore_post'] ."</td>";	// colonna autore post
  echo "<td align='center'>" .$post_array['titolo_post'] ."</td>";	// colonna titolo post
  $anteprima = $news->preview($post_array['testo_post'], 20);
  echo "<td align='center'>" .$anteprima ."</td>";	// colonna testo post
  $data_post = $news->format_data($post_array['data_post']);
  echo "<td align='center'>" .$data_post ."</td>";	// colonna data post
  $post_id = $post_array['id_post'];
  echo "<td align=\"center\"><input name=\"".$post_id."\" type=\"image\" src=\"image\\cancella.gif\" onClick=\"return(confirm('Cancellare?'))\"></input></td></tr>";	// bottone per eliminare news
}
echo "</table></form><p></p>";
?>

Il problema è che non so gestire i bottoni. Ho pensato di chiamare ogni bottone con l'identificativo del post (name='id_post') in modo poi da verificare quale variabile GET o POST è stata passata e creare la query per l'eliminazione del corrispondente post.
Però quando vado a fare il controllo sulla pagina di destinazione del form (ad esempio prova_form.php):
PHP:
if(isset($_POST['???'])) {
  $id_post=$_POST['??'];
  // query per eliminare il post
}

come faccio a sapere qual è l'id_post che è stato passato cliccando sul relativo pulsante?

Spero di essermi spiegato bene...non riesco a venirne fuori e sono giorni che ci penso e provo varie soluzioni.
Se qualcuno può aiutarmi, anche proponendo vie alternative gliene sarei grato! :)
 
Ciao pape86,
nella <input> devi specificare l'associazione chiave-valore, dove chiave
sara poi la chiave della array $_POST['chiave'] = valore. Quindi
utlizza l'attributo name per specificare la chiave ed in piu aggiungi l'attributo value --> $post_id. Magari come chiave scegli 'id':
PHP:
echo "<td align=\"center\">
<input name=\""id"\" value=\"".$post_id."\" type=\"image\" src=\"image\\cancella.gif\" onClick=\"return(confirm('Cancellare?'))\"></input>
In questo modo potrai automaticamente accedere post_id che devi cancellare:
PHP:
if(isset($_POST['id'])) {
  $id_post=$_POST['id'];
  // query per eliminare il post
}
 
ciao! grazi per la risposta intanto!
allora, anch'io avevo pensato a questo..è proprio quello che mi serve, una coppia chiave/valore (di cui mi serve sapere il nome della chiave e mi posso ricavare il valore).
Però ho letto su una guida di html che per il tag <input> non c'è l'attributo "value" e quindi non sapevo come fare. Comunque ho provato ugualmente così, magari è sbagliata la guida, ma non va ancora.
Questo il codice e di seguito il risultato del browser:
PHP:
echo "<td align=\"center\"><form action='prova_form.php' method='post'><input name=\"id\" value=\"".$id_post."\" type=\"image\" alt=\"cancella\" src=\"image\\cancella.gif\" align=\"center\"></input></form></td>";	// bottone per eliminare news

su prova_form.php:
PHP:
<?php
	print_r($_POST);
	echo "<br>" . $_POST;
	echo "<br>" . $_POST['id'];
?>

e mi visualizza:
"Array ( )
Array
Notice: Undefined index: id in [...]"

Quindi, a questo punto, penso che ci sia un problema con il bottone, o meglio con la funzione JavaScript legata all'evento onclick..è possibile?
Io vorrei che prima di cancellare la news venisse richesta la conferma, appunto con la funzione "confirm" (o con una personalizzata).

PS: altro dubbio, il tag <form action='prova_form.php' method='post'> è meglio che lo metto prima del tag <table> (quindi solo una volta che vale per tutta la tabella) o posso lasciarlo così, cioè un form per ogni bottone?
 
risolto!!! non so se correttamente e se c'era una via più semplice, ma funziona!
posto il codice:
PHP:
echo "<td align=\"center\"><form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\"><input name=\"id_canc\" type=\"image\" alt=\"cancella\" src=\"image\\cancella.gif\" align=\"center\" onClick=\"return(confirm('Cancellare?'))\"></input><input name=\"cancella\" type=\"hidden\" value=\"".$id_post."\"></input></form></td>";

in pratica per ogni riga della tabella creo un form con all'interno due tag input, il primo per creare il bottone di tipo immagine da cliccare, il secondo di tipo nascosto per passare la coppia chiave/valore tramite metodo POST.

Dopodichè, eseguo il controllo per verificare quale id_post è stato passato e cancellare la relativa news dal db, così:
PHP:
if(isset($_POST['cancella']) && is_numeric($_POST['cancella'])) {
  $id_post=$_POST['cancella'];
  // query per eliminare news con id_post
}
 
ciao,

guarda a che ne so io se nella stessa pagina hai più di un form ogni form deve avere un name diverso (ma posso sbagliarmi)

sì, ma dal momento che i miei form corrispondono a dei bottoni, che una volta cliccatoci attiva quell'unico form a cui corrisponde, non mi serve che abbia un nome univoco, l'importante è il valore che passa.
Poi posso anche sbagliarmi, e so benissimo che non sarà una soluzione concettualmente corretta, però è l'unica che ho trovato finora..quindi nell'attesa di essere smentito da qualcuno o di trovare un'idea migliore, mi accontento! ;)
 
ciao
perchè non provi a fare una cosa del genere,
utilizzando un radiobutton per selezionare il post che vuoi eliminare e poi dai l'invio, così ti trovi un unico form

PHP:
<?php
//dati connessione ecc..
if(isset(S_POST['Submit']) && isset($_POST['da_canc']){
	$id_da_cancellare=$_POST['da_canc'];//leggo l'id del post da cancellare
	//query per eliminare
}//fine if
//ecc...........
?>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<table width="100%"  border="0" cellspacing="2" cellpadding="0">
<?php
while($post_array = mysql_fetch_array($post_sql, MYSQL_ASSOC)) {
  echo "<tr>";
    echo "<td>".$post_array['titolo_post']."</td>";
    echo "<td><input name=\"da_canc\" type=\"radio\" value=\"".$post_array['id_post']."\"></td>";
  echo "</tr>";
}//fine while
?>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="Submit" value="cancella"></td>
  </tr>
</table>
</form>

p.s.
non ho messo il controllo js ed ho semplificato la parte visibile in quanto solo un esempio
 
Mi sembra strano che i form devono avere nomi univoci, perché l'attributo name nel tag form è stato deprecato con XHTML 1.0 Transitional. Di solito una cosa non viene deprecata se sanno che è di fondamentale importanza per il funzionamento di alcune applicazioni.
 
Ciao
Non so se è stato deprecato, da quello che capisco se non si usa name conviene usare id, vedi link qui sotto (per facilitarti ho copiato quanto indicato)

http://www.diodati.org/w3c/html401/interact/forms.html#h-17.3

name = cdata [CI]
Questo attributo dà un nome all'elemento, in modo che vi si possa far riferimento da fogli di stile o da script. Nota. Questo attributo è stato incluso per ragioni di compatibilità all'indietro. Le applicazioni dovrebbero usare l'attributo id per identificare degli elementi.
 
Mi sembra strano che i form devono avere nomi univoci, perché l'attributo name nel tag form è stato deprecato con XHTML 1.0 Transitional. Di solito una cosa non viene deprecata se sanno che è di fondamentale importanza per il funzionamento di alcune applicazioni.

Infatti non ho assegnato nessun attributo "name" al tag <form>...forse borgo italia si riferiva al "name" che va assegnato al tag <input> relativo al form...
Comunque, l'unico problema che vorrei capire è se è una procedura corretta utilizzare tanti form quanti sono il numero delle righe della tabella, oppure se c'è un modo per usarne uno unico. In ogni caso, il tag <input> va associato ad ogni riga della tabella.
 
ciao
perchè non provi a fare una cosa del genere,
utilizzando un radiobutton per selezionare il post che vuoi eliminare e poi dai l'invio, così ti trovi un unico form

PHP:
<?php
//dati connessione ecc..
if(isset(S_POST['Submit']) && isset($_POST['da_canc']){
	$id_da_cancellare=$_POST['da_canc'];//leggo l'id del post da cancellare
	//query per eliminare
}//fine if
//ecc...........
?>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<table width="100%"  border="0" cellspacing="2" cellpadding="0">
<?php
while($post_array = mysql_fetch_array($post_sql, MYSQL_ASSOC)) {
  echo "<tr>";
    echo "<td>".$post_array['titolo_post']."</td>";
    echo "<td><input name=\"da_canc\" type=\"radio\" value=\"".$post_array['id_post']."\"></td>";
  echo "</tr>";
}//fine while
?>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="Submit" value="cancella"></td>
  </tr>
</table>
</form>

p.s.
non ho messo il controllo js ed ho semplificato la parte visibile in quanto solo un esempio

Ah, ho capito la tua idea e ho provato a vedere come viene..in effetti così sarebbe più semplice dal punto di vista del codice, però mi piaceva di più "esteticamente" come vorrei fare io...ti posto un'immagine..
postzx.jpg


comunque la terrò in considerazione nel caso in cui dovessi rinunciare alla mia prima idea! grazie! :fonzie:
 
ciao
no mi riferivo proprio a name del tag form.

...se è una procedura corretta utilizzare tanti form ...
nel post precedente ti ho suggerito un metodo per usare un <form...></form> unico.
è un sistema che uso io (forse non il più migliore), ma nei casi in cui sono solo io ad operare mi sembra abbastanza semplice,se invece può essee un utente deve essere migliorato con altri controlli (non basta js), l'operazione di cancellazione è sempre un'operazione che abbisogna (secondo me) di conferma.


p.s.
poi metterci anche il pulsante di reset se (capita) hai sbaliato a selezionare quello che vuoi cancellare
 
ciao
non avevo visto la tua risposta (ci siamo incrociati).
verifica se anche i radiobutton accettano un immagine, cioè se il button può essere type="radio" e quindi con l'src...
 
nel post precedente ti ho suggerito un metodo per usare un <form...></form> unico.
sì, lo visto solo dopo quel post, scusa...infatti, se leggi il mio post precedente l'ho commentato! :)

è un sistema che uso io (forse non il più migliore), ma nei casi in cui sono solo io ad operare mi sembra abbastanza semplice,se invece può essee un utente deve essere migliorato con altri controlli (non basta js), l'operazione di cancellazione è sempre un'operazione che abbisogna (secondo me) di conferma.

p.s.
poi metterci anche il pulsante di reset se (capita) hai sbaliato a selezionare quello che vuoi cancellare

per come è concepito, dovrebbe usarlo solo l'amministratore del sito, trattandosi di un'area per gestire (e quindi anche cancellare) le news. Il controllo JS lo metto in ogni caso..è questo: onclick="return(confirm('Cancellare?'))" che apre un pop-up in cui si può deve premere ok oppure annulla, quindi il reset non mi serve in questo caso (c'è l'annulla).
 
ciao
non avevo visto la tua risposta (ci siamo incrociati).
verifica se anche i radiobutton accettano un immagine, cioè se il button può essere type="radio" e quindi con l'src...

ahahah...che incroci! :D
mi sa che non si può associare un'immagine a un tag <input> di tipo "radio"..l'immagine puoi metterla solo con <input type="image" ...>
 
avrei trovato una soluzione alternativa, che mi evita di usare form o input vari...in pratica simulo un bottone, con un link di un'immagine (nell'attributo href del link passo, tramite metodo get, il valore dell'id_post che mi serve)...il codice lo spiega meglio che a parole:

PHP:
echo "<td align='center'><a href=\"".$_SERVER['PHP_SELF']."?id_canc=".$id_post."\" onClick='return(confirm('Cancellare la news?'))'><img src='image\\cancella.gif'></a></td>";

e il controllo diventa:
PHP:
if(isset($_GET['id_canc']) && is_numeric($_GET['id_canc'])) {
  $id_post=$_GET['id_canc'];
  // query per cancellare la news
}

Dal punto di vista html/php funziona, il problema è sulla funzione JavaScript: dal momento che vorrei che una volta cliccato sull'immagine, mi compaia una finestrella pop-up con la richiesta "cancellare?" -> 'ok' o 'annulla' ho inserito nel tag <a> la funzione onClick='return(confirm('Cancellare la news?'))' ma se mi viene visualizzato un "errore nella visualizzazione della pagina" e la variabile viene passata correttamente, ma il pop-up non compare. Qualcuno mi sa dire perchè?
Potrebbe andare come soluzione, invece di usare tutti quei form input?
 
ciao,
in questo modo non devi utilizzare alcun <form>....</form>,
però dovresti fare due pagine

PHP:
<table width="100%"  border="0" cellspacing="2" cellpadding="0"> 
<?php
//dati connessione ecc..
while($post_array = mysql_fetch_array($post_sql, MYSQL_ASSOC)) { 
  echo "<tr>"; 
    echo "<td>".$post_array['titolo_post']."</td>"; 
	echo "<td><a href=\"pag_elimina.php?id=".$post_array['id_post']."\"><img src=\"immagine_cestino.jpg\" border=\"0\"></a></td>" 
  echo "</tr>"; 
}//fine while 
?> 
</table> 

poi nella pag_elimina.php
<?php
$id_da_cancellare=$_GET['id'];
//connessione al db e query di elimazione
//e ritorno automatico alla pagina di selezione o altra
?>
evidentemente con tutti i controlli del caso
 
ciao, ho dimenticato

echo "<td><a href=\"pag_elimina.php?id=".$post_array['id_post']."\" onclick=\"return(confirm('sei sicuro di cancellare'))\"><img src=\"immagine_cestino.jpg\" border=\"0\"></a></td>"
 
...
però dovresti fare due pagine...

Beh, non necessariamente...posso fare anche tutto nella stessa pagina, così:
PHP:
echo "<td align='center'><a onClick=\"return(confirm('Cancellare la news?'))\" href=\"".$_SERVER['PHP_SELF']."?id_canc=".$id_post."\"><img src='image\\cancella.gif'></a></td>";

visto che la varibile $_SERVER['PHP_SELF'] mi restituisce l'indirizzo della pagina corrente (quello della tabella) a cui allego dopo il punto interrogativo l'id da cancellare (tutto adesso tramite metodo get).
Ho verificato e funziona tutto! il problema di JavaScript che dicevo prima l'ho risolto, era un banale errore di sintassi (avevo messo ' invece di \").
Bene, così mi sono liberato di tutti i form e input vari e ho snellito il tutto!!! :cool:

bene, si può passare ad altro...grazie mille per tutto l'aiuto, le dritte, il supporto che mi hai dato!!! :beer:
 

Discussioni simili