Aко полето съществува да го ъпдейтне иначе да създаде ново

vinsbg

Registered
Здравейте за пореден път. Продължавам да се мъча с тази система за гласуване, като сега не ми е ясно точно как ще стане следното.
При натискане на гласуване ако снимката с това ID няма гласове до момента да създава нов запис за нея в таблицата. При последващо гласуване за същата снимка да ъпдейтва вече съществуващия запис.

Това е текущия код
Код:
    	$type = $_POST['type'];
    	$value = $_POST['value'];
    	$pageId = $_POST['pageId'];    
    	   	
     			$value = $pdo->prepare('SELECT * FROM voting_system WHERE page_id= ?'); // BDD query, page ID values
    			$value->bindParam(1, $_POST['pageId'], PDO::PARAM_INT);
    			$value->execute();
    			$result = $value->fetch();    

    if( $result > 0) {
    
    	$query = $pdo->prepare('UPDATE voting_system SET '.$type.' = '.$type.' + 1 WHERE page_id= :pageId');
        $query -> execute(array(
                ":pageId"    => $_POST['pageId']               
        ));
    }
    else 
    {
        $type = $_POST['type'];
    	$value = $_POST['value'];
    	$pageId = $_POST['pageId']; 
    	    			   
		$query = $pdo -> prepare("INSERT INTO voting_system (page_id,positive,negative) 
		                          VALUES (:pageId, :positive, :negative)");    
		$query -> execute(array(
		                    ":pageId"    		 => $_POST['pageId'],
		                    ":positive"          => $value,
		                    ":negative"          => $value
		));       
    }
в ajax-a подавам следното
Код:
function vote(type, value, pageId) {
    	var dataFields = {'type': type, 'value': value, 'pageId': pageId}; // We pass the 3 arguments, type: positive or negative ; value=1 ; pageId: here 5
    	$.ajax({ // Ajax
    		type: "POST",
    		url: "ad_vot.php",
    		data: dataFields,
    		timeout: 3000,
    		success: function(dataBack){
    			$('#' + type).html(dataBack); // Change the new value in id="positive" or id="negative" DIV
    			$('#voteUp').attr('class', 'vote_up_done oneLine'); // Change image by design/vote-up-done.png grey icon
    			$('#voteDown').attr('class', 'vote_down_done oneLine'); // Change image by design/vote-down-done.png grey icon
    			$('#positive').attr('class', 'numberVoted oneLine'); // Change the number's color by a grey one for the "positive" DIV
    			$('#negative').attr('class', 'numberVoted oneLine'); // Change the number's color by a grey one for the "negative" DIV
    			$('#message').html('<div id="alertFadeOut" style="color: green">Вашят вот е добавен!</div>'); // Diplay message with a fadeout
    			$('#alertFadeOut').fadeOut(1000, function () {
    				$('#alertFadeOut').text('');
    			});
    			},
    		error: function() {
    			$('#message').text('Неуспешен вот. Моля опитайте отново.');
    		}
    	});
    }
В момента ако отворя снимка, която няма вотове и натисна +1 създава нов запис, но добавя +1 и за vote_up и за vote_down. Следващото гласуване вече си е нормално и добавя само за + или -.

Според мен и моите разбирания проблема е ето тук
Код:
		$query = $pdo -> prepare("INSERT INTO voting_system (page_id,positive,negative) 
		                          VALUES (:pageId, :positive, :negative)");    
		$query -> execute(array(
		                    ":pageId"    		 => $_POST['pageId'],
		                    ":positive"          => $value,
		                    ":negative"          => $value
		));
тъй като към ad_vote.php се подават: type': type, 'value': value, 'pageId': pageId}; // We pass the 3 arguments, type: positive or negative ; value=1 ; pageId: here 5

Как точно да подам тези параметри в инсърта? В мисъл
type приема + или - (positive или negative)? Нещо не мога да си го обясня в array-a..
 
Пробвай с REPLACE:
PHP:
$query = $pdo -> prepare("REPLACE INTO voting_system (page_id,positive,negative)
                                VALUES (:pageId, :positive, :negative)");   
      $query -> execute(array(
                          ":pageId"           => $_POST['pageId'],
                          ":positive"          => $value,
                          ":negative"          => $value
      ));
 
Според мен няма смисъл от ъпдейтване - при всяко гласуване добавяш ред в таблицата votes? Защо са ти проверки дали има запис? То ако има, би трябвало да забраниш гласуването? Или ти искаш да разрешиш да се променят гласовете?

п.п. сега видях че в таблица voting имаш хем positive, хем negative. Вижда ми се доста глупаво :D:D Трябва ти само едно поле - vote_type примерно, което има стойност или -1 или +1, за да може като ги събереш да получиш резултата.
 
anonimen каза:
Според мен няма смисъл от ъпдейтване - при всяко гласуване добавяш ред в таблицата votes? Защо са ти проверки дали има запис? То ако има, би трябвало да забраниш гласуването? Или ти искаш да разрешиш да се променят гласовете?

п.п. сега видях че в таблица voting имаш хем positive, хем negative. Вижда ми се доста глупаво :D:D Трябва ти само едно поле - vote_type примерно, което има стойност или -1 или +1, за да може като ги събереш да получиш резултата.
Ами имам positive(+) и negative(-), защото на страницата ги показвам и двете, колко са положителните и колко отрицателните вотове за съответната снимка. Ъпдейта на полето ми е нужен точно затова..

Просто проблема в момента е, че ако дадено ID(дадена снимка) не съществува в тази таблица при първоначалния инсърт добавя +1 и на positive и на negative без значение, кое е гласувано.
 
dakata__92 каза:
Пробвай с REPLACE:
PHP:
$query = $pdo -> prepare("REPLACE INTO voting_system (page_id,positive,negative)
                                VALUES (:pageId, :positive, :negative)");   
      $query -> execute(array(
                          ":pageId"           => $_POST['pageId'],
                          ":positive"          => $value,
                          ":negative"          => $value
      ));
Същото е пак ако нямам съществуващ запис за дадено ID и натисна + първоначалния запис е 1 и в двете полета - positive/negative. После вече при заявката където е ъпдейта няма проблеми и си записва само в едното поле, което е натиснато. Просто при натискане на бутона ajax-a подава type и value, които ги взимам
Код:
    	$type = $_POST['type'];
    	$value = $_POST['value'];
    	$pageId = $_POST['pageId'];
type държи + или - е, a value=1 винаги и съответно това 1 трябва да отиде в съответното поле.
Не съм сигурен, как да го направя в заявката обаче.
 
Еми това е нормално, защото ти в инсърт заявката така си му задал. ("INSERT INTO voting_system (page_id,positive,negative). Просто в тази заявка трябва да слагаш само page_id, а после ъпдейт заявката да добавя + или -.
 
teroristd каза:
Еми това е нормално, защото ти в инсърт заявката така си му задал. ("INSERT INTO voting_system (page_id,positive,negative). Просто в тази заявка трябва да слагаш само page_id, а после ъпдейт заявката да добавя + или -.
Правилно и не се бях замислил първо инсърт и после ъпдейт.. :idea:
В else-a нещо такова?

Код:
    else 
    {
        $type = $_POST['type'];
    	$value = $_POST['value'];
    	$pageId = $_POST['pageId']; 
    	    			   
    	$query = $pdo -> prepare("INSERT INTO voting_system (page_id,positive,negative)
                                VALUES (:pageId, :positive, :negative)");   
        $query -> execute(array(
                          ":pageId"           => $_POST['pageId'],
                          ":positive"          => '0',
                          ":negative"          => '0'
        ));     
        
       	$query = $pdo->prepare('UPDATE voting_system SET '.$type.' = '.$type.' + 1 WHERE page_id= :pageId');
        $query -> execute(array(
                ":pageId"    => $_POST['pageId']               
        ));    
    }
Не знам дали това е оптималния вариант. Принципно това работи, но правилно ли е?
 
Щом работи значи е правилно :D . Аз следвам принципа най-простото решение е най-вярно.
 
teroristd каза:
Щом работи значи е правилно :D . Аз следвам принципа най-простото решение е най-вярно.
Принципно си е така :)
"Щом едно нещо работи - не го пипай" .. благодаря за коментара, че изобщо не се бях замислил, че по този начин ще стане първо инсърта после ъпдейта.. :?:
 
Аз изобщо не разбирам защо тогава имаш таблица voting system - защо не сложиш + и - в същата таблица - pages? За какво ти е отделна? Ако ползваше същата таблица, нямаше изобщо да ги имаш тези проблеми. Просто в случая тя е излишна.

Пробвай да обединиш voting_system и pages в една таблица - няма да имаш никакви проверки за insert/update, защото по default ще имаш 0 в двете колони. Пробвай така и постни в някоя друга тема дали се е получило :?:

Идеята на изкарването в отделна таблица е да спестиш памет - в случая не пестиш нищо, само си усложняваш живота с доп. таблица и колона page_id, която така или иначе вече съществува.
 
Сигурно ползва някаква готова система, която не е измислена като хората. По лесно е да си напишеш системата от начало отколкото да оправяш нечии чужди грешки :) .
 
teroristd каза:
Сигурно ползва някаква готова система, която не е измислена като хората. По лесно е да си напишеш системата от начало отколкото да оправяш нечии чужди грешки :) .
Това, което той прави, ми се вижда безсмислено - все едно да имаш таблица user_ids, user_names, user_mails и във всяка да имаш поле user_id което да сочи към таблицата user_ids - излишно е :_)
 
Така е, на мен по-принцип ми е по-трудно да измисля подредбата на една система, кое с кое да комуникира, какви таблици и полета да има, отколкото да напиша самият код.
 

Back
Горе