Autor Zpráva
ludvalb
Profil
Ahoj, narazil jsem na problém kdy mám obsah na webu nekorektní s daty načítanými z databáze.

Jde o to, že mám formulář, kterým přepisuji pomocí php data v mysql databázi.
Když provedu změnu pomocí formuláře vše se provede správně (v databázi jsou správná data), ale v prohlížeči po opětovném načtení webu vidím stále data před úpravou.
pokud použiju v chromu ctrl + shirt + R pak konečně vidím korektní data.

Nevěděl by jste někdo jak toto vyřešit? Zkoušel jsem různé prohlížeče jak na WIN tak MAC a všude se mi to chová stejně.

Děkuji.
Ikki
Profil
Po odeslání obnov stránku prostřednictvím redirectu.
Kajman
Profil
+ zakažte na stránce s formulářem cachování
ludvalb
Profil
Dekuji. Muzete me prosim poradit jak na to?
Kajman
Profil
Ukaže kód, kterým generujete formulář a kterým ho zpracováváte, možná tam bude stačit malá změna.
ludvalb
Profil
Formulář je zde:
kosik.php
<?php
include "db.php";
?>


<!DOCTYPE html>
<html>
<head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="utf-8">
    <meta http-equiv="Cache-control" content="public">

    <title></title>
</head>

<body>
        <div class="container" id="contact" name="contact">
            <div class="row">
                                <table border="1px">
                                    <tr>
                                        <th style="text-align:center; margin:10px; padding:10px;">Typ</th>
                                        <th style="text-align:center; margin:10px; padding:10px;">Velikost</th>
                                        <th style="text-align:center; margin:10px; padding:10px;">ID-kod</th>
                                        <th style="text-align:center; margin:10px; padding:10px;">Počet</th>
                                        <th style="text-align:center; margin:10px; padding:10px;">Smazat</th>
                                    </tr>


                                <?php
                                        
                                $ip_adresa=$_SERVER['REMOTE_ADDR'];

                                $query = "SELECT * from kosik WHERE IP='".$ip_adresa."'";
                                $result = mysql_query($query, $connection) or die(mysql_error());                           


                                    for ($i = 0;$i<  mysql_num_rows($result);$i++) {
                                    $cookieid = mysql_result($result, $i, "cookieid");
                                    $pocet = mysql_result($result, $i, "pocet");                                   
                                    $velikost = mysql_result($result, $i, "velikost");
                                    $typ = mysql_result($result, $i, "typ");


                                   echo '<tr>
                                       <td style="text-align:center; margin:10px; padding:10px;">'.$typ.'</td>
                                       <td style="text-align:center; margin:10px; padding:10px;">'.$velikost.'</td>
                                       <td style="text-align:center; margin:10px; padding:10px;">'.$cookieid.'</td>
                                       <td style="text-align:center; margin:10px; padding:10px;">
                                           <form action="update-kosik.php" method="POST">
                                              <input type="text" name="pocet" value="'.$pocet.'"><br>
                                            <input type="hidden" name="id" value="'.$cookieid.'">
                                              <input type="submit" name="submit" value="Upravit">
                                           </form>
                                        </td>
                                       <td style="text-align:center; margin:10px; padding:10px;"><a href="delete-kosik.php?id='.$cookieid.'" onclick="javascript:return confirm(\'Opravdu chcete smazat?\')">Smazat</a></td>
                                   </tr>'; 

                                    }

                                ?>

                                </table> 
    
            </div><!-- row -->
        </div><!-- container -->    
</body>
</html>

zde je update:
update-kosik.php
<?php

include "db.php";
$pocet = $_POST["pocet"];
$cookieid = $_POST["id"];

$query = 'UPDATE `kosik` SET `pocet`='.$pocet.' WHERE cookieid="'.$cookieid.'"';
mysql_query($query, $connection) or die(mysql_error());

 
?>
<script>
location.replace("kosik.php");
</script>

a zde je smazaní:
delete-kosik.php
<?php 


include "db.php";
  $id = $_GET["id"];
  
  $query = 'DELETE from kosik WHERE cookieid="'.$id.'"';
  $result = mysql_query($query, $connection) or die(mysql_error());
  

?>
<script>
location.replace("kosik.php");
</script>
Kajman
Profil
V kosik.php odstraňte povolení cachování tvořeného řádkem
<meta http-equiv="Cache-control" content="public">

Navíc můžete dát na začátek skriptu (např. před include) naopak zakázání cachování
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


V update-kosik.php a v delete-kosik.php přidejte za volání query přesměrovací http hlavičku (doménu si upravte)

header('Location: https://www.example.com/kosik.php');
exit;


Edit: a pozor, dotazy jsou náchylné na sql injection, jednoduše lze smazat košík všem uživatelům, či upravit ceny za nula korun
ludvalb
Profil
Kajman:
Děkuji velmi za pomoc, sql injection budu teprve řešit. (musím nastudovat jak na to).
Keeehi
Profil
ludvalb:
Děkuji velmi za pomoc, sql injection budu teprve řešit. (musím nastudovat jak na to).
Nejlepší je použít nějaký framework který se o bezpečnost stará sám, automaticky. Pak by se nemělo stát, že někde zapomeneš něco ošetřit.
ludvalb
Profil
Keeehi:
Diky za info, mel by jsi nejake odkazy kde je to hezky vysvetleno, popsano?
Kajman
Profil
Např.
www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
doc.nette.org/cs/3.0/database

A místo
SELECT * from kosik WHERE IP='$ip_adresa'
používejte raději session, protože stejnou IP může mít spousta různých uživatelů.
ludvalb
Profil
Děkuji všem za informace a pomoc.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0