Zápis do db k existujícímu ID – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zápis do db k existujícímu ID – PHP – Fórum – Programujte.comZápis do db k existujícímu ID – PHP – Fórum – Programujte.com

 

Jirka
~ Anonymní uživatel
305 příspěvků
30. 11. 2012   #1
-
0
-

Ahoj lidi potřeboval bych poradit jak zapsat hodnocení k již existujícímu článku... Na webu mám články a na netu sem našel skript na honocení a chtěl bych ho začlenit k těm článkům. Databázi sem si udělal, ale vždy když ohodnotím, tak se mi vytvoří nové id toho hodnocení. Bude to chtít něco doplnit aby se to zapisovalo k už existujícímu ID. Já PHP nějak neholduji, tak nevím co a jak upravit. Děkuji za pomoc...

Tady je ten kód:

<?php
require ("pripoj.php");
/**
* @class voteClass
* @author Patrik "Szkandy" Szkandera
* @website http://php.cekuj.net
*/ 
class voteClass {
  private $table_votes;           // Tabulka hodnocení    
  private $time_limit;            // Počet dní pro další hlasování
  private $use_cookies;           // Pro kontrolu využití cookies nebo DB
  private $check_browser_db;      // Při kontrole DB, využít kontorlu prohlížeče
 
  public function __construct() {

    $this->table_votes = "filmy";
    $this->time_limit = "30";           
    $this->use_cookies = false;          
    $this->check_browser_db = true;      
  }
 
  public function vote($type, $parent_id, $vote) { 
    $can_vote = true;
   
    if ($vote >= 0 && $vote <= 5) {
     
      // Kontrola pomocí cookies
      if ($this->use_cookies) {
      
        if (isset($_COOKIE['vote_'.$type."_".$parent_id]))
          $can_vote = false;
      }
      // Kontrola pomocí DB
      else {
     
        // Kontrola prohlížeče
        if ($this->check_browser_db)
          $browser_and = "AND browser = '".$_SERVER['HTTP_USER_AGENT']."'";
        else
          $browser_and = "";
       
        $query = "SELECT id FROM ".$this->table_votes." WHERE type = '$type' AND parent_id = '$parent_id' 
                 $browser_and AND ip = INET_ATON('".$_SERVER['REMOTE_ADDR']."')
                 AND time + INTERVAL ".$this->time_limit." DAY > NOW()";
        $result_check_ip = mysql_query($query) or
          die(mysql_error());
   
        if (mysql_num_rows($result_check_ip) > 0)
          $can_vote = false;
      }
     
      // Pokud kontrola proběhla bez problémů
      if ($can_vote) {
       
        $query = "INSERT INTO ".$this->table_votes." (type, parent_id, vote, browser, ip)
                  VALUES('$type', '$parent_id', '$vote', '".$_SERVER['HTTP_USER_AGENT']."', INET_ATON('".$_SERVER['REMOTE_ADDR']."') )";
        $result = mysql_query($query) or
          die(mysql_error());
       
        $return['error'] = "";
       
        // Pokud se používá kontrola pomocí cookies -> vytvoření cookie s danými parametry
        if ($this->use_cookies)
          setcookie('vote_'.$type."_".$parent_id, "1", time()+$this->time_limit*24*60*60);
      }
      else
        $return['error'] = "already voted";
      
    }
    else
      $return['error'] = "cheater";
    
    // Vrácení případné chyby jQuery
    echo json_encode($return);
  }
 
  // Načtení templatu pro hodnocení
  public function load_template($parent_id, $type="article") {
   
    echo "<div class='vote_template' id='$type-$parent_id'>";
      $this->rating_info($parent_id, $type);
    echo "</div>";
  }
 
  // Načtení informací o hodnocení
  public function rating_info($parent_id, $type) {

    $query = "SELECT AVG(vote) AS avg, COUNT(*) AS sum FROM ".$this->table_votes." WHERE parent_id = '$parent_id' AND type = '$type' ";
    $result_votes = mysql_query($query) or
      die(mysql_error());
     
    $votes = mysql_fetch_array($result_votes);
   
    for ($i=1; $i<=round($votes['avg']); $i++)
      echo "<img src='images/star.gif' class='vote_image' id='$type-$parent_id-$i' alt='Hodnocení $i' />";
   
    for ($i=round($votes['avg'])+1; $i<=5; $i++)
      echo "<img src='images/empty_star.gif' class='vote_image' id='$type-$parent_id-$i' alt='Hodnocení $i' />";
     
    // Počeštění
    if ($votes['sum'] == 1)
      $suffix = "";
    if($votes['sum'] > 1)
      $suffix = "y";
    if($votes['sum'] > 4)
      $suffix = "ů";

    echo "<span class=\"vote_hodnoceni\">(".$votes['sum']." hlas".$suffix.", ";
    echo "průměr: ".number_format($votes['avg'], 1, ',', '')." z 5)</span>";
  }
}
?>

Nahlásit jako SPAM
IP: 95.173.217.–
Jirka
~ Anonymní uživatel
305 příspěvků
30. 11. 2012   #2
-
0
-

Opravdu nikdo nepomůže? 

Nahlásit jako SPAM
IP: 95.173.217.–
z_moravec
~ Redaktor
+3
Posthunter
30. 11. 2012   #3
-
0
-

#2 Jirka
Nemám čas to celé procházet, ale máš tam jen jeden insert, takže možnosti na úpravu jsou:

1) Tak jak je to v kódu - každý hlas - jeden řádek v db. Při vyhodnocení vezmeš sumu nebo průměr hlasů k danému článku (funkce rating_info). To bude nejjednodušší řešení.

2) Upravíš to tak, aby se hlasy k danému článku ukládaly pomocí UPDATE, ale pak bude nutné i změnit způsob ukládání informací o IP adrese a HTTP_USER_AGENT, aby nešlo hlasovta opakovaně z jednoho PC.

Osobně doporučuju 1, nebudeš muset dělat žádné úpravy.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Jirka
~ Anonymní uživatel
305 příspěvků
30. 11. 2012   #4
-
0
-

Děkuji za odpověď, ale nějak to nechápu :( v php se nevyznám... já když vypisuji použiji toto:

require_once("votesCore.php");  

   $vote = new voteClass;

   $vote->load_template("1");

Tento kód mi zobrazí to hodnocení u článku, ale když ho dám tam kdy vypisuji ty články, tak se mi to hodnocení opakuje a není ke každému článku zvlášť... v tom votesCore.php je ten kód co jsem posílal v prvním příspěvku.

Takhle tedy vypadá jak momentálně vypisuji články:

//********************************* výpis článků *********************************
        while($row = mysql_fetch_array($vypis))
                {
  
   require_once("votesCore.php");

   $vote = new voteClass;

   $vote->load_template("1");
  
   
   echo "<div class='vlozenydatum'><div class='vlozenydatumtext'>".$row["date"]."</div></div>\n"; //zobrazíme datum
            echo "<div class='nadpis'>".$row["film"]."</div>\n"; //zobrazíme nadpis
            echo "<div class='vlozenytextz'>".$row["odkaz"]."</div>\n"; // zobrazíme text

Jak to mám tedy zapsat do tohoto kousku, aby se hodnocení zobrazilo pro každý příspěvek svoje a neopakovalo se?

Díky za pomoc..

Nahlásit jako SPAM
IP: 95.173.217.–
Jirka
~ Anonymní uživatel
305 příspěvků
30. 11. 2012   #5
-
0
-

V databázi mám toto:

Tabulka je filmy a v ní je

  id  film  odkaz  date  type  parent_id  vote  browser  ip  time

Nahlásit jako SPAM
IP: 95.173.217.–
Jirka
~ Anonymní uživatel
305 příspěvků
1. 12. 2012   #6
-
0
-

Ať dělám co dělám furt to nejde :( zkouším to nějak předělat na to UPDATE, ale také to furt nechce fungovat... Asi dělám něco špatně. Když sem doplnil nad tento insert:

$query = "INSERT INTO ".$this->table_votes." (type, parent_id, vote, browser, ip)
                  VALUES('$type', '$parent_id', '$vote', '".$_SERVER['HTTP_USER_AGENT']."', INET_ATON('".$_SERVER['REMOTE_ADDR']."') )";

tento kód:

$query = "UPDATE  ".$this->table_update." SET (type, parent_id, vote, browser, ip)";

Vůbec nic se nestalo:

A vytvořil jsem zvlášť databázi s názvem votes_new a v ní je toto:

type, parent_id, vote, browser, ip

Ten INSERT INTO mi to vloží do té tabulky votes_new, ale UPDATE neudělá nic a měl by upravit tu tabulku filmy s existujícím článkem... Už si fakt nevím rady :(

Toto jsem změnil s $this->table_votes = "filmy"; na $this->table_votes = "vote_new";

A dále jsem přidal $this->table_update = "filmy";

A doplnil výše zmiňovaný $query = "UPDATE  ".$this->table_update." SET (type, parent_id, vote, browser, ip)";

Ale je to bez úspěchu...

Budu moc rád za každou pomoc. DĚKUJI

Nahlásit jako SPAM
IP: 90.181.173.–
peter
~ Anonymní uživatel
3981 příspěvků
3. 12. 2012   #7
-
0
-

$data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,

'browser' => $_SERVER['HTTP_USER_AGENT'],

'ip' = $_SERVER['REMOTE_ADDR']

);

$query = "INSERT INTO tabulka (%s) VALUES ('%s')";

$query = sprintf($query, implode(",",array_keys($data)), implode("','",$data) );

echo $query; // vypis si query nez ho posles do mysql

A zkus ho v phpmyadminu vlozit do okenka SQL a dat ok. Bud to napise provedlo se uspesne nebo chybu. Zkus tez pouzivat error_reporting, mysql_error a ostatni uzitecne vecicky, viz http://peter-mlich.wz.cz/…_priklad.txt

Nahlásit jako SPAM
IP: 2001:718:2601:400:0:5efe:...–
Jirka
~ Anonymní uživatel
305 příspěvků
4. 12. 2012   #8
-
0
-

#7 peter
Děkuji za pomoc. Příkaz sem vložil od SQL a vyhodil mi toto

Pravděpodobně máte v SQL dotazu chybu. Níže uvedený výstup MySQL serveru (pokud je nějaký) vám také může pomoci při zkoumání problému

ERROR: Neznámé interpunkční znaménko @ 25
STR: =>
SQL:  $data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,

'browser' => $_SERVER['HTTP_USER_AGENT'],

'ip' = $_SERVER['REMOTE_ADDR']

); $data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,

'browser' => $_SERVER['HTTP_USER_AGENT'],

'ip' = $_SERVER['REMOTE_ADDR']

); $data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,

'browser' => $_SERVER['HTTP_USER_AGENT'],

'ip' = $_SERVER['REMOTE_ADDR']

); $data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,

'browser' => $_SERVER['HTTP_USER_AGENT'],

'ip' = $_SERVER['REMOTE_ADDR']

); $data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,

'browser' => $_SERVER['HTTP_USER_AGENT'],

'ip' = $_SERVER['REMOTE_ADDR']

);


SQL-dotaz:

$data = array( 'type' => $type, 'parent_id' => $parent_id 'vote' => 0, 'browser' => $_SERVER['HTTP_USER_AGENT'], 'ip' = $_SERVER['REMOTE_ADDR'] );

MySQL hlásí: Dokumentace
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$data = array(

'type' => $type,

'parent_id' => $parent_id

'vote' => 0,
' at line 1

Nahlásit jako SPAM
IP: 95.173.217.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Zápis WITH - DO — založil Petr

Zápis — založil Petr

Zapis do suboru — založil kisto

Zapis do suboru — založil Johnnny

Zapis IP adres — založil Tom

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý