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 :: Почему некорректно работает запрос в БД
Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015
Помог: 0 раз(а)
Добрый день!
Делаю голосование на сайте. Для этого id проголосовавшего вношу в таблицу и проверяю есть ли оно там или нет, для того, чтобы разрешить голосование или нет.
Делаю в ООП. Вот код:
Создаю объект и вызываю метод:
Проблема в том, что если в таблице "quantity" НЕТ записи с этим пользователем, то она создается, что и должно быть, но на экран выводится тут же сообщение 'Вы не можете проголосовать больше 1 раза', т.е. каким-то образом код не доходит до echo 'Ok', а снова начинается сверху, соответственно уже находит эту строку и выводит эту надпись.
Если же удалить INSERT запрос, а оставить только echo 'Ok', то при отсутствии записи, на экран выводится надпись 'Ok', что и должно быть.
Циклов никаких тут не использую, этот метод больше нигде не вызываю, объекта такого больше нигде нет. Я просидел с этим уже часов 5, помочь никто не может.
Код элементарный, но не работает как надо. Буду очень благодарен за помощь!
Sail
Отправлено: 24 Ноября, 2015 - 08:47:31
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
Yan9
1. Не стоит вывод сообщения выполнять в теле функции.
2. Можно в записи выделить поле для подсчета количества голосов. 0 - только что вставленный, 1 - проголосовавший 1 раз и т.д. И проверять уже его, а не только наличие строчки в таблице.
3. Можно после вставки выполнять редирект на страницу отображения результата.
Yan9
Отправлено: 24 Ноября, 2015 - 13:00:10
Новичок
Покинул форум
Сообщений всего: 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 вынес из класса, но результат все равно тот же.
Файл с объектами:
Там, где я вывожу количество строк (echo $count), то пишет 1 вместо 0, т.е. вывод отсутствия строк просто игнорируется, это для меня вообще загадка, ведь это уже происходит вне класса в другом файле, а работает точно так же. Потом исполняется конструкция if, потом метод с запросом insert и код перескакивает вверх, начиная все сначала.
Притом, что циклов никаких нет, создал специально два разных объекта для вызова двух методов, а результат не меняется.
Sail
Отправлено: 24 Ноября, 2015 - 16:34:35
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
if($voted&&$cnt!==0){// кнопка нажата и пльзователь голосовал
echo"Вы уже проголосовали однажды.";
}elseif($inserted&&$cnt!==0){// при перенаправлении POST-данные не передаются
echo"Спасибо! Ваш голос учтён.";
}elseif($inserted){
echo"Не смогли учесть Ваш голос.";
}
Yan9
Отправлено: 24 Ноября, 2015 - 17:14:44
Новичок
Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2015
Помог: 0 раз(а)
Sail пишет:
вот простенький примерчик:
Спасибо большое за пример, но дело в том, что у меня там немного не так устроено. Пользователь в файле 1.php при помощи сортируемого списка расставляет ранги, кликает на кнопку, в файле 1.js я это по событию клика через аякс передаю в файл 2.php и делаю туда редирект. в этом файле получаю массив из списка, который сделал пользователь, вношу его в одну таблицу, а в другую как раз пытаюсь внести его id, которая означает, что он проголосовал.
И код все равно не хочет доходить до 19 строчки по вашему примеру, он после 14 сразу прыгает на 6 и все заново.
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
Yan9 пишет:
но дело в том, что у меня там немного не так устроено
Примерчик для того, чтобы разобраться, что надо проверять не только статус "голосовал/не голосовал", но и с какой целью в этот скрипт попали.
После попытки проголосовать (нажали кнопку "Голосовать"), или с целью проверить и сообщить результат (после добавления записи в таблицу и перенаправления).
Раз уж один скрипт занимается учётом голосов и выдачей результатов.
Yan9 пишет:
И код все равно не хочет доходить до 19 строчки по вашему примеру, он после 14 сразу прыгает на 6 и все заново.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.