Autor Zpráva
bazz
Profil
brej den
Mám dotaz mám tabulku ve které připisuju nebo odečítám 1 (líbí/nelíbí)
<a href=?id=".$zaznam['soubor_id'].">Přičti 1</a>

$id = @$_GET["id"];
mysql_query("UPDATE soubory SET hodnoceni = hodnoceni +1 WHERE soubor_id=$id");
exit();
sice to funguje ale při refreshi se mi to přičte znova neznáte nějaký lepší způsob třeba? Taky by bylo super omezit hlasování tzn. 1 IP=1 hlas ale to netuším jak řešit.. Nějaké nápady?
lionel messi
Profil
bazz:
mám tabulku ve které připisuju nebo odečítám 1 (líbí/nelíbí)

Odo mňa máš celkové hodnotenie -2, za zavináč na treťom riadku ti udeľujem prvé mínus -1, za absenciu escapovania ďalšie.

Taky by bylo super omezit hlasování tzn. 1 IP=1 hlas ale to netuším jak řešit.. Nějaké nápady?

Ukladaj si informáciu o tom, či užívateľ už hlasoval do cookie a kontroluj, či je nastavená. Ak áno, hlasovať už nemôže.
Keeehi
Profil
bazz:
1) Rodina funkcí mysql_* je stará a v php 7 už byla odstaněna. Lépe bude používat mysqli_*nebo rovnou nějakou hotovou databázovou vrstbu, která tě od toho odstíní
2) Vkládat do dotazu neoštřený vstup od uživatele je nezpečnostní chyba. Opět ti s tím může pomoct nějaká databázová vrstva.

při refreshi se mi to přičte znova neznáte nějaký lepší způsob třeba
Přesměruj na stránku bez parametru header('Location: stranka.php');

Taky by bylo super omezit hlasování tzn. 1 IP=1
Proti zkušeným uživatelům tě to sejně neochrání, ale budiž. Cookies se dají smazat, IP změnit. Pokud bys chtěl IP, musel by sis vytvořit další tabulku, do které by jsi ukládal id souboru a IP uživatele. IP je v PHP dostupná pod $_SERVER['REMOTE_ADDR']*.

* při ukládání pamatuj, že existují IPv6 adresy - vytvoř dostatečně velký sloupec
bazz
Profil
nemusí to být zrovna omezení podle IP adresy ale tak nějak mi to přišlo nejlepší. Jo a nebude to hodnocení českého slavíka takže si nemyslím že by byla potřeba to nějak nabourávat.
Vytvořím tabulku s IPnou a s ID souborem a při hlassování se tyto dvě donoty zapíší na jeden řádek
takže bych před hlasováním měl asi ověřit zda v té tabulce je řádek kde IP & ID existují současně pokud ano nepovolit... takhle nějak?
Zavináč odstraněn :-) nebyl tam třeba jen mě rozčilovala chybová hláška a něchtělo se mi to zrovna řešit v tu chvíli.
Keeehi
Profil
bazz:
takže bych před hlasováním měl asi ověřit zda v té tabulce je řádek kde IP & ID existují současně pokud ano nepovolit... takhle nějak?
Přesně tak.

Jo a nebude to hodnocení českého slavíka takže si nemyslím že by byla potřeba to nějak nabourávat.
To možná ne, ovšem je snad důvod, proč tam nechávat bezpečnostní díru?
Jen tak mimochodem, myslím že bych byl s takovým kódem schopný vypsat kompletní obsah databáze. Což asi nebyl tvůj záměr, že?
bazz
Profil
díry tam samozřejmě nechci. Databázi dělám poprve takže jestli máte nějaké nápady jak to vylepšit budu rád za nápady a nasměrování správným směrem..
Lonanek
Profil
bazz:
díry tam samozřejmě nechci
Pro ošetření v tomto případě postačuje:
$id = (int)$_GET["id"];
mysqli_query($link, "UPDATE soubory SET hodnoceni = hodnoceni +1 WHERE soubor_id=$id"); 
exit();
Pokud by se jednalo o textový řetězec, pak použijte funkci mysqli_real_escape_string()
mimochodec
Profil
bazz:
Vytvořím tabulku s IPnou a s ID souborem a při hlassování se tyto dvě donoty zapíší na jeden řádek
takže bych před hlasováním měl asi ověřit zda v té tabulce je řádek kde IP & ID existují současně pokud ano nepovolit... takhle nějak?

Co myslíš tím ID souborem?
bazz
Profil
id souboru by bylo jednoznačné označení souboru protože velikost by mohla být stejná název taky.
To už vlastně mám. při nahrání souboru se do tabulky přidá i ID Typ(int), auto_increment.
mimochodec
Profil
bazz:
Nejsem si jist, jak myslíš to "s ID souborem". Každopádně ber jako dané, že ID se nezadává, ale nechává se generovat databází. Těch zvláštních formulací tady je trochu víc, tak bych lehce nastínil, jak bych to udělal já.

tabulka "soubory":
ID nazevsouboru xx yy zz

tabulka "hodnoceni":
ID IDsouboru IP hodnoceni

