Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2015, 23:38   #1
Yan9
Пользователь
 
Регистрация: 02.10.2015
Сообщений: 27
По умолчанию Некорректно работает запрос в БД

Добрый день!
Делаю голосование на сайте. Для этого id проголосовавшего вношу в таблицу и проверяю есть ли оно там или нет, для того, чтобы разрешить голосование или нет.
Делаю в ООП. Вот код:
Создаю объект и вызываю метод:
PHP код:
$vaca=new Vote(0$player0,0,0);
$vaca->insert_quantity(); 
Сам метод ($this->player это id пользователя, который хранится в переменной $player):
PHP код:
function insert_quantity(){
    
Create::connect();
    
$sel=mysql_query('SELECT * FROM quantity WHERE id_player='.$this->player);
    
$c=mysql_num_rows($sel);
    if(
$c>0){
        echo 
'Вы не можете проголосовать больше 1 раза <br>';
    }else{
        
mysql_query('INSERT INTO quantity (id_player) VALUES ('.$this->player.')');
        if(
mysql_error()){
            echo 
mysql_error().'<br>';
        }
        echo 
'Ok';
    }

Проблема в том, что если в таблице "quantity" НЕТ записи с этим пользователем, то она создается, что и должно быть, но на экран выводится тут же сообщение 'Вы не можете проголосовать больше 1 раза', т.е. каким-то образом код не доходит до echo 'Ok', а снова начинается сверху, соответственно уже находит эту строку и выводит эту надпись.
Если же удалить INSERT запрос, а оставить только echo 'Ok', то при отсутствии записи, на экран выводится надпись 'Ok', что и должно быть.
Циклов никаких тут не использую, этот метод больше нигде не вызываю, объекта такого больше нигде нет. Я просидел с этим уже часов 5, помочь никто не может.
Код элементарный, но не работает как надо. Буду очень благодарен за помощь!
Yan9 вне форума Ответить с цитированием
Старый 23.11.2015, 23:42   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Залогируйте метод и будет видно.
come-on вне форума Ответить с цитированием
Старый 23.11.2015, 23:45   #3
Yan9
Пользователь
 
Регистрация: 02.10.2015
Сообщений: 27
По умолчанию

Что вы имеете ввиду?
Yan9 вне форума Ответить с цитированием
Старый 23.11.2015, 23:47   #4
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Даже и не знаю как еще проще сказать ....
come-on вне форума Ответить с цитированием
Старый 23.11.2015, 23:50   #5
Yan9
Пользователь
 
Регистрация: 02.10.2015
Сообщений: 27
По умолчанию

Может используете другое слово? Я не знаю что это значит в php.
Даже когда я пишу return false сразу после insert, то результат все тот же.
Yan9 вне форума Ответить с цитированием
Старый 24.11.2015, 00:01   #6
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Сделайте файл и в него вписывайте каждое действие, потом откроете и посмотрите сколько и как проходило.
come-on вне форума Ответить с цитированием
Старый 24.11.2015, 00:26   #7
Yan9
Пользователь
 
Регистрация: 02.10.2015
Сообщений: 27
По умолчанию

Вышло вот что:
Resource id #60Resource id #61Вы не можете проголосовать больше 1 раза <br>1

т.е. он записал запрос SELECT
потом почему-то не записал $c,в которой должен лежать 0
потом записал запрос INSERT
потом похоже, что перескочил вверх и снова прошелся по коду до выполнения первого условия
но $c он записал после echo 'Вы не можете проголосовать больше 1 раза', а не до

Ничего не пойму
Yan9 вне форума Ответить с цитированием
Старый 24.11.2015, 01:07   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы советом может воспользуетесь?
у вас может быть дважды идет запрос просто напросто.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.11.2015, 01:17   #9
Yan9
Пользователь
 
Регистрация: 02.10.2015
Сообщений: 27
По умолчанию

Та я бы с удовольствием! Что я неправильно понял?
Вот все, что в файле, в котором создается объект класса, метод вызывается единожды, никаких циклов.
Код:
<?php
include_once('../pages/classes/class_voting.php');
$player=$_COOKIE['admin'];
$player=(integer) $player;
$vaca=new Vote(0, $player, 0,0,0);
$vaca->insert_quantity();
?>
Но я заметил,что если я немного меняю код, то самый первый раз запросы работают как надо, а уже все следующие разы нет.
Следующие разы после запроса INSERT код снова прыгает вверх к запросу SELECT и проходит снова сверху донизу.

Последний раз редактировалось Yan9; 24.11.2015 в 01:20.
Yan9 вне форума Ответить с цитированием
Старый 24.11.2015, 01:50   #10
Yan9
Пользователь
 
Регистрация: 02.10.2015
Сообщений: 27
По умолчанию

Разделил на два метода:
Файл с объектами (создал даже разные объекты класса):
Код:
$player=$_COOKIE['admin'];
$player=(integer) $player;

$vaca=new Vote(0, $player, 0,0,0);
$vaca->select_quantity();
$count=$vaca->count;
echo $count;
echo '<br>';

if($count==0){
	$cad=new Vote(0, $player, 0,0,0);
	$cad->insert_quantity();
}
Файл с методами:
Код:
function select_quantity(){
	Create::connect();
	$sel=mysql_query('SELECT * FROM quantity WHERE id_player='.$this->player);
	if(mysql_error()){
		echo mysql_error().'<br>';
	}
	$this->count=mysql_num_rows($sel);;
}

function insert_quantity(){
	Create::connect();
	mysql_query('INSERT INTO quantity (id_player) VALUES ('.$this->player.')');
	if(mysql_error()){
		echo mysql_error().'<br>';
	}
	echo 'Ok';	
}
Даже в таком случае РЕЗУЛЬТАТ ТАКОЙ ЖЕ, как и раньше. А там где я вывожу количество строк (echo $count), то выводит 1, т.е. даже тут код после вызова метода с INSERT'ом начинает движение опять сверху.
Создание отдельного класса в отдельном файле только для этого одного метода тоже проблему не решило.

Кто-то знает почему такое может происходить?

Последний раз редактировалось Yan9; 24.11.2015 в 02:05.
Yan9 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректно работает запрос. Abay19941308 БД в Delphi 2 25.12.2013 14:31
Некорректно работает TidHTTP denbox Общие вопросы Delphi 4 16.01.2013 12:13
Некорректно работает программа Dimakat Помощь студентам 2 07.09.2010 14:54
Некорректно работает запрос Arkuz БД в Delphi 9 20.08.2009 07:04
Некорректно работает запрос zulu80 БД в Delphi 10 16.02.2009 13:35