awek520
10.04.2014, 17:23:12
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.

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:
<?
require_once "baza.php";
echo "<font color='orange'>#"; echo "".$wiersz['id'].""; echo "".$wiersz['punkty'].""; echo ")<br><a href='index.php?up&id=".$wiersz['id']."'><font color='#009900'>Mocne!</font></a>"; echo "| <font color='#FF0000'><a href='index.php?down&id=".$wiersz['id']."'><font color='#FF0000'>Słabe!</font></a>"; echo "<div class='cytat'><p><br>"; echo "".$wiersz['tresc'].""; echo "<br></p></div><div class='cytat_dol'></div>
<br>
<a href='#gora'><p align='right'><small><font color='white'>Do góry ^</font></a></small></p>
<hr>
<br>";
}
if ($_POST["action"] == "up") {
// punkt w gore
$punkty = $_POST["punkty"];
}
if ($_POST["action"] == "down") {
// punkt w dol
$punkty = $_POST["punkty"];
}
?>
Mógłby mi ktoś pomoc, albo nakierowac?
mar1aczi
10.04.2014, 17:33:17
Odpowiedź na Twoje pytanie jest w dokumentacji:
update.
awek520
10.04.2014, 17:57:18
Czyli coś takiego?
<?
require "baza.php";
$link=mysql_query("SELECT * FROM cytat ORDER BY id ASC");
echo "</font><font color='orange'>#"; echo "".$wiersz['id'].""; echo "".$wiersz['punkty'].""; echo ")<br><a href='index.php?up&id=".$wiersz['id']."'><font color='#009900'>Mocne!</font></a>"; echo "| <font color='#FF0000'><a href='index.php?down&id=".$wiersz['id']."'><font color='#FF0000'>Słabe!</font></a>"; echo "<div class='cytat'><p><br>"; echo "".$wiersz['tresc'].""; echo "<br></p></div><div class='cytat_dol'></div> <br>
<a href='#gora'><p align='right'><small><font color='white'>Do góry ^</font></a></small></p>
<hr>
<br>";
}
if ($_POST["action"] == "up") {
// punkt w gore
$punkty = $_POST["punkty"];
}
if ($_POST["action"] == "down") {
// punkt w dol
$punkty = $_POST["punkty"];
}
?>
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.

do tego nie wiem jak zrobic, żeby tylko raz mogło by się głosowac.. ktoś by coś doradził
Pyton_000
10.04.2014, 20:18:19
Ajax, cookie, sprawdzenie IP + UserAgent + cookie
awek520
10.04.2014, 20:20:16
Napisałeś to w dużym skrócie.. bardzo dużym
Turson
10.04.2014, 22:14:57
Tworzysz linki
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
$(".ocena").on('click', function(){
var type = $(this).attr('type'); //dzięki temu wiemy czy użytkownik kliknął słabe czy dobre
})
ajaxem wysyłasz dane i php robisz update
awek520
10.04.2014, 22:19:54
Cytat(Turson @ 10.04.2014, 22:14:57 )

Tworzysz linki
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
$(".ocena").on('click', function(){
var type = $(this).attr('type'); //dzięki temu wiemy czy użytkownik kliknął słabe czy dobre
})
ajaxem wysyłasz dane i php robisz update
A ten kod drugi to gdzie wstawic? w jakiej częsci kodu?
Turson
11.04.2014, 07:38:27
W tym samym pliku co jest link
awek520
11.04.2014, 09:00:18
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
11.04.2014, 09:22:36
Wywala ci błąd w konsoli bo musisz dołączyć bibliotekę jquery w <head>. Poczytaj o ajaxie, napisz coś i wróć.
awek520
12.04.2014, 10:20:19
Sciągłem skrypt z neta.. Niestety nie do końca działa.. Mozna dodawac tyle plusów ile się chce.
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<strong>Cytat 1</strong>
<a id="gora" type="gora">
<img src="image/yes.png" alt="+" width="14" height="14"/>
</a>
<!-- tutaj poniższy kod PHP -->
<a id="dol" type="dol">
<img src="image/no.png" alt="-" width="14" height="14"/>
</a>
<?php
mysql_connect("localhost", "root", "") or
die ("Błąd: NIE MOŻNA POŁĄCZYĆ SIĘ Z BAZĄ DANYCH."); $rat = mysql_query("SELECT * FROM cytat WHERE id=11;"); print '<span id="11"> '.($res['ocena']-1).'</span> '; // id="ile"
}
?>
<script type="text/javascript">
$(document).ready(function() {
$("#gora").unbind().bind("click", function() {
$.ajax({
type: 'POST',
url: 'glos.php',
data: 'akcja=dodaj',
success: function(wynik) {
$("#11").html(wynik)
}
});
return false;
});
$("#dol").unbind().bind("click", function() {
$.ajax({
type: 'POST',
url: 'glos.php',
data: 'akcja=odejmij',
success: function(wynik) {
$("#11").html(wynik)
}
});
});
return false;
});
</script>
glos.php
<?php
$increase = "UPDATE cytat SET punkty=punkty+1 WHERE id=1;";
$decrease = "UPDATE cytat SET punkty=punkty-1 WHERE id=1;";
$active_rate = mysql_query("SELECT * FROM cytat WHERE id=1;"); $how = 0;
$how = $rt['punkty'];
}
if($_POST['akcja'] == 'dodaj') {
} elseif($_POST['akcja'] == 'odejmij') {
}
?>
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
12.04.2014, 10:28:07
data: 'akcja=dodaj',
spróbuj tak:
data: { akcja:'dodaj' },
analgiczne do odejmij
awek520
12.04.2014, 10:31:37
Nic, dalej to samo.. rekord w bazie się zmienia

