eliminare record da db attraverso link

asevenx

Utente Attivo
7 Nov 2009
312
0
16
salve, vorrei permettere l'eliminazione dal mio guestbook di determinati record tramite un apposito link (ovvero accanto al messaggio vorrei inserire un bottone per eliminare il messaggio). So che per fare questo devo usare una quary con DELATE ma non so come impostarla, qualcuno può aiutarmi?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
l'eliminazione di un record è semplice
PHP:
<?php
//....
$rq=mysql_query("DELETE FROM tabella WHERE id='$id_da_eliminare'");
//...
?>
però trattandosi di eliminazione devi fare vari controlli anche per vedere su l'utente è autorizzato
poi se passi il valore da un link è ancora più pericoloso in quanto usi il GET che è visibile
quindi stai attento a quello che fai
 

asevenx

Utente Attivo
7 Nov 2009
312
0
16
ti ringrazio per la risposta, mi sono letto un po di cose su internet sul metodo get, ma non capisco una cosa.
Allora ho inserito la mia img con il seguente codice
HTML:
<a href='img/elimina?id=$id.php'>
dopo di che ho creato un file elimina.php che dovrebbe riportare la variabile GET così $id_elimina = $_GET['id'];

ma quando vado a cliccare mi dice che il file (es: elimina?id=318.php). Che devo fare?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
secondo me hai invertito php (non avevo visto alex mi ha preceduto)

PHP:
<a href='img/elimina.php?id=$id'>
due cose
1. ho visto che l'ai racchiuso tra i tag html, guarda che quel link deve essere in una pag. php
2. ti ribadisco stai attento perche passando sul link si vede (es.)
cosa succede se mi faccio un piccolo script che cicla un numero e richiama la tua pagina?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
oltre alla verifica dei permessi, si può verificare la pag di provenienza dove è posto il link (mettiamo che si chiami lincaggi.php)

PHP:
$proviene=basename($_SERVER['HTTP_REFERER']);
if($proviene=="lincaggi.php"){
	//fai tutto quello che devi fare
}else{
	
	header("location:pagina_che_vuoi.php");
}
questo evita che uno possa accedere con l'url che ho detto prima
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
@alex
sistema sicuro al 100x100 non esiste, lo so (guarda che colossi riescono a akerare), ma tutto quello che può servire non fa mai male.
se uno stupidotto (che non conosce i sistemi sofisticati o meno) scrive sul bw l'url con un id cancella il record, valutando la provenienza qualcosa si evita.

p.s.
se qualcuno akera il mio sito so a chi rivolgermi :mavieni:
 

asevenx

Utente Attivo
7 Nov 2009
312
0
16
secondo voi può bastare un sistema di riconoscimento tramite password (magari inserita in un db) per rendere sicura l'eliminazione?

PS: cmq il link funziona, quindi l'errore era proprio quello, ma l'eliminazione non funziona, date un occhiata

PHP:
<form name='pass' method='post' action='#'>
	<table cellspacing='0' cellpadding='0'>
		<tr>
			<td class='box1'>Password: </td>										
			<td class='box' colspan="2"><input name='pass' type="password"></textarea></td>
		</tr>                       
		<tr>									
			<td colspan = "3" class='bottoni'>
				<input type='submit' name='invia' value='Conferma'>
				<input type='reset' name='annulla' value='Cancella'>
			</td>
		</tr>
	</table>	
</form>
<?php

$pass = $_POST['pass'];		
$id_elimina = $_GET['id'];

if ($pass == '') {
	echo "Per cancellare il seguente messaggio devi inserire la password di versifica";

	} else {
		if ($pass == 'password') {

//dati database
$host = "...";
$username = "...";
$password = "";
$database = "...";
$tabella = "forum";

//connessione e invio al DB
$connessione = mysql_connect($host, $username, $password) or die("Connessione DB fallita");
mysql_select_db($database, $connessione) or die("Selezione DB fallita");

//visualizza tutti i record nel DB
$elimina = mysql_query("DELETE FROM tabella WHERE id='$id_elimina' LIMIT 1");
		echo "Messaggio cancellato correttamente!";	
		
		} else {
		
		echo "Password errata!";	
		}
	}
?>
 
Ultima modifica:

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Io ti consiglierei di sostituire questa riga:
PHP:
$elimina = mysql_query("DELETE FROM tabella WHERE id='$id_elimina' LIMIT 1");
con questa:
PHP:
$elimina = mysql_query("DELETE FROM tabella WHERE id=".$id_elimina." LIMIT 1");
E, come dice Borgo, potresti togliere anche il LIMIT visto che l'ID deve essere chiava primaria quindi univoca nella tabella.

P.S.
Se ancora non funge prova ad inserire il codice SQL in una variabile e, invece di eseguirla, prova a stamparla e il risultato mettilo direttamente nel database che segnala più chiaramente gli errori nel caso in cui ce ne fossero ancora.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
come ha detto giustamente longo, verifica separando la query
PHP:
<?php
//.....
$qstringa="DELETE FROM tabella WHERE id='$id_elimina'";
var_dump($qstringa);
$elimina = mysql_query($qstringa);
var_dump($elimina);
//......
?>
il primo var_dump (ipotesi hai cliccato sul link con id == 2, se è tutto giusto ti riporta
string (32) "DELETE FROM tabella WHERE id='2'"
se invece
string (31) "DELETE FROM tabella WHERE id=''"
con molta probabilità non trasmetti/ricevi il $_GET
se tutto giusto, ma il secondo var_dump ti restituisce
bool (FALSE)
verifica i dati di connessione e la corrispondenza del nome della tabella
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Secondo me il problema potrebbe essere nel nome della tabella

PHP:
$elimina = mysql_query("DELETE FROM tabella WHERE id='$id_elimina' LIMIT 1");

visto che dichiari una variabile $tabella = 'forum'

dovrai metter FROM $tabella o a limite FROM forum
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
la sintassi del delete è
Codice:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nome_tabella
[WHERE condizioni]
[ORDER BY ...]
[LIMIT numero_righe]
l'asterisco non c'entra.
se non elimina c'è un errore o nel nome della tabella o nel where, il limit, credo in questo caso, non serve in quanto l'id dovrebbe essere univoco