Autor Zpráva
Samo
Profil *
Dobrý deň,
potreboval by som nejako doriešiť, aby po odoslaní hodnotenia, a prípadnom zaznamenaní do databázy alebo nezaznamenaní kvôli ip_adrese vypísalo chybu na stránke kde bude formulár na odoslanie hodnotenie a nie na stránke na ktorej prebehne script, prosím o radu ako takýto problém vyrišešiť, prípadne script s ktorým by sa to dalo upraviť...

Ideálne by bolo že by na mieste toh formulára s hodnotením len zmenilo formulár na text, čo sa s tým stalo ;)

ĎAKUJEM, nižšie prikladám zdrojové kódy aktuálneho znenia, áno, viem že mi to nič nevypíše keď prebehne ten script ale samotné overenie funguje :)

pridaj_hodnotenie.php
  
  echo '<form action="./hodnotenie.php" method="post"><select name="znamka">';
    for ($i=1;$i<=10;$i++){
      echo '<option>'.$i.'</option>';
    }
    echo '<input name="id_clanku" type="hidden" value="'.mysql_real_escape_string($_GET["id_knihy"]).'">';
    echo '<input name="ip_adresa" type="hidden" value="'.$_SERVER['REMOTE_ADDR'].'">';
    echo '<input type="submit" value="Odoslať">';
  echo '</select></form>';


hodnotenie.php
<?php
require_once('xxx.php);
  $id_clanku = htmlspecialchars($_POST['id_clanku']);
  $znamka = htmlspecialchars($_POST['znamka']);
  $ip_adresa = htmlspecialchars($_POST['ip_adresa']);
  require_once(xyz);    
      $p=1;
      $sql = (mysql_query("SELECT id_clanku,ip_adresa FROM hodnotenie WHERE id_clanku='" . mysql_real_escape_string($_GET["id_knihy"]) . "'"));
      while ($data = mysql_fetch_array($sql, MYSQL_BOTH)){
      $ip_adresa2[$p]=$data['ip_adresa'];
      $p++;
      if ($_SERVER['REMOTE_ADDR']==$ip_adresa2[$p]){
          echo 'Prepáčte, ale už ste hodnotili!';
            }
        else {  
          require_once(xyz);
            $sql = (mysql_query("INSERT INTO hodnotenie(id_clanku,znamka,ip_adresa) VALUES('$id_clanku','$znamka','$ip_adresa')"));
              if($sql){
                  echo 'Hodnotenie bolo odoslané!';
                      }
                else {
                  echo 'Prepáčte, nastala chyba!';
                     }
    mysql_close();
        }
    }
?>
pcmanik
Profil
Na zistenie ip adresy pouzi tuto funkciu:

function ip_adresa(){
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) $ip = $_SERVER['HTTP_CLIENT_IP'];
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else $ip = $_SERVER['REMOTE_ADDR'];
return $ip;
}


htmlspecialchars();
sa pouziva pri vypise z db, nie pri zapise

mysql_real_escape_string($_GET["id_knihy"])
mozes zmenit na
intval($_GET["id_knihy"]);
teda ak pouzivas ciselnu hodnotu

Nieje mi jasne, co sa snazis dosiahnut dvojnasobnim volanim tohoto
require_once(xyz);


sql staci zapisat takto
$sql = mysql_query("SELECT id_clanku,ip_adresa FROM hodnotenie WHERE id_clanku='" . mysql_real_escape_string($_GET["id_knihy"]) . "'");


Mas tu chybu - require_once('xxx.php') na konci ti chybalo '


vypísalo chybu na stránke kde bude formulár na odoslanie hodnotenie a nie na stránke na ktorej prebehne script

Staci ked na tej istej stranke kde mas formular vlozis ten script, nemusis ho davat do samostatneho suboru.
Pri pouziti tejto metody zmaz

echo '<input name="id_clanku" type="hidden" value="'.mysql_real_escape_string($_GET["id_knihy"]).'">';
echo '<input name="ip_adresa" type="hidden" value="'.$_SERVER['REMOTE_ADDR'].'">';


A aj tak pouzivat hidden nieje spravne, moze ti to hocikto zmenit, co by si urcite nechcel.....


Poviem ti to asi takto, cely ten tvoj script je zle. Odporucam ho cely prepisat...
Samo
Profil *
toto máš pravdu, ale ja som potreboval aby mi výsledok scriptu vyhodilo na stránku kde bude ten formulár, čiže aby action prebehol ako keby na rovnakej stránke ako formulár ;)
Samo
Profil *
a čo je lepšie ako hidden? :)
lebo ja sa takýmto srandám moc nevenujem, tak si nechám poradiť.. ;)
pcmanik
Profil
Este raz si pozri cely moj prispevok, omylom som ho zaslal, a som ho musel upravit, teraz uz je tu cely.
Samo
Profil *
to sa neboj, na konci ho cely urcite prepisem zostane mi polovica veci z webu to len teraz pocas vyvoja potrebujem do detailov :D
pcmanik
Profil
Ked bude action na tej istej stranke, hidden na ip nepotrebujes.
Hidden na id_clanku ti moze byt v podstate jedno, aj ked ho niekto zmeni nic tym v podstate neovplyvni, len bude hlasovat na inom clanku, ale s ip by si problem mal...
Samo
Profil *
ešte k tej chybe, ja som to teraz upravoval tak viem :D som si to druhý krát všimol keď som ho čítal či som sa nesekol..
Samo
Profil *
ešte mám otázku, prosím ako to dám do jednej stránky tie dve veci? tak aby to bolo aj nejako ochránené proti hacku :)
ak máš čas hoď mi to sem ako to má vyzerať, díky...
pcmanik
Profil
<?php