tylko że można ciągle naciskac ++ albo --
Turson
12.04.2014, 10: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
awek520
12.04.2014, 10:39:01
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
12.04.2014, 10:48:07
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ę"

)
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

dodajesz to tabeli oceny potrzebne dane
c) pobierasz aktualną ocenę i wyświetlasz ją
awek520
12.04.2014, 10:51:09
O boż.. Czemu to musi byc takie trudne.. ; / Tabele akurat mam zrobioną dobrze
Turson
12.04.2014, 10:54:22
Jak nie chcesz przebudowywać bazy, to można to zrobić też na ciasteczku chociażby, ale ciasteczka można edytować, usunąć
awek520
12.04.2014, 10:56:51
coś takiego?
<script type="text/javascript">
$(document).ready(function() {
$("#gora").unbind().bind("click", function() {
$.ajax({
type: 'POST',
url: 'glos.php',
data: { akcja:'dodaj' },
if (user_ip = 0) { Głos przyjety!
success: function(wynik) {
$("#11").html(wynik)
}
}
if (user_ip < 1) { Glosowałeś już! }
});
return false;
});
$("#dol").unbind().bind("click", function() {
$.ajax({
type: 'POST',
url: 'glos.php',
data: { akcja:'odejmij' },
if (user_ip = 0) { Głos przyjety!
success: function(wynik) {
$("#11").html(wynik)
}
}
if (user_ip < 1) { Glosowałeś już! }
});
});
return false;
});
</script>
Tak mam
Turson
12.04.2014, 11:02:21
Skąd wziąłeś user_ip?
awek520
12.04.2014, 11:05:13
No jeżeli user_ip 1 to znaczy że ktoś głosował.. a 0 że nie..

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
12.04.2014, 11:14:53
Ale skąd bierzesz to user_ip?
awek520
12.04.2014, 11:19:19
Chodzi CI o wyciągniecie z bazy? Nie ma...
Turson
12.04.2014, 11:21:32
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.
if (user_ip = 0) { Głos przyjety!
success: function(wynik) {
$("#11").html(wynik)
}
}
dopiero w success możesz pobrać user_ip
awek520
12.04.2014, 11:28:12
Dobra poddałem się..
Sciągłem gotowca z:
http://coursesweb.net/php-mysql/voting-up-...-script-ajax_s2Wszystko 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
12.04.2014, 20:25:46
awek520
13.04.2014, 04:31:23
Ładnie ładnie

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:
<!--?PHP
$db = new PDO
('mysql:host=localhost;dbname=admin', 'root', 'haslo', array(PDO
::MYSQL_ATTR_INIT_COMMAND =--> "SET NAMES 'utf8'")) or
die(); $stmt = $db->query("SELECT ocena FROM quotes WHERE id=1");
$w = $stmt->fetch(PDO::FETCH_ASSOC);
no i o to:
<?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(); $this->quote = $quote_id;
$this->type = $type;
}
Turson
14.04.2014, 09:04:57
<!--?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
awek520
14.04.2014, 13:49:58
Błedu nie ma, ale po naciśniecu dobre, słabe nic się nie dzieje.. : /
Turson
14.04.2014, 13:51:24
Odpal konsolę przeglądarki, albo FireBug i zobacz czy w ogóle jest jakiś request po naciśnięciu
awek520
14.04.2014, 14:02:06
Turson
14.04.2014, 14:06:00
Sprawdź czy w bazie coś się zmienia
$stmt->execute();
pozamieniaj na
if(!stmt->execute()) print_r($stmt->errorInfo());
awek520
14.04.2014, 14:07:53
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
function checkQuoteExist(){
try{
$stmt = $this->db->prepare("SELECT id FROM quotes WHERE id=:id");
$stmt->bindValue(':id', $this->quote, PDO::PARAM_INT);
if(!stmt
->execute()) print_r($stmt->errorInfo()); ---> 12
if($stmt->rowCount()==0) throw new Exception("Cytat nie istnieje");
return true;
}
Turson
14.04.2014, 14:16:45
Zgubiłem $ przy $stmt
---> 12
skąd to się wzięło? wywal
awek520
14.04.2014, 14:45:23
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
14.04.2014, 15:07:09
Wiesz co, jak będę w domu to wrzucę poprawną wersję, bo widzę, że parser bbcode zrobił tyle bałaganu, że szok
L0k0
14.04.2014, 15:10:45
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
14.04.2014, 15:46:21
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
14.04.2014, 16:44:14
Zacznij używać PDO/MYSQli bo od wersji 5.5.0 funkcje będą przestarzałe mysq_...
Turson
14.04.2014, 17:19:37
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

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

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.

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.