Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Почему некорректно работает запрос в БД

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Yan9
Отправлено: 23 Ноября, 2015 - 22:33:29
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Добрый день!
Делаю голосование на сайте. Для этого id проголосовавшего вношу в таблицу и проверяю есть ли оно там или нет, для того, чтобы разрешить голосование или нет.
Делаю в ООП. Вот код:
Создаю объект и вызываю метод:
PHP:
скопировать код в буфер обмена
  1. $vaca=new Vote(0, $player, 0,0,0);
  2. $vaca->insert_quantity();

Сам метод ($this->player это id пользователя, который хранится в переменной $player):
PHP:
скопировать код в буфер обмена
  1. function insert_quantity(){
  2.     Create::connect();
  3.     $sel=mysql_query('SELECT * FROM quantity WHERE id_player='.$this->player);
  4.     $c=mysql_num_rows($sel);
  5.     if($c>0){
  6.         echo 'Вы не можете проголосовать больше 1 раза <br>';
  7.     }else{
  8.         mysql_query('INSERT INTO quantity (id_player) VALUES ('.$this->player.')');
  9.         if(mysql_error()){
  10.             echo mysql_error().'<br>';
  11.         }
  12.         echo 'Ok';
  13.     }
  14. }

Проблема в том, что если в таблице "quantity" НЕТ записи с этим пользователем, то она создается, что и должно быть, но на экран выводится тут же сообщение 'Вы не можете проголосовать больше 1 раза', т.е. каким-то образом код не доходит до echo 'Ok', а снова начинается сверху, соответственно уже находит эту строку и выводит эту надпись.
Если же удалить INSERT запрос, а оставить только echo 'Ok', то при отсутствии записи, на экран выводится надпись 'Ok', что и должно быть.
Циклов никаких тут не использую, этот метод больше нигде не вызываю, объекта такого больше нигде нет. Я просидел с этим уже часов 5, помочь никто не может.
Код элементарный, но не работает как надо. Буду очень благодарен за помощь!
 
 Top
Sail
Отправлено: 24 Ноября, 2015 - 08:47:31
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Yan9
1. Не стоит вывод сообщения выполнять в теле функции.
2. Можно в записи выделить поле для подсчета количества голосов. 0 - только что вставленный, 1 - проголосовавший 1 раз и т.д. И проверять уже его, а не только наличие строчки в таблице.
3. Можно после вставки выполнять редирект на страницу отображения результата.
 
 Top
Yan9
Отправлено: 24 Ноября, 2015 - 13:00:10
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Sail пишет:
Yan9
1. Не стоит вывод сообщения выполнять в теле функции.
2. Можно в записи выделить поле для подсчета количества голосов. 0 - только что вставленный, 1 - проголосовавший 1 раз и т.д. И проверять уже его, а не только наличие строчки в таблице.
3. Можно после вставки выполнять редирект на страницу отображения результата.


1. Не понял что вы имеете ввиду.
2. Как это правильно реализовать? Я не знаю кто будет голосовать, если пользователь нажимает кнопку "голосовать", то я же уже должен проверить наличие 0 или 1 по его id, а когда вставлять этот 0?
3. header("Location:".$_SERVER['HTTP_REFERER']); не помогло, все равно выводится надпись "Вы не можете проголосовать больше 1 раза", т.е. код даже не дошел до этой строки, а сразу после INSERT'a перескочил вверх и пошел исполняться снова, пока не увидел в БД уже созданную только что строку.

Чтобы было более правильно, разбил это все на 2 метода, конструкцию if вынес из класса, но результат все равно тот же.
Файл с объектами:
PHP:
скопировать код в буфер обмена
  1. $player=$_COOKIE['id'];
  2. $player=(integer) $player;
  3.  
  4. $vaca=new Vote(0, $player, 0,0,0);
  5. $vaca->select_quantity();
  6. $count=$vaca->count;
  7.  
  8. echo $count;
  9. echo '<br>';
  10.  
  11. if($count==0){
  12.     $cad=new Vote(0, $player, 0,0,0);
  13.     $cad->insert_quantity();
  14. }


Файл с классом:
PHP:
скопировать код в буфер обмена
  1. function select_quantity(){
  2.     Create::connect();
  3.     $sel=mysql_query('SELECT * FROM quantity WHERE id_player='.$this->player);
  4.     if(mysql_error()){
  5.         echo mysql_error().'<br>';
  6.     }
  7.     $this->count=mysql_num_rows($sel);;
  8. }
  9.  
  10. function insert_quantity(){
  11.     Create::connect();
  12.     mysql_query('INSERT INTO quantity (id_player) VALUES ('.$this->player.')');
  13.     if(mysql_error()){
  14.         echo mysql_error().'<br>';
  15.     }
  16.     echo 'Ok';  
  17. }

Там, где я вывожу количество строк (echo $count), то пишет 1 вместо 0, т.е. вывод отсутствия строк просто игнорируется, это для меня вообще загадка, ведь это уже происходит вне класса в другом файле, а работает точно так же. Потом исполняется конструкция if, потом метод с запросом insert и код перескакивает вверх, начиная все сначала.
Притом, что циклов никаких нет, создал специально два разных объекта для вызова двух методов, а результат не меняется.
 
 Top
Sail
Отправлено: 24 Ноября, 2015 - 16:34:35
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Yan9, вот простенький примерчик:
Спойлер (Отобразить)
 
 Top
Yan9
Отправлено: 24 Ноября, 2015 - 17:14:44
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Sail пишет:
вот простенький примерчик:


Спасибо большое за пример, но дело в том, что у меня там немного не так устроено. Пользователь в файле 1.php при помощи сортируемого списка расставляет ранги, кликает на кнопку, в файле 1.js я это по событию клика через аякс передаю в файл 2.php и делаю туда редирект. в этом файле получаю массив из списка, который сделал пользователь, вношу его в одну таблицу, а в другую как раз пытаюсь внести его id, которая означает, что он проголосовал.
И код все равно не хочет доходить до 19 строчки по вашему примеру, он после 14 сразу прыгает на 6 и все заново.

(Отредактировано автором: 24 Ноября, 2015 - 17:15:07)

 
 Top
Sail
Отправлено: 25 Ноября, 2015 - 08:20:02
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Yan9 пишет:
но дело в том, что у меня там немного не так устроено
Примерчик для того, чтобы разобраться, что надо проверять не только статус "голосовал/не голосовал", но и с какой целью в этот скрипт попали.
После попытки проголосовать (нажали кнопку "Голосовать"), или с целью проверить и сообщить результат (после добавления записи в таблицу и перенаправления).
Раз уж один скрипт занимается учётом голосов и выдачей результатов.
Yan9 пишет:
И код все равно не хочет доходить до 19 строчки по вашему примеру, он после 14 сразу прыгает на 6 и все заново.

Поверьте, скрипт доходит. Только сразу после вставки выполняется редирект и скрипт начинает отработку с самого начала, не зная ничего о своей предыдущей инкарнации.
"Это-ж бубль... web!" (чей-то почти ©) Хорошо
Воспользуйтесь отладчиком, посмотрите значения переменных...
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB