• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Złe zapytanie (?). System głosowania.

Object Storage Arubacloud
0 głosów
190 wizyt
pytanie zadane 3 lipca 2015 w PHP przez No Lime Gaduła (4,540 p.)

Witam. Piszę system głosowania z wykorzystaniem AJAX, MySQL i PHP. Chcę aby każde kliknięcie na daną gwiazdkę spowodowało wykrycie ID danego postu na którym odbyło się głosowanie. Po pierwsze problem z grubsza polega na tym, że pojawiają mi się rekordy w bazie natomiast są one NOWE a miały być dodawane (modyfikowane) do obecnych rekordów. Już pokazuję: http://imageshack.com/a/img537/2821/SRMZg4.png

Jak widzicie - tworzą się nowe rekordy o czym wspomniałem wcześniej. Teraz pokażę kod:

Ten kod poniżej ma za zadanie wyciągać ID dla każdego postu na stronie, stąd baza miałaby wiedzieć gdzie (w którym poście) należy zaktualizować pola w rekordach. Dalej w kodzie jest po prostu front, tego nie chciałem już wklejać bo jest go za dużo.

while($query2=mysqli_fetch_array($query))
{
 $post_id = $query2['id'];

Ten kod poniżej to mechanizm wysyłający postem informacje po kliknięciu na jakąś gwiazdkę:

            $('.rate-btn').click(function(){    
                var therate = $(this).attr('id');
                var dataRate = 'act=rate&post_id=<?php echo $post_id; ?>&rate='+therate; //
                $('.rate-btn').removeClass('rate-btn-active');
                for (var i = therate; i >= 0; i--) {
                    $('.rate-btn-'+i).addClass('rate-btn-active');
                };
                $.ajax({
                    type : "POST",
                    url : "http://localhost/rating/ajax.php",
                    data: dataRate,
                    success:function(){}
                });
                
            });
        });

Zaś poniżej jest plik ajax.php

<?php
require_once 'connect.php';


   if(isset($_POST['act'])){
    	//search if the user(ip) has already gave a note
    	$ip = $_SERVER["REMOTE_ADDR"];
    	$therate = $_POST['rate'];
    	$thepost = $_POST['post_id'];

    	$query = mysqli_query($link, "SELECT * FROM mieszkania where ip= '$ip'  "); 
    	while($data = mysql_fetch_assoc($query)){
    		$rate_db[] = $data;
    	}

    	if(count($rate_db) == 0 ){
    		mysqli_query($link,"INSERT INTO mieszkania (id_post, ip, rate)VALUES('$thepost', '$ip', '$therate')");
    	}else{
    		mysqli_query($link,"UPDATE mieszkania SET rate= '$therate' WHERE ip = '$ip'");
    	}
    } 
?>

Chciałem skorzystać z polecenia INSERT INTO z jakimś warunkiem ale w międzyczasie doczytałem, że nie można skonstruować tego polecania z klauzulą WHERE. Czy jakiś magik forumowy jest w stanie przynajmniej nakierować mnie na rozwiązanie ? Dziękuje z góry i pozdrawiam.

1 odpowiedź

+1 głos
odpowiedź 3 lipca 2015 przez Comandeer Guru (601,450 p.)
wybrane 4 lipca 2015 przez No Lime
 
Najlepsza

Zamiast INSERT UPDATE użyj REPLACE

komentarz 4 lipca 2015 przez No Lime Gaduła (4,540 p.)
Uff, zdecydowanie mogę dać Ci reputację. Nakierowałeś mnie na rozwiązanie. Dodałem do każdego diva dodatkowy atrybut name w którym po prostu jest przechowywane ID. a w javascript dodałem zmienna theid która pobiera wartość liczbową z atrybuty name a następnie wysyła ją ajaxem. Działa. Dziękuje za pomoc i cierpliwość.
komentarz 4 lipca 2015 przez No Lime Gaduła (4,540 p.)

Mam w zasadzie jeszcze jedno pytanie. W jaki sposób mogę skonstruować zapytanie SQL aby pobierało mi wartości dla każdego posta takie jak: Ile osób na to zagłosowało, jaka jest średnia. Mam na to kod natomiast mam kłopot z samym zapytaniem. Bo przez to albo każdy mój post na stronie nagle ma id = 7 lub średnia lub ile było głosów jest tylko dla jednego id. To mój kod

while($query2=mysqli_fetch_array($query))
{
    $rate_db = array();
 $sum_rates = array();
$rate_db[] = $query2;
                    $sum_rates[] = $query2['rate'];
               $sum_rates = array();
                if(@count($rate_db)){
                    $rate_times = count($rate_db);
                    $sum_rates = array_sum($sum_rates);
                    $rate_value = $sum_rates/$rate_times;
                    $rate_bg = (($rate_value)/5)*100;
                }else{
                    $rate_times = 0;
                    $rate_value = 0;
                    $rate_bg = 0;
                }

A to moje zapytanie:

$query=mysqli_query($link, "SELECT * FROM ((select * from mieszkania LIMIT 0,5)as t) inner join rate");

 

komentarz 4 lipca 2015 przez Comandeer Guru (601,450 p.)

Kombinowałbym przy pomocy COUNT + GROUP BY

komentarz 4 lipca 2015 przez No Lime Gaduła (4,540 p.)
Okej, natomiast jak później policzyć średnią ?

Podobne pytania

0 głosów
3 odpowiedzi 725 wizyt
pytanie zadane 23 kwietnia 2015 w HTML i CSS przez Bartaz Początkujący (440 p.)
0 głosów
2 odpowiedzi 1,064 wizyt
pytanie zadane 27 czerwca 2015 w PHP przez lukaszgo3 Początkujący (440 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 6 lipca 2015 w SQL, bazy danych przez No Lime Gaduła (4,540 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...