Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: + i -, zmiana rekordu bazy
Forum PHP.pl > Forum > Przedszkole
awek520
Witam.. Pisze sobie taki mały portal z możliwością oceny danego elementu (np. zdjęcia)
Chciałbym się dowiedziec, jak edytowac rekord w bazie, ale rekord liczbowy.. Np. do 51 dodajemy 1. wink.gif

Mam taki skrypt, nie działa mi też edycja danego rekordu, w sensie edycja po ID (który ma byc wybierany do danego elementu).

Oto częsc kodu:

  1. <?
  2. require_once "baza.php";
  3. $result = mysql_query("SELECT * FROM cytat") or die(mysql_error());
  4.  
  5. while ($dane=mysql_fetch_array($result)) {
  6.  
  7. echo "<font color='orange'>#";
  8. echo "".$wiersz['id']."";
  9. echo "</font> (";
  10. echo "".$wiersz['punkty']."";
  11. echo ")<br><a href='index.php?up&id=".$wiersz['id']."'><font color='#009900'>Mocne!</font></a>";
  12. echo "| <font color='#FF0000'><a href='index.php?down&id=".$wiersz['id']."'><font color='#FF0000'>Słabe!</font></a>";
  13. echo "<div class='cytat'><p><br>";
  14. echo "".$wiersz['tresc']."";
  15. echo "<br></p></div><div class='cytat_dol'></div>
  16.  
  17. <br>
  18. <a href='#gora'><p align='right'><small><font color='white'>Do góry ^</font></a></small></p>
  19. <hr>
  20. <br>";
  21.  
  22. }
  23.  
  24. if ($_POST["action"] == "up") {
  25.  
  26. // punkt w gore
  27.  
  28. $punkty = $_POST["punkty"];
  29.  
  30. $result = mysql_query("UPDATE cytat SET WHERE id='$id'") or die(mysql_error());
  31.  
  32.  
  33. }
  34.  
  35. if ($_POST["action"] == "down") {
  36.  
  37. // punkt w dol
  38.  
  39. $punkty = $_POST["punkty"];
  40.  
  41. $result = mysql_query("UPDATE cytat SET WHERE id='$id'") or die(mysql_error());
  42.  
  43.  
  44. }
  45. ?>



Mógłby mi ktoś pomoc, albo nakierowac?
mar1aczi
Odpowiedź na Twoje pytanie jest w dokumentacji: update.
awek520
Czyli coś takiego?


  1. <?
  2. require "baza.php";
  3. $link=mysql_query("SELECT * FROM cytat ORDER BY id ASC");
  4. while($wiersz=mysql_fetch_array($link)){
  5.  
  6. echo "</font><font color='orange'>#";
  7. echo "".$wiersz['id']."";
  8. echo "</font> (";
  9. echo "".$wiersz['punkty']."";
  10. echo ")<br><a href='index.php?up&id=".$wiersz['id']."'><font color='#009900'>Mocne!</font></a>";
  11. echo "| <font color='#FF0000'><a href='index.php?down&id=".$wiersz['id']."'><font color='#FF0000'>Słabe!</font></a>";
  12. echo "<div class='cytat'><p><br>";
  13. echo "".$wiersz['tresc']."";
  14. echo "<br></p></div><div class='cytat_dol'></div>
  15. <br>
  16. <a href='#gora'><p align='right'><small><font color='white'>Do góry ^</font></a></small></p>
  17. <hr>
  18. <br>";
  19.  
  20. }
  21.  
  22. if ($_POST["action"] == "up") {
  23.  
  24. // punkt w gore
  25.  
  26. $punkty = $_POST["punkty"];
  27.  
  28. $result = mysql_query("UPDATE cytat SET punkty = punkty + 1 WHERE id='$id'") or die(mysql_error());
  29.  
  30.  
  31. }
  32.  
  33. if ($_POST["action"] == "down") {
  34.  
  35. // punkt w dol
  36.  
  37. $punkty = $_POST["punkty"];
  38.  
  39. $result = mysql_query("UPDATE cytat SET punkty = punkty - 1 WHERE id='$id'") or die(mysql_error());
  40.  
  41. }
  42. ?>


Nie wiem czy to będzie dobry system do takiego czegos.. : / chciałbym żeby, gdy klikło się poweidzmy "dobre", to edytuje się odrazu rekord punkty(+1) a dalej zostajemy na stronie głównej. smile.gif do tego nie wiem jak zrobic, żeby tylko raz mogło by się głosowac.. ktoś by coś doradziłquestionmark.gif
Pyton_000
Ajax, cookie, sprawdzenie IP + UserAgent + cookie
awek520
Napisałeś to w dużym skrócie.. bardzo dużym
Turson
Tworzysz linki
  1. echo '<a class="ocena" id="'.$wiersz['id'].'" type="plus">Dobre</a> <a class="ocena" id="'.$wiersz['id'].'" type="minus">Słabe</a>


Robisz akcję onclick
[JAVASCRIPT] pobierz, plaintext
  1. $(".ocena").on('click', function(){
  2. var type = $(this).attr('type'); //dzięki temu wiemy czy użytkownik kliknął słabe czy dobre
  3. })
[JAVASCRIPT] pobierz, plaintext

ajaxem wysyłasz dane i php robisz update
awek520
Cytat(Turson @ 10.04.2014, 22:14:57 ) *
Tworzysz linki
  1. echo '<a class="ocena" id="'.$wiersz['id'].'" type="plus">Dobre</a> <a class="ocena" id="'.$wiersz['id'].'" type="minus">Słabe</a>


Robisz akcję onclick
[JAVASCRIPT] pobierz, plaintext
  1. $(".ocena").on('click', function(){
  2. var type = $(this).attr('type'); //dzięki temu wiemy czy użytkownik kliknął słabe czy dobre
  3. })
[JAVASCRIPT] pobierz, plaintext

ajaxem wysyłasz dane i php robisz update




A ten kod drugi to gdzie wstawic? w jakiej częsci kodu?
Turson
W tym samym pliku co jest link
awek520
No tak, ale trzeba jakąś zmienną dopisac czy cos? gdy dodaje sam ten kod do pliku to wychodzi bląd.. coś z tym drugim "("..


Nie znam się na tym ajaxie.. jakaś czarna magia dla mnie to ; /
Turson
Wywala ci błąd w konsoli bo musisz dołączyć bibliotekę jquery w <head>. Poczytaj o ajaxie, napisz coś i wróć.
awek520
Sciągłem skrypt z neta.. Niestety nie do końca działa.. Mozna dodawac tyle plusów ile się chce.

  1. <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  2. <strong>Cytat 1</strong>
  3. <a id="gora" type="gora">
  4. <img src="image/yes.png" alt="+" width="14" height="14"/>
  5. </a>
  6.  
  7. <!-- tutaj poniższy kod PHP -->
  8. <a id="dol" type="dol">
  9. <img src="image/no.png" alt="-" width="14" height="14"/>
  10. </a>
  11.  
  12. <?php
  13. mysql_connect("localhost", "root", "") or die ("Błąd: NIE MOŻNA POŁĄCZYĆ SIĘ Z BAZĄ DANYCH.");
  14. mysql_select_db("admin") or die ("Błąd: NIE MOŻNA NAZWIĄZAĆ POŁĄCZENIA Z BAZĄ DANYCH.");
  15. $rat = mysql_query("SELECT * FROM cytat WHERE id=11;");
  16. if($res = mysql_fetch_assoc($rat)) {
  17. print '<span id="11"> '.($res['ocena']-1).'</span> '; // id="ile"
  18.  
  19. }
  20. ?>
  21.  
  22. <script type="text/javascript">
  23. $(document).ready(function() {
  24. $("#gora").unbind().bind("click", function() {
  25. $.ajax({
  26. type: 'POST',
  27. url: 'glos.php',
  28. data: 'akcja=dodaj',
  29. success: function(wynik) {
  30. $("#11").html(wynik)
  31. }
  32. });
  33. return false;
  34. });
  35. $("#dol").unbind().bind("click", function() {
  36. $.ajax({
  37. type: 'POST',
  38. url: 'glos.php',
  39. data: 'akcja=odejmij',
  40. success: function(wynik) {
  41. $("#11").html(wynik)
  42. }
  43. });
  44. });
  45. return false;
  46. });
  47. </script>


glos.php

  1. <?php
  2. mysql_connect("localhost", "root", "");
  3. mysql_select_db("admin");
  4. $increase = "UPDATE cytat SET punkty=punkty+1 WHERE id=1;";
  5. $decrease = "UPDATE cytat SET punkty=punkty-1 WHERE id=1;";
  6. $active_rate = mysql_query("SELECT * FROM cytat WHERE id=1;");
  7. $how = 0;
  8. if($rt = mysql_fetch_assoc($active_rate)) {
  9. $how = $rt['punkty'];
  10. }
  11. if($_POST['akcja'] == 'dodaj') {
  12. mysql_query($increase);
  13. print $how++;
  14. } elseif($_POST['akcja'] == 'odejmij') {
  15. mysql_query($decrease);
  16. print $how--;
  17. }
  18. ?>




Chciałbym jeszcze, żeby automatycznie id wybierał z bazy, trzeba to dodac do id="'.$wiersz['id'].'" no ale nie dziala mi to.. : /
Tak samo nie edytuje rekordu w bazie.. ciągle zostaje taki sam..
Chcialbym jeszcze zrobic blokade, że tylko raz mozna głosowac, albo chociaz raz na dzien..


Pomoże ktoś?
Turson
data: 'akcja=dodaj',

spróbuj tak:
data: { akcja:'dodaj' },

analgiczne do odejmij
awek520
Nic, dalej to samo.. rekord w bazie się zmienia smile.gif tylko że można ciągle naciskac ++ albo --
Turson
Jeżeli rekord w bazie już się zmienia, a chcesz dodać blokadę, że można np. głosować raz, to musisz stworzyć nową tabelę, np. oceny z kolumnami: cytat_id, user_id(lub IP użytkownika w zależności czy masz system logowania), data
Wtedy po naciśnięciu plus/minus sprawdzasz przed update, czy użytkownik już głosował - zwykłe mysql_num_rows z warunkiem where cytat=cytat AND user=user/ip
awek520
Cytat(Turson @ 12.04.2014, 11:35:23 ) *
Jeżeli rekord w bazie już się zmienia, a chcesz dodać blokadę, że można np. głosować raz, to musisz stworzyć nową tabelę, np. oceny z kolumnami: cytat_id, user_id(lub IP użytkownika w zależności czy masz system logowania), data
Wtedy po naciśnięciu plus/minus sprawdzasz przed update, czy użytkownik już głosował - zwykłe mysql_num_rows z warunkiem where cytat=cytat AND user=user/ip



No tak, ale wtedy chyba tylko pod jeden id będzie to działac tak? Czy źle zrozumiałem.. Muszę tworzyc nową tabele? Czy można np. w tej tabeli z cytatami to dodac?

A gdzie dodac ten update?

ps.. i tak do dupy działa.. : / bo trzeba odświezyc stronę żeby pokazała się ilośc.. : /
Turson
Baza danych powinna wyglądać mniej więcej tak:

cytaty: id | tytul | opis itd....| ocena
oceny: cytat_id | x | data
gdzie x to user_id lub user_ip w zależności od tego czy masz logowanie czy nie

Po naciśnięciu przycisku plus/minus:
1. Wysyłasz czy to plus czy to minus ("plus i minus to jedyne co widzę" tongue.gif )
2. Sprawdzasz czy w tabeli ocny istnieje wiersz spełniający warunki cytat_id i x
- jeżeli 1 to: komunikat, ze uzytkownik głosował, exit
- jeżeli 0 to:
a) update tabeli cytaty gdzie cytat_id = wysłane ajaxem id
cool.gif dodajesz to tabeli oceny potrzebne dane
c) pobierasz aktualną ocenę i wyświetlasz ją
awek520
O boż.. Czemu to musi byc takie trudne.. ; / Tabele akurat mam zrobioną dobrze wink.gif
Turson
Jak nie chcesz przebudowywać bazy, to można to zrobić też na ciasteczku chociażby, ale ciasteczka można edytować, usunąć smile.gif
awek520
coś takiego?

  1.  
  2.  
  3. <script type="text/javascript">
  4. $(document).ready(function() {
  5. $("#gora").unbind().bind("click", function() {
  6. $.ajax({
  7. type: 'POST',
  8. url: 'glos.php',
  9. data: { akcja:'dodaj' },
  10. if (user_ip = 0) { Głos przyjety!
  11. success: function(wynik) {
  12. $("#11").html(wynik)
  13. }
  14. }
  15. if (user_ip < 1) { Glosowałeś już! }
  16. });
  17. return false;
  18. });
  19. $("#dol").unbind().bind("click", function() {
  20. $.ajax({
  21. type: 'POST',
  22. url: 'glos.php',
  23. data: { akcja:'odejmij' },
  24. if (user_ip = 0) { Głos przyjety!
  25. success: function(wynik) {
  26. $("#11").html(wynik)
  27. }
  28. }
  29. if (user_ip < 1) { Glosowałeś już! }
  30. });
  31. });
  32. return false;
  33. });
  34. </script>
  35.  


Tak mam
Turson
Skąd wziąłeś user_ip?
awek520
No jeżeli user_ip 1 to znaczy że ktoś głosował.. a 0 że nie.. smile.gif tak?

czy ten kto nie głosował ma 0


A user_ip z bazy oceny, a znaczki mi się pomyliły.. teraz zminiłem
Turson
Ale skąd bierzesz to user_ip?
awek520
Chodzi CI o wyciągniecie z bazy? Nie ma...
Turson
Cytat
1. Wysyłasz czy to plus czy to minus ("plus i minus to jedyne co widzę" tongue.gif )
2. Sprawdzasz czy w tabeli ocny istnieje wiersz spełniający warunki cytat_id i x
- jeżeli 1 to: komunikat, ze uzytkownik głosował, exit
- jeżeli 0 to:
a) update tabeli cytaty gdzie cytat_id = wysłane ajaxem id
cool.gif dodajesz to tabeli oceny potrzebne dane
c) pobierasz aktualną ocenę i wyświetlasz ją

to wszystko robisz w PHP, do ajaxa zwracasz tylko dane.


[JAVASCRIPT] pobierz, plaintext
  1. if (user_ip = 0) { Głos przyjety!
  2. success: function(wynik) {
  3. $("#11").html(wynik)
  4. }
  5. }
[JAVASCRIPT] pobierz, plaintext

dopiero w success możesz pobrać user_ip
awek520
Dobra poddałem się..

Sciągłem gotowca z:
http://coursesweb.net/php-mysql/voting-up-...-script-ajax_s2


Wszystko działa jak nalezy, lecz moje pytanie do Was.. Czy można go zedytowac tak, żeby każdy cytat był oceniany ? a nie tylko działa pod jeden? Jak połączyc te 2 bazy ?
Turson
Możesz zerknąć jak chcesz http://turson.pl/blog/skrypt-ocen-oparty-na-ajaxie-jquery/
awek520
Ładnie ładnie smile.gif

Sprawdzałem to, no i coś z łączeniem się do bazy jest : / mógłbyś opisac co i jak z tym skryptem?
Głównie chodzi mi o to:

  1. <!--?PHP
  2. $db = new PDO('mysql:host=localhost;dbname=admin', 'root', 'haslo', array(PDO::MYSQL_ATTR_INIT_COMMAND =-->
  3. "SET NAMES 'utf8'")) or die();
  4. $stmt = $db->query("SELECT ocena FROM quotes WHERE id=1");
  5. $w = $stmt->fetch(PDO::FETCH_ASSOC);


no i o to:

  1. <?php class Ocena{ function __construct($quote_id,$type){ $this--->db = new PDO('mysql:host=localhost;dbname=admin', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")) or die();
  2. $this->quote = $quote_id;
  3. $this->type = $type;
  4. }
Turson
<!--?PHP
zmień na
<?php

$this--->db
na
$this->db

(PDO::MYSQL_ATTR_INIT_COMMAND =-->
na
(PDO::MYSQL_ATTR_INIT_COMMAND =>

wordpressowe bbcode coś pomieszało ohmy.gif
awek520
Błedu nie ma, ale po naciśniecu dobre, słabe nic się nie dzieje.. : /
Turson
Odpal konsolę przeglądarki, albo FireBug i zobacz czy w ogóle jest jakiś request po naciśnięciu
awek520
POST http://localhost/ocena.php

ale nic nie robi..
Turson
Sprawdź czy w bazie coś się zmienia

$stmt->execute();
pozamieniaj na
if(!stmt->execute()) print_r($stmt->errorInfo());
awek520
W bazie nic się nie zmienia..

Jak to pozamieniałem to wyskoczył błąd.

Parse error: syntax error, unexpected T_OBJECT_OPERATOR in C:\WebServ\httpd\ocena.php on line 12
  1. function checkQuoteExist(){
  2. try{
  3. $stmt = $this->db->prepare("SELECT id FROM quotes WHERE id=:id");
  4. $stmt->bindValue(':id', $this->quote, PDO::PARAM_INT);
  5. if(!stmt->execute()) print_r($stmt->errorInfo()); ---> 12
  6. if($stmt->rowCount()==0) throw new Exception("Cytat nie istnieje");
  7. return true;
  8. }
Turson
Zgubiłem $ przy $stmt

---> 12
skąd to się wzięło? wywal
awek520
Chciałem CI pokazac, która linijka, tego nie ma ogolnie..

Pozmieniałem to, bo też własnie tak myslałem, zamiast ! ma byc $ tak?

Dalej nic.. : / klikam fajne lub slabe, i nic.. baza oceny dalej pusta.
Turson
Wiesz co, jak będę w domu to wrzucę poprawną wersję, bo widzę, że parser bbcode zrobił tyle bałaganu, że szok tongue.gif
L0k0
awek, moim zdaniem w tej sposób do niczego nie dojdziesz. Masz 'braki z podstawówki' i co z tego, że ktoś Ci teraz powie co napisać czy też napisze Ci gotowe, jak dalej nie będziesz tego ogarniał.

Wg mnie to powinieneś tą pracę rozbić na kilka mniejszych, poćwiczyć a potem złożyć to do kupy.

Zrób sobie przykład użycia jQuery, ajaxa, parę przykładów z MySQL'a, a potem sam zobaczysz, że jest to dość proste i poskładasz w całość. Wtedy masz gwarancję, że wiesz co robisz, jak zepsujesz to będziesz wiedział gdzie i co oraz bez problemu napiszesz kolejny kod. Inaczej każdy projekt będzie drogą przez mękę.

Pozdrawiam!
awek520
Rozumiem Cie i wiem że masz racje.. Ale gdy ktoś napisze już praktycznie cały kod "za mnie" to staram się to przeanalizowac i zrozumiec co i jak..

Pozdrawiam
Xart
Zacznij używać PDO/MYSQli bo od wersji 5.5.0 funkcje będą przestarzałe mysq_...
Turson
Cytat(Turson @ 14.04.2014, 16:07:09 ) *
Wiesz co, jak będę w domu to wrzucę poprawną wersję, bo widzę, że parser bbcode zrobił tyle bałaganu, że szok tongue.gif

Poprawiłem kod łącznie z tabelami bazy, więc od początku je stwórz.
awek520
Wszystko działa poprawnie.. dziękuje Ci bardzo za pomoc.. smile.gif

Mam mature za 3 tygodnie, po maturach będę miał więcej czasu to przysiąde wkońcu do tego i zacznę powolutku od podstaw. smile.gif

Pozdrawiam.


PS. No dobra, wszystko ok.. Lecz mam problem z wyświetlaniem informacji, czy cytat jest, czy ktoś już głosował..

Zapętliłem echo, na jeden strronie mam wyświetlonych po 10 rekordów, lecz (<div id="odpowiedz"></div>) odpowiedz ciagle wyświetla się przy pierwszym z góry..

Do tego, gdy np. ocenimy 5 rekord, to zmienia się ten pierwszy u góry, po odświeżeniu strony wszystko dziala poprawnie(5 sie zmienia)..

Nie mam żadnych pomysłów jak by to zmienic.. #Turson pomożesz w tym?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.