if (isset($_POST['hodnotenie'])){

to co sa ma urobit.....
}
?>

<form action="" method="post">

input, input atd

<input type="submit" value="Odoslať" name="hodnotenie">


Takto nejak, mal by si to z toho dokazat vycitat
PecanCZ
Profil
Samo:
require_once('xxx.php);
chybí ti tam '
require_once('xxx.php');
Samo
Profil *
if ($hodnotenie_on_off==1){
2. echo '<br />';
3. echo '<br />';
4. echo '<font>Hodnotenie užívateľov</font>';
5. require_once(DB);
6. $p=1;
7. $sql = (mysql_query("SELECT id_clanku,ip_adresa FROM hodnotenie WHERE id_clanku='" . intval($_GET["id_knihy"]) . "'"));
8. while ($data = mysql_fetch_array($sql, MYSQL_BOTH)){
9. $ip_adresa2[$p]=$data['ip_adresa'];
10. $p++;
11. if ($_SERVER['REMOTE_ADDR']==$ip_adresa2[$p]){
12. echo 'Prepáčte, ale už ste hodnotili!';
13. }
14. else {
15. if (isset($_POST['znamka'])){
16. $id_clanku = htmlspecialchars(intval($_GET["id_knihy"]));
17. $znamka = htmlspecialchars($_POST['znamka']);
18. $ip_adresa = ($_SERVER['REMOTE_ADDR']);
19. $sql = (mysql_query("INSERT INTO hodnotenie(id_clanku,znamka,ip_adresa) VALUES('$id_clanku','$znamka','$ip_adresa')"));
20. if($sql){
21. echo 'Hodnotenie bolo odoslané!';
22. }
23. else {
24. echo 'Prepáčte, nastala chyba!';
25. }
26. }
27. echo '<form action="" method="post"><select name="znamka">';
28. for ($i=1;$i<=10;$i++){
29. echo '<option>'.$i.'</option>';
30. }
31. echo '<input type="submit" value="Odoslať">';
32. echo '</select></form>';
33. }
34. }
35. echo '<br />';
36. DB_hodnotenie();
37. }
38. else {
39. return false;
40. }
Samo
Profil *
stále to nefuguje tak ako by malo, opakuje mi form podľa počtu záznamov v DB, potom ak dám odoslať vypíše že
"Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Extra\xampp\htdocs\hodnotenieknih2-1\kniha.php on line 66"

neviete kde môže byť chyba? v tom require_once() určite nie lebo inde to funguje, ten riadok 66 je tuto osmy, ten s tým while...
ďakujem
AM_
Profil
[#13] Samo
ta chyba znamená, že mysql_fetch_array dostal jako parametr resource místo boolean. A to nejpravděpodobněji znamená, že poslední volání dotazu přes mysql_query selhalo - chyba jde vypsat pomocí funkce mysql_error. Dokumentace ke všem funkcím je dostupná na http://php.net
Samo
Profil
A v tom opakovaní tých formov je chyba kde?...
//tú chybu vypíše až po odoslaní do DB, ale k tomu dopytu patrí ten od ktorého pýta dáta... :/
Samo
Profil
    if ($hodnotenie_on_off==1){
      echo '<br />';
      echo '<br />';
      echo '<font>Hodnotenie užívateľov</font>';
      echo '<br />';
      require_once(DB);    
      $p=1;
      $sql = (mysql_query("SELECT id_clanku,ip_adresa FROM hodnotenie WHERE id_clanku='" . intval($_GET["id_knihy"]) . "'"));
      while ($data = mysql_fetch_array($sql, MYSQL_BOTH)){
      $ip_adresa2[$p]=$data['ip_adresa'];
      $p++;
      if ($_SERVER['REMOTE_ADDR']==$ip_adresa2[$i]){
          echo 'Prepáčte, ale už ste hodnotili!';
            }
      }           
      if ($_SERVER['REMOTE_ADDR']!==$ip_adresa2[$i]) {
      if (isset($_POST['znamka'])){
          $id_clanku = htmlspecialchars(intval($_GET["id_knihy"]));
          $znamka = htmlspecialchars($_POST['znamka']);
          $ip_adresa = ($_SERVER['REMOTE_ADDR']);  
            $sql = (mysql_query("INSERT INTO hodnotenie(id_clanku,znamka,ip_adresa) VALUES('$id_clanku','$znamka','$ip_adresa')"));
              if($sql){
                  echo 'Hodnotenie bolo odoslané!';
                      }
                else {
                  echo 'Prepáčte, nastala chyba!';
                     }
            }  
          echo '<form action="" method="post"><select name="znamka">';
            for ($i=1;$i<=10;$i++){
              echo '<option>'.$i.'</option>';
              }
              echo '<input type="submit" value="Odoslať">';
          echo '</select></form>'; }
      echo '<br />';
      DB_hodnotenie();
      }
    else {
      return false;
    }
Samo
Profil
takto to vyzerá teraz, už nevypisuje počet formulárov podľa počtu záznamov v DB, ale teraz pre zmenu nefuguje to overovanie IPčky...
//EDIT: Ešte budem potrebovať aby mi zmizol ten formulár ak hodnotil a zobrazilo mu len primerné hodnotenie a nformáciu že už hlasoval...

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