Je dost možností, jak si to upravit podle svého. Třeba ty soubory: jestli je tam někdo nahrává, musíš je přejmenovat, abys vyloučil kolize, tzn. pokus umístit do jedné složky dva soubory stejnéh názvu. A teď: pojmenovat jak? Když použiješ ID touho souboru, nemůže být na škodu, že někdo, kdo vidí název a cestu jednoho souboru, zkusí otevřít / stáhnout soubor s číslem o jedno větším / menším a pak si lehce stáhne všechny soubory, co tam máš?
Keeehi
Profil
mimochodec:
Když použiješ ID touho souboru, nemůže být na škodu, že někdo, kdo vidí název a cestu jednoho souboru
Uložíš to do veřejně nepřístupné složky. Soubor k uživateli dostaneš tak, že si pro něj sáhne veřejně přístupný PHP script a pošle ho uživateli. V tom scriptu se dá změnit jméno na původní. Taky ověřit, zda má uživatel právo soubor stáhnout/zobrazit atp.
mimochodec
Profil
Keeehi:
Mně to psát nemusíš :) Já jsem to jen nadhodil jako něco, co si bazz možná bude muset ošetřit.
bazz
Profil
Dobrý den drazí rádcové našel jsem tento script

    define ("ROWS", 5);
    require_once('Db.php');
     ob_start();
  if (!isset($_GET["celkem"])) //pokud nevíme, kolik bude záznamů tak to zjistíme... 
  {
    $vysledek=mysql_query("select count(*) as pocet from soubory");
    $zaznam=mysql_fetch_array($vysledek);
    $celkem=$zaznam["pocet"];
  }
  else
  {
      $celkem=$_GET["celkem"];
  }
  if ($celkem>ROWS) 
  {
    if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
    $vysledek=mysql_query("select * from psc"." limit ".($od-1).", ".ROWS);
      echo "Záznamů: ".$od."-";
    echo (($od+ROWS-1)<=$celkem)?($od+ROWS-1):$celkem;
    echo " z celkem $celkem&nbsp;&nbsp;&nbsp;";
      //začátek - vytvoř odkaz pouze pokud nejsme na začátku
       if ($od==1) echo "Začátek&nbsp;|&nbsp;"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=1\">Začátek</a>&nbsp;|&nbsp;";
      //zpět - vytvoř odkaz pouze pokud nejsme v prvních ROWS
       if ($od<ROWS) echo "Předchozí&nbsp;|&nbsp;"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od-ROWS)."\">Předchozí</a>&nbsp;|&nbsp;";
    //další - vytvoř, pouze pokud nejsme v posledních ROWS
       if ($od+ROWS>$celkem) echo "Následující&nbsp;|&nbsp;"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($od+ROWS)."\">Následující</a>&nbsp;|&nbsp;";
    //poslední - to je posledních (zbytek po dělení ROWS) záznamů
       if ($od>$celkem-ROWS) echo "Konec&nbsp;<BR>"; 
      else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\">Konec</a><BR>";
  }
  while ($zaznam = MySQL_Fetch_Array($vysledek))
{
echo $zaznam["jmeno"];
}

bohužel po pátrací akci a několika úpravách mám pořád chybu na : while ($zaznam = MySQL_Fetch_Array($vysledek)) toš a ne a ne s tím hnout
Lonanek
Profil
bazz:
... a několika úpravách mám pořád chybu ...
A jakou?

Podle zběžného prohlédnutí kódu může nastat situace, že proměnná $vysledek není definována.
Ta situace nastane, pokud existuje $_GET['celkem'] a současně hodnota této proměnné je menši jak 6

Pokud chcete dosáhnout správných výsledků, pak smyčku WHILE musíte zařadit do podmínky if ($celkem>ROWS). Ne až za tuto podmínku.
tedy:
...
    else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\">Konec</a><BR>";
    while ($zaznam = MySQL_Fetch_Array($vysledek))
    {
      echo $zaznam["jmeno"];
    }
  }
Jinak velice vřele doporučuji ošetřit vstupní proměnné!
bazz
Profil
oh pardon chyba je

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in ...

while ($zaznam = MySQL_Fetch_Array($vysledek))


méně jak 6 určitě nebude
Lonanek
Profil
bazz:
méně jak 6 určitě nebude
A jak to víte?

Pokud zadám domena.tdl/nazev_scriptu?celkem=3, pak hodnota bude menší než 6.
Jinak se domnívám, že script není správně napsán pro všechny možné varianty vstupu.
bazz
Profil
vím kolik bude položek v té databázi. Teda vím že jich tam bude víc jak 50
Lonanek
Profil
To je sice pěkná věc, ale jak jsem uvedl příklad, tak Váš script nic nevypíše, protože nebude splněna podmínka if ($celkem>ROWS). Proměnná $celkem = 3 a ROWS = 5. Tedy 3>5 je FALSE.
A mimochodem kolik záznamů je v tabulce soubory? Je jich tam alespoň 6 a více?

bazz:
Teda vím že jich tam bude víc jak 50
A v které tabulce? V soubory, nebo psc?

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:

0