| 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ýpisToto 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: 12 let
|
|||
0