За последние 24 часа нас посетили 17569 программистов и 1727 роботов. Сейчас ищут 1517 программистов ...

Помогите разобраться с сессиями или куками.

Тема в разделе "PHP для новичков", создана пользователем kvadim, 28 июн 2016.

  1. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Вот псевдокод
    Код (Text):
    1. 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.
     
  2. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    Вот это не понял.
    Для проверки количества строк тогда как надо, так
    Код (Text):
    1. if(mysqli_fetch_rows($result) > 0)
    если нет, то поправьте, пожалуйста.
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ты вообще методом тыка всё делаешь? по какой книге учишь PHP?

    в $result будет массив или FALSE,
    смотри https://secure.php.net/manual/ru/mysqli-result.num-rows.php
     
  4. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    Я без книги все делаю, все по справочникам с того же сайта php.net, потому как книги дорогие и не всегда есть нормальные, а с компа читать не удобно.
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А ты пробовать не пробовал? Когда ты пишешь астериск, то СУБД в результирующей таблице возвращает тебе все поля для всех кортежей, попавших под отбор. То есть если у тебя будет таблица вида айдиКниги-автор-название-текст и ты поищешь войну и мир, то в результирующей таблице будет один кортеж и в этом кортеже - ВСЯ книга. Но тебе же нужно знать только есть ли такая книга. Зачем тебе тянуть весь текст книги, если ты хочешь тупо узнать существование этой книги в базе? Даже если ты не будешь тянуть, то СУБД всё равно будет работать с полным текстом книги ведь ей надо разместить в памяти результирующую таблицу. Вот для этих случаев - когда тебе НЕ нужны фактические значения, но нужно знать их фактическое существование - можно использовать псевдоданные. Запрос SELECT * FROM teachers WHERE teacherId = 1 будет отличаться от SELECT 1 FROM teachers WHERE teacherId = 1 только тем что в первом случае ты хочешь поработать с данными учителя а во втором случае ты только ищешь существование такого учителя в базе. Если он там будет - вернется "таблица" с одним полем содержащим единицу. И всё. Никаких накладных расходов для СУБД.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    там причинно следственные связи описывают, по этому у тебя и каша + в книгах много нюансов не очевидных пишут

    это хорошо, но это справочник, а не учебник

    они почти все нормальные, качай с интернета бесплатно

    тогда может перестать заниматься обучением? не удобно же.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Короче, бросай программирование. У тебя голова вообще не хочет работать в нужном направлении. Тебе уже несколько раз сказали, что если ты выбираешь кортеж по условию то потом на стороне пхп не нужно повторно делать то же действие. А ты упорно продолжаешь его делать. Говорят что нужно проверить кол-во строк, но ты упорно не проверяешь кол-во строк.

    И потом скажи мне что значит твой запрос на обновление? Вот есть дата голосования, есть айпишник, есть идентификатор учителя. Ты там хочешь одну строку увидеть. Единственный уникальный голос за день с этого айпишника. За любого учителя. И не более чем за одного. И не более чем один голос. С КАКОГО РАЗБЕГА ТЫ ДЕЛАЕШЬ ИНКРЕМЕНТ ГОЛОСА? У ТЕБЯ ТАМ ЛИБО НОЛЬ СТРОК И ЕЁ НАДО ВСТАВИТЬ ЛИБО ТАМ ОДНА СТРОКА И НАДО ПОСЛАТЬ ПОЛЬЗОВАТЕЛЯ ЗА ЕГО ПОПЫТКУ ПОВТОРНОГО ГОЛОСОВАНИЯ. НЕЧЕМУ ПРИБАВИТЬ ЕДИНИЧКУ, ПОНИМАЕШЬ?
     
  8. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    Просто с бумажного носителя читать удобнее, чем с компа. Тут дело вкуса :) Может Вам удобнее с компа читать, мне же нет. Как говорится о вкусах не спорят. :) И если Вы знаете, хорошие книги, по которым сами учитесь или учились, то посоветуйте.
    --- Добавлено ---
    А то и значит, что если ни дата, ни айпи не совпадают при проверке, то заменить те данные, что есть в полях data и ip_address, что тут не понятно? А если совпадают, то выдать сообщение о том, что уже голосовали за данного учителя, чей id находится в переменной $teacher_id
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    читай всё подряд для начинающих, вкус в еде, а тут обучение. книги дорогие и тебе нравиться читать только бумажные книги? хотелки засовывай в коробочку и читай с монитора, главное это знания получить
     
  10. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    @kvadim, прокомментируй каждую строчку своего кода. Что она делает, что получается. Абсолютно каждую.
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  12. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    Все удалил с файла, пишу заново.
    --- Добавлено ---
    Спасибо за подсказки по отладке, правда нетбинс я не использую, ресурсоемкая гадасть, первая ссылка более полезна.
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    хороший метод

    тебе шашечки или ехать? можешь ещё phpstorm посмотреть
     
  14. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    А что еще делать, если все равно все у меня не правильно, если судить по Вашим навыкам и знаниям. phpstorm - это ж ерунда платная, если Вы знаете какое-то IDE, чтобы было легкое и не ресурсоемкое, то дайте ссылку. Потому как комп. слабый.

    Все у меня ступор, не понимаю, что делать дальше...:( Сделал такой вот код. Рядов совпадающие у меня 0.
    PHP:
    1. // Делаю запрос к таблице teachers и проверяю совпадают ли id, data, ip_address
    2. $sql = "SELECT id, data, ip_address FROM teachers WHERE id='".$teacher_id."' AND data='".$data."' AND ip_address='".$ip_address."' LIMIT 1";
    3. // Если переменной $result присвоенно массив запроса, тогда посчитам количество рядов и выведем их на экран.
    4. if($result = mysqli_query($link, $sql))
    5. {
    6.     $row_cnt = mysqli_num_rows($result);
    7.     echo '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />';
    8.     printf("В выборке %d рядов. \n", $row_cnt);
    9.  
    10.     mysqli_free_result($result);
    11. }
     
    #39 kvadim, 29 июн 2016
    Последнее редактирование: 29 июн 2016
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Переменной резалт не присваивается массив. Почитай уже документацию.
     
  16. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    Ну, по другому скажу, присваивается запрос к БД. Но вот я проверил количество рядов, что дальше? Не понимаю. :(
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Дальше - бросать программирование.

    Условно:
    PHP:
    1. $selSql = "SELECT 1 FROM table WHERE condition = 1";
    2. $selRes = myslqi_query($link, $selSql);
    3. if ($selRes->num_rows)
    4. {
    5. echo "Ti uzhe soval svoj golos segodnya, suka";
    6. }
    7.  
    8. $insSql = "INSERT INTO table (list, of, fields) VALUES (list, of, values)";
    9. mysqli_query($link, $insSql);
    10.  
    11. echo "Spasibulichki, vash golos uchtyon";
    Всё чего от тебя требуется.
    --- Добавлено ---
    В школьном курсе есть занятия по информатике, на которых дают основы. Ты не понимаешь основ. Ты не владеешь данными.

    Выбираем строку по паре дата-айпишник. Это даст нам в принципе факт голосования СЕГОДНЯ с конкретного АЙПИШНИКА. На выходе будет НОЛЬ или ОДНА строка. НЕ ГОЛОСОВАЛ или ГОЛОСОВАЛ.
    По этой одной или нулю строке принимаем решение.
    Если их одна - закончили. Адрес уже сегодня голосовал. Не важно за какого учителя. Просто голосовал.
    Если их ноль - вставляем запись "учитель-дата-адрес". Никакого сраного инкремента тут не может быть. Ты не можешь увеличить на единицу то чего нет. А если бы оно тут было то ты не мог бы его увеличить на единицу потому что оно бы логически не дошло сюда оставшись в прошлом блок.

    Раз в день айпишник может проголосовать за какого-то учителя. Решение своё поменять не может. На следующий день может проголосовать за другого учителя, не отменяя своих ранних выборов.
    Задача решена?
     
    #42 Ganzal, 29 июн 2016
    Последнее редактирование модератором: 29 июн 2016
  18. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    Спасибо, вот как бы да, но и не совсем, при таком запросе
    PHP:
    1. "INSERT INTO table (list, of, fields) VALUES (list, of, values)";
    на ввод данных, увеличивается каждый раз итерация в поле id, а мне это не надо, мне надо чтобы было так, вот есть у меня 37 айдишников и надо чтобы данные только обновлялись в полях data, ip_address, vote - это поле отвечает сколько раз проголосовали за конкретного учителя. Потому как структуру таблицы я приводил выше.
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    И это нормально. У тебя есть таблица учителей. У учителя есть свойства типа айдишник (с автоинкрементом, ок), ФИО. Необходимый минимум. Но ты за каким-то боком пошел дальше, и запихнул в таблицу учителей еще и дату и айпишник голосующего. Ну не выйдет у тебя каменный цветок при таких вводных.
    Тебе нужно нахрен удалить всё что связано с уникальностью голосования из таблицы учителя.
    И тогда о чудо! Через таблицу голосования ты будешь контролировать голосующих, не давать этим гадам проголосовать дважды за день или того хуже - изменить своё мнение! А через банальный джойн и группировку ты будешь получать текущий рейнинг учителей! УРА!

    Итак, учителя остаются минимум с айди-фио, а в новой таблице - айдиУчителя-датаГолосования-адресГолосования.
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    если поле одно, то как ты сможешь в нём поместить больше одного IP с датой? или у тебя будет только один человек пользоваться сайтом?
     
  21. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0
    То есть если я правильно понял, то поля data, ip_address мне надо удалить с таблицы teachers, и оставить только id, name_teachers, title_themes, vote и надо создать еще одну таблицы в которой будут такие поля как id, id_teacher, data, ip_address, правильно?
    --- Добавлено ---
    И еще вопрос почему именно так, а не так?
    PHP:
    1. $row_cnt = mysqli_num_rows($result);
     
    #46 kvadim, 29 июн 2016
    Последнее редактирование модератором: 29 июн 2016
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    да

    ООП стиль, процедурный реже используют, это есть в документации к этой функции, почитай её
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    опять невнимательно думаешь. Тебе не нужен VOTE в таблице учителя. Когда за него голосуют - появляется строка во второй таблице. Сумму этих голосов ты можешь дернуть через группировку и объединение. А во второй таблице тебе не нужен айди потому что уникальность записи тебе дает дата и айпишник.

    Потому что раньше не было улучшенной библиотеки. Чтоб узнать кол-во строк в результате нужно было скормить функции ссылку на ресурс с результатом запроса. А теперь есть улучшенная библиотека. И результат запроса теперь выполнен удобным объектом класса результата запроса. И у этого объекта сразу есть свойство с кол-вом строк. Не удивлюсь если внутри пхп-машины современная mysqli_num_rows выглядит как function mysqli_num_rows($result){ return $result->num_rows; }
     
  24. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    если это отвечает за какой пункт голосовали, то не обязательно
     
  25. kvadim

    kvadim Активный пользователь

    С нами с:
    1 сен 2015
    Сообщения:
    69
    Симпатии:
    0

    Попробовал сделать по Вашему совету. Написал так
    PHP:
    1. // Делаю запрос и проверяю равен ли id_teacher конкретному введенному с формы id учителя
    2. $sql = "SELECT 1 FROM poll_ip  WHERE id_teacher='".$teacher_id."'";
    3. //  посчитам количество рядов
    4. if($sql->num_rows)
    5. {
    6.     echo '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />';
    7.     echo "Вы уже голосовали!";
    8.     exit;
    9. }
    10. // Если не голосовали, то добавляем полученные значения с формы id учителя, дату и ip за которого голосовали
    11. $sql = "INSERT INTO poll_ip(poll_id, id_teacher, data, ip_address) VALUES('".$teacher_id."', '".$data."', '".$ip_address."')";
    12. mysqli_query($link, $sql);
    13.  
    14. echo '<meta http-equiv="Content-type" content="text/html; charset=utf-8" />';
    15. echo "Ваш, голос добавлен!!";
    В итоге в таблицу poll_ip записываются данные, но не блокирует, когда я уже раз проголосовал. Опять я что-то делаю не так...Только сильно не ругайтесь.