Вот псевдокод Код (Text): SELECT ... FROM teachers ... WHERE ip = 127.0.0.1 and date = 29.06.2016 LIMIT 1 Сымысл в том, что ты можешь получить два варианта: 1. нет совпадений 2. есть совпадение если вариант 1, значит сегодня не было голосов с этого IP на текущую дату, потому что в условии "и" значит должна быть дата и IP, если у тебя нет брюк и галстука в клуб тебя не пустят, даже если у тебя буду брюки но галстука не будут, не пустят. если вариант 2, то есть кто-то с таким IP сегодня голосовал, значит не давай ему больше голосовать, он либо в брюках или в бабочки, но не с брюками в галстуке. база тебе в этом помогает, она сама грубо говоря в цикле всё сделает и вернёт только ответ, а ты его принимай как 1 вариант или 2.
Вот это не понял. Для проверки количества строк тогда как надо, так Код (Text): if(mysqli_fetch_rows($result) > 0) если нет, то поправьте, пожалуйста.
ты вообще методом тыка всё делаешь? по какой книге учишь PHP? в $result будет массив или FALSE, смотри https://secure.php.net/manual/ru/mysqli-result.num-rows.php
Я без книги все делаю, все по справочникам с того же сайта php.net, потому как книги дорогие и не всегда есть нормальные, а с компа читать не удобно.
А ты пробовать не пробовал? Когда ты пишешь астериск, то СУБД в результирующей таблице возвращает тебе все поля для всех кортежей, попавших под отбор. То есть если у тебя будет таблица вида айдиКниги-автор-название-текст и ты поищешь войну и мир, то в результирующей таблице будет один кортеж и в этом кортеже - ВСЯ книга. Но тебе же нужно знать только есть ли такая книга. Зачем тебе тянуть весь текст книги, если ты хочешь тупо узнать существование этой книги в базе? Даже если ты не будешь тянуть, то СУБД всё равно будет работать с полным текстом книги ведь ей надо разместить в памяти результирующую таблицу. Вот для этих случаев - когда тебе НЕ нужны фактические значения, но нужно знать их фактическое существование - можно использовать псевдоданные. Запрос SELECT * FROM teachers WHERE teacherId = 1 будет отличаться от SELECT 1 FROM teachers WHERE teacherId = 1 только тем что в первом случае ты хочешь поработать с данными учителя а во втором случае ты только ищешь существование такого учителя в базе. Если он там будет - вернется "таблица" с одним полем содержащим единицу. И всё. Никаких накладных расходов для СУБД.
там причинно следственные связи описывают, по этому у тебя и каша + в книгах много нюансов не очевидных пишут это хорошо, но это справочник, а не учебник они почти все нормальные, качай с интернета бесплатно тогда может перестать заниматься обучением? не удобно же.
Короче, бросай программирование. У тебя голова вообще не хочет работать в нужном направлении. Тебе уже несколько раз сказали, что если ты выбираешь кортеж по условию то потом на стороне пхп не нужно повторно делать то же действие. А ты упорно продолжаешь его делать. Говорят что нужно проверить кол-во строк, но ты упорно не проверяешь кол-во строк. И потом скажи мне что значит твой запрос на обновление? Вот есть дата голосования, есть айпишник, есть идентификатор учителя. Ты там хочешь одну строку увидеть. Единственный уникальный голос за день с этого айпишника. За любого учителя. И не более чем за одного. И не более чем один голос. С КАКОГО РАЗБЕГА ТЫ ДЕЛАЕШЬ ИНКРЕМЕНТ ГОЛОСА? У ТЕБЯ ТАМ ЛИБО НОЛЬ СТРОК И ЕЁ НАДО ВСТАВИТЬ ЛИБО ТАМ ОДНА СТРОКА И НАДО ПОСЛАТЬ ПОЛЬЗОВАТЕЛЯ ЗА ЕГО ПОПЫТКУ ПОВТОРНОГО ГОЛОСОВАНИЯ. НЕЧЕМУ ПРИБАВИТЬ ЕДИНИЧКУ, ПОНИМАЕШЬ?
Просто с бумажного носителя читать удобнее, чем с компа. Тут дело вкуса Может Вам удобнее с компа читать, мне же нет. Как говорится о вкусах не спорят. И если Вы знаете, хорошие книги, по которым сами учитесь или учились, то посоветуйте. --- Добавлено --- А то и значит, что если ни дата, ни айпи не совпадают при проверке, то заменить те данные, что есть в полях data и ip_address, что тут не понятно? А если совпадают, то выдать сообщение о том, что уже голосовали за данного учителя, чей id находится в переменной $teacher_id
читай всё подряд для начинающих, вкус в еде, а тут обучение. книги дорогие и тебе нравиться читать только бумажные книги? хотелки засовывай в коробочку и читай с монитора, главное это знания получить
@kvadim, прокомментируй каждую строчку своего кода. Что она делает, что получается. Абсолютно каждую.
в книгах про отладку рассказали бы http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html
Все удалил с файла, пишу заново. --- Добавлено --- Спасибо за подсказки по отладке, правда нетбинс я не использую, ресурсоемкая гадасть, первая ссылка более полезна.
А что еще делать, если все равно все у меня не правильно, если судить по Вашим навыкам и знаниям. phpstorm - это ж ерунда платная, если Вы знаете какое-то IDE, чтобы было легкое и не ресурсоемкое, то дайте ссылку. Потому как комп. слабый. Все у меня ступор, не понимаю, что делать дальше... Сделал такой вот код. Рядов совпадающие у меня 0. PHP: // Делаю запрос к таблице teachers и проверяю совпадают ли id, data, ip_address $sql = "SELECT id, data, ip_address FROM teachers WHERE id='".$teacher_id."' AND data='".$data."' AND ip_address='".$ip_address."' LIMIT 1"; // Если переменной $result присвоенно массив запроса, тогда посчитам количество рядов и выведем их на экран. if($result = mysqli_query($link, $sql)) { $row_cnt = mysqli_num_rows($result); echo '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />'; printf("В выборке %d рядов. \n", $row_cnt); mysqli_free_result($result); }
Ну, по другому скажу, присваивается запрос к БД. Но вот я проверил количество рядов, что дальше? Не понимаю.
Дальше - бросать программирование. Условно: PHP: $selSql = "SELECT 1 FROM table WHERE condition = 1"; $selRes = myslqi_query($link, $selSql); if ($selRes->num_rows) { echo "Ti uzhe soval svoj golos segodnya, suka"; exit; } $insSql = "INSERT INTO table (list, of, fields) VALUES (list, of, values)"; mysqli_query($link, $insSql); echo "Spasibulichki, vash golos uchtyon"; exit; Всё чего от тебя требуется. --- Добавлено --- В школьном курсе есть занятия по информатике, на которых дают основы. Ты не понимаешь основ. Ты не владеешь данными. Выбираем строку по паре дата-айпишник. Это даст нам в принципе факт голосования СЕГОДНЯ с конкретного АЙПИШНИКА. На выходе будет НОЛЬ или ОДНА строка. НЕ ГОЛОСОВАЛ или ГОЛОСОВАЛ. По этой одной или нулю строке принимаем решение. Если их одна - закончили. Адрес уже сегодня голосовал. Не важно за какого учителя. Просто голосовал. Если их ноль - вставляем запись "учитель-дата-адрес". Никакого сраного инкремента тут не может быть. Ты не можешь увеличить на единицу то чего нет. А если бы оно тут было то ты не мог бы его увеличить на единицу потому что оно бы логически не дошло сюда оставшись в прошлом блок. Раз в день айпишник может проголосовать за какого-то учителя. Решение своё поменять не может. На следующий день может проголосовать за другого учителя, не отменяя своих ранних выборов. Задача решена?
Спасибо, вот как бы да, но и не совсем, при таком запросе PHP: "INSERT INTO table (list, of, fields) VALUES (list, of, values)"; на ввод данных, увеличивается каждый раз итерация в поле id, а мне это не надо, мне надо чтобы было так, вот есть у меня 37 айдишников и надо чтобы данные только обновлялись в полях data, ip_address, vote - это поле отвечает сколько раз проголосовали за конкретного учителя. Потому как структуру таблицы я приводил выше.
И это нормально. У тебя есть таблица учителей. У учителя есть свойства типа айдишник (с автоинкрементом, ок), ФИО. Необходимый минимум. Но ты за каким-то боком пошел дальше, и запихнул в таблицу учителей еще и дату и айпишник голосующего. Ну не выйдет у тебя каменный цветок при таких вводных. Тебе нужно нахрен удалить всё что связано с уникальностью голосования из таблицы учителя. И тогда о чудо! Через таблицу голосования ты будешь контролировать голосующих, не давать этим гадам проголосовать дважды за день или того хуже - изменить своё мнение! А через банальный джойн и группировку ты будешь получать текущий рейнинг учителей! УРА! Итак, учителя остаются минимум с айди-фио, а в новой таблице - айдиУчителя-датаГолосования-адресГолосования.
если поле одно, то как ты сможешь в нём поместить больше одного IP с датой? или у тебя будет только один человек пользоваться сайтом?
То есть если я правильно понял, то поля data, ip_address мне надо удалить с таблицы teachers, и оставить только id, name_teachers, title_themes, vote и надо создать еще одну таблицы в которой будут такие поля как id, id_teacher, data, ip_address, правильно? --- Добавлено --- И еще вопрос почему именно так, а не так? PHP: $row_cnt = mysqli_num_rows($result);
опять невнимательно думаешь. Тебе не нужен VOTE в таблице учителя. Когда за него голосуют - появляется строка во второй таблице. Сумму этих голосов ты можешь дернуть через группировку и объединение. А во второй таблице тебе не нужен айди потому что уникальность записи тебе дает дата и айпишник. Потому что раньше не было улучшенной библиотеки. Чтоб узнать кол-во строк в результате нужно было скормить функции ссылку на ресурс с результатом запроса. А теперь есть улучшенная библиотека. И результат запроса теперь выполнен удобным объектом класса результата запроса. И у этого объекта сразу есть свойство с кол-вом строк. Не удивлюсь если внутри пхп-машины современная mysqli_num_rows выглядит как function mysqli_num_rows($result){ return $result->num_rows; }
Попробовал сделать по Вашему совету. Написал так PHP: // Делаю запрос и проверяю равен ли id_teacher конкретному введенному с формы id учителя $sql = "SELECT 1 FROM poll_ip WHERE id_teacher='".$teacher_id."'"; // посчитам количество рядов if($sql->num_rows) { echo '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />'; echo "Вы уже голосовали!"; exit; } // Если не голосовали, то добавляем полученные значения с формы id учителя, дату и ip за которого голосовали $sql = "INSERT INTO poll_ip(poll_id, id_teacher, data, ip_address) VALUES('".$teacher_id."', '".$data."', '".$ip_address."')"; mysqli_query($link, $sql); echo '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />'; echo "Ваш, голос добавлен!!"; exit; В итоге в таблицу poll_ip записываются данные, но не блокирует, когда я уже раз проголосовал. Опять я что-то делаю не так...Только сильно не ругайтесь.