Autor | Zpráva | ||
---|---|---|---|
Fastman Profil |
Zdravím,
Chtěl bych se zeptat, jak se dá smazat odkaz s pomocí GET? Vím, že existuje pro MySQL "DELETE". Proto bych to napsal nějak takhle. Smazání záznamu. $User=$_GET['User']; $sql="DELETE FROM ftpd WHERE User='$User'"; $result=mysql_query($sql); if($result){ echo "Úspěšně smazaný záznam"; } Výpis z databáze do tabulky <?php require_once('../db3.php'); ?> <?php mysql_select_db($database_ctbans, $ctbans); $query_ctbans = "SELECT User, Dir FROM ftpd"; $ctbans = mysql_query($query_ctbans, $ctbans) or die(mysql_error()); $row_ctbans = mysql_fetch_assoc($ctbans); $totalRows_ctbans = mysql_num_rows($ctbans); ?> <center> <table border="1"cellpadding="4"cellspacing="4" <tr> <td>FTP účet</td> <td>FTP cesta</td> <td>Smazat</td> <?php do{?> <tr> <td><?php echo $row_ctbans['User'];?></td> <td><?php echo $row_ctbans['Dir'];?></td> <td><?php echo $jmeno=$_GET['User'];?><a href="?id=">Smazat</a></td> </tr> <?php }while($row_ctbans=mysql_fetch_assoc($ctbans));?> </center> </div> </body> </html> <?php mysql_free_result($ctbans); ?> Z databáze to vše vypíše, akorát nefunguje příkaz na smazání. Děkuji Vám za odpovědi. |
||
abc Profil |
#2 · Zasláno: 21. 5. 2014, 19:39:14
Jestli to dobře chápu, tak ř. 23:
<td><?php echo $jmeno=$_GET['User'];?><a href="?user=<?php echo $jmeno;?>">Smazat</a></td> |
||
Fisir Profil |
#3 · Zasláno: 21. 5. 2014, 19:44:03
Prosím, escapovat (a to i v URL) a příště se vyhnout používání
mysql_* funkcí.
|
||
Fastman Profil |
Děkuji za odpověď a reaguji na abc
Momentálně to dopíše za .php?user= , ale za "=" chybí hodnota. Kde by mohla být chyba? <?php require_once('../db3.php'); ?> <?php mysql_select_db($database_ctbans, $ctbans); $query_ctbans = "SELECT User, Dir FROM ftpd"; $ctbans = mysql_query($query_ctbans, $ctbans) or die(mysql_error()); $row_ctbans = mysql_fetch_assoc($ctbans); $totalRows_ctbans = mysql_num_rows($ctbans); $jmeno=$_GET['User']; $sql2="DELETE FROM ftpd WHERE User='$jmeno'"; $result=mysql_query($sql2); if($result){ echo "Úspěšně smazaný záznam"; } ?> <center> <table border="1"cellpadding="4"cellspacing="4" <tr> <td>FTP účet</td> <td>FTP cesta</td> <td>Smazat</td> <?php do{?> <tr> <td><?php echo $row_ctbans['User'];?></td> <td><?php echo $row_ctbans['Dir'];?></td> <td><?php echo $jmeno=$_GET['User'];?><a href="?id=">Smazat</a></td> </tr> <?php }while($row_ctbans=mysql_fetch_assoc($ctbans));?> </center> </div> </body> </html> <?php mysql_free_result($ctbans); ?> |
||
abc Profil |
#5 · Zasláno: 21. 5. 2014, 20:33:35
Pardon, mělo by tam být
$row_ctbans['User'] místo $jmeno
|
||
Fastman Profil |
abc:
Děkuji, již to píše za "=" daný název, ale je divné, že když se objevím na stránce, tak to vypisuje "Úspěšně smazaný záznam" (přitom jsem nestiskl smazat). Záznam se bohužel nesmaže. <?php require_once('../db3.php'); ?> <?php mysql_select_db($database_ctbans, $ctbans); $query_ctbans = "SELECT User, Dir FROM ftpd"; $ctbans = mysql_query($query_ctbans, $ctbans) or die(mysql_error()); $row_ctbans = mysql_fetch_assoc($ctbans); $totalRows_ctbans = mysql_num_rows($ctbans); $jmeno=$_GET['User']; $sql="DELETE FROM ftpd WHERE User='$jmeno'"; $result=mysql_query($sql); if($result){ echo "Úspěšně smazaný záznam"; } ?> <center> <table border="1"cellpadding="4"cellspacing="4" <tr> <td>FTP účet</td> <td>FTP cesta</td> <td>Smazat</td> <?php do{?> <tr> <td><?php echo $row_ctbans['User'];?></td> <td><?php echo $row_ctbans['Dir'];?></td> <td><?php echo $jmeno=$_GET['User'];?><a href="?user=<?php echo $row_ctbans['User'];?>">Smazat</a></td> </tr> <?php }while($row_ctbans=mysql_fetch_assoc($ctbans));?> </center> </div> </body> </html> <?php mysql_free_result($ctbans); ?> Tak jsem upravil řádek u smazání záznamu $sql="DELETE FROM ftpd WHERE User=".$row_ctbans['User'].""; a už to nevypisuje, že se záznam úspěšně smazal, ale ani to záznam nesmaže. Opravil jsem si: $jmeno=$row_ctbans['User']; $jmeno=$row_ctbans['User']; $sql2="DELETE FROM ftpd WHERE User='$jmeno'"; $result=mysql_query($sql2); if($result){ echo "Úspěšně smazaný záznam"; } else { echo "ERROR"; } ?> Tím to tedy smaže záznamy, ale problém je, že to furt píše "Úspěšně smazaný záznam". Nevíte prosím, jak upravit tuhle podmínku správně? Aby to ukázalo jenom při smazání. |
||
abc Profil |
#7 · Zasláno: 21. 5. 2014, 21:20:59
Tak ještě jednou a s mnoha dalšími úpravami, poznámky vepsány do kódu:
<?php require_once('../db3.php'); //toto by asi mohlo být už v db3.php mysql_select_db($database_ctbans, $ctbans); //nejdříve smazat $jmeno = mysql_real_escape_string($_GET['user']); $sql = "DELETE FROM ftpd WHERE User='$jmeno'"; //vypiš si SQL pro kontrolu, potom smaž echo $sql; $result = mysql_query($sql); if ($result) { echo "Úspěšně smazaný záznam"; } //až potom zobrazit, už bez smazaného záznamu $query_ctbans = "SELECT User, Dir FROM ftpd"; $ctbans = mysql_query($query_ctbans, $ctbans) or die(mysql_error()); $row_ctbans = mysql_fetch_assoc($ctbans); //pokud se nepoužívá, tak je zbytečné $totalRows_ctbans = mysql_num_rows($ctbans); ?> <center> <table border="1"cellpadding="4"cellspacing="4" <tr> <td>FTP účet</td> <td>FTP cesta</td> <td>Smazat</td> <?php while ($row_ctbans = mysql_fetch_assoc($ctbans)) { ?> <tr> <td><?php echo $row_ctbans['User']; ?></td> <td><?php echo $row_ctbans['Dir']; ?></td> <td><?php echo $jmeno = $_GET['user']; //tohle nevim, proč tu je? ?><a href="?user=<?php echo urlencode($row_ctbans['user']); ?>">Smazat</a></td> </tr> <?php } ?> </center> </div> </body> </html> <?php //zbytečné, smazat mysql_free_result($ctbans); ?> |
||
juriad Profil |
For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.
Samotný dotaz proběhne v pořádku, přičemž nezávisí na tom, zda záznam před pokusem o smazání existoval nebo ne. „Smaž záznamy, které mají jméno 'XXX'“, lze chápat: „zajisti, aby již žádný záznam s jménem 'XXX' neexistoval“. Což v případě neexistence takového záznamu před spuštěním dotazu neznamená, že dotaz má selhat; prostě nic neudělá. Chceš-li zjistit, zda byl záznam odstraněn, zeptej se na počet ovlivněných řádků. Use mysql_num_rows() to find out how many rows were returned for a SELECT statement or mysql_affected_rows() to find out how many rows were affected by a DELETE, INSERT, REPLACE, or UPDATE statement. Citace z dokumentace mysql_query. |
||
Fastman Profil |
#9 · Zasláno: 21. 5. 2014, 21:41:40
abc:
Ano tohle také funguje, akorát jsem ve vašem kódu musel opravit $row_ctbans['user']) na $row_ctbans['User']). Bohužel to furt nevyřešilo můj předchozí problém. Neustále se vypisuje, že Úspěšně smazaný záznam. Přitom jsem ještě ani nestiskl Smazat. Nevíte, kde by mohla být u tohohle chyba? Děkuji za odpovědi. |
||
juriad Profil |
Fastman:
Obvykle chceš mazání řešit jiným skriptem než vypisování. Tedy něco jako: vypis.php: foreach (SELECT * FROM tabulka) as $radek: # pro všechny řádky v tabulce <a href="smazat.php=$radek['id']">Smazat</a> # vypíše odkaz ke smazání smazat.php: DELETE FROM tabulka WHERE id = $_GET['id'] # smaže záznam header('Location: vypis.php'); # a okamžitě přesměruje zpět na výpis Toto schéma má dvě výhody: 1) Jednotlivé akce jsou oddělené 2) Po smazání nezůstane v URL id smazaného záznamu. |
||
Jan Tvrdík Profil |
#11 · Zasláno: 22. 5. 2014, 06:46:55
Považuji za slušnost podotknout, že takhle implementované mazání je náchylné na CSRF zranitelnost. Správně by se tam měl přidat ještě bezpečnostní token.
|
||
juriad Profil |
#12 · Zasláno: 22. 5. 2014, 10:09:58
Určitě by se mělo kontrolovat přihlášení a oprávnění uživatele. Jestli si předávat token je otázkou; často stačí slabší podmínka, totiž povolit vymazání jen takové verze záznamu, která je zobrazená (vyhnutí se mid-air collision; token = verze).
Generování náhodného tokenu má tu nevýhodu, že manipulace s tabulkou fungují jen jednomu uživateli a jen v jednom tabu, což může mít vliv na použitelnost. Ano, lze generovat/spravovat tokeny nějak inteligentněji, ale pak může být problém s jejich množstvím nebo naopak nedostatečnou sílou ochrany. |
||
Časová prodleva: 10 let
|
0