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
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
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
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
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
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: