За последние 24 часа нас посетили 22906 программистов и 1243 робота. Сейчас ищут 788 программистов ...

Запрос в базу данных

Тема в разделе "PHP и базы данных", создана пользователем lordconst, 12 дек 2019.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Привет всем! Не получается сделать запрос в базу данных.
    По заданию необходимо получить данные (и вывести их в таблицу, но это другой код уже) о задолженности студентов. Предполагается, что если студент в этом месяце не платил (неважно в какой день до текущей даты), то он считается должником.
    Имеется такой код:
    PHP:
    1. $currentDate = date("Y-m-d");
    2. $link = mysqli_connect($host, $user, $password, $database) or die("Ошибка " . mysqli_error($link));
    3. $query = 'SELECT ID_payment, Date_payment, FIO_student
    4.            FROM payment INNER JOIN student ON (payment.ID_student = student.ID_student)
    5.            WHERE Date_payment < '.$currentDate.'
    6.            ORDER BY ID_payment';
    7. $result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
    8. $data = mysqli_fetch_all($result, MYSQLI_ASSOC);
    9. print_r($data);
    В прикрепленном файле скриншот записей таблицы в бд.
    Как сделать запрос, чтобы учитывался только год и номер месяца (то есть чтобы студент, не оплативший в этом месяце, считался должником)?
     

    Вложения:

    #1 lordconst, 12 дек 2019
    Последнее редактирование: 12 дек 2019
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. $query="SELECT ID_payment, Date_payment, FIO_student
    2. FROM payment INNER JOIN student ON (payment.ID_student = student.ID_student)
    3. WHERE date_format(Date_payment, '%Y%m') < date_format(now(), '%Y%m')
    4. ORDER BY ID_payment";
     
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    спасибо, помогло продвинуться в этом вопросе, но не глобально в задаче.
    Помогите, пожалуйста, сделать сформировать запрос, который выводил бы то, что нужно в задании. Я сейчас сам попробовал, но, честно говоря, мучаюсь над этим уже не первый день и просто потерялся в своем же коде.
    Нужно получить отчет о задолженности студентов заданного факультета за заданный курс обучения (эти два выбора потом я добавлю через select в форме, а пока просто самому в запросе менять): ФИО студента, группа, сумма начислений, задолженность по оплате (пока пустым оставим).
     

    Вложения:

  4. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    PHP:
    1. $query= "SELECT ID_student, FIO_student, group_name, SUM(Total_summ) as Total_pay
    2.        FROM student
    3.        INNER JOIN study_group ON (student.ID_group = study_group.ID_group)
    4.        INNER JOIN payment ON (student.ID_student = payment.ID_student)";
    Решил попробовать идти дальше, надо добавить сумму начислений.
    Выдает ошибку: Column 'ID_student' in field list is ambiguous.
    В чем проблема?
     
  5. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Исправил на
    PHP:
    1. $query= "SELECT FIO_student, group_name, SUM(Total_summ) as Total_pay
    2.        FROM student
    3.        INNER JOIN study_group ON (student.ID_group = study_group.ID_group)
    4.        INNER JOIN payment ON (student.ID_student = payment.ID_student)";
    Вот что выдает. Значит, я запрос неверно написал. У каждого студента в таблице payment есть оплата за каждый месяц. Как суммировать ВСЕ оплаты у каждого конкретного студента?
    И почему выводит лишь одного студента?
     

    Вложения:

  6. eleks

    eleks Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    1
    Доброго времени суток и с наступающим Новым годом!
    Подскажите пожалуйста в чем проблема.
    Создал свою первую базу данных (имя calcgm), состоящую из одной таблицы diagnostik на локальном сервере.
    Цель архивировать входные данные онлайн-калькулятора, вводимых различными пользователями, для дальнейшего анализа.
    Таблица содержит столбцы:
    idtab, ipadr, data_time, h1, b1, h2, b2, pl, fl, bm, sol
    idtab - первичный ключ с автоинкриментом (mediumint(8) unsigned);
    ipadr - ip адрес пользователя (varchar(50));
    data_time - дата время (timestamp on update current_timestamp());
    h1, b1, h2, b2, pl, fl, bm, sol - различные числовые данные в формате с плавающей запятой.
    Код скомбинировал из различных примеров
    Код (Text):
    1.  
    2. <?php
    3. // Получить IP клиента в $ip_adr
    4. $client = @$_SERVER['HTTP_CLIENT_IP'];
    5. $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    6. $remote = @$_SERVER['REMOTE_ADDR'];
    7. if(filter_var($client, FILTER_VALIDATE_IP)) $ip_adr = $client;
    8. elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip_adr = $forward;
    9. else $ip_adr = $remote;
    10. // Тело калькулятора
    11. ...
    12.  
    13. // Подключение к базе данных и запись
    14. if(@$link = mysqli_connect('localhost','root','','calcgm'))
    15. {
    16.  echo 'Подключение успешно установлено';
    17.  // Выполняем работу с базой данных
    18. $sql = mysqli_query($link, "INSERT INTO `diagnostik` (`idtab`,`ipadr`,`data_time`,`h1`,`b1`,`h2`,`b2`,`pl`,`fl`,`bm`,`sol`) VALUES (NULL,`$ip_adr`,NULL,`$h1`,`$b1`,`$h2`,`$b2`,`$ploss`,`$floss`,`$bm`,`$hc`)");
    19.  //Если вставка прошла успешно
    20.  if ($sql) {
    21.  echo '<p>Данные успешно добавлены в таблицу.</p>';
    22.  } else {
    23.  echo '<p>Произошла ошибка: ' . mysqli_error($link) . '</p>';
    24.  }
    25.  
    26.  mysqli_close($link); // Закрываем соединение
    27. }
    28. else
    29. {
    30.  echo 'Не удалось установить соединение к базе данных:<br>';
    31.  echo 'ошибка ('.mysqli_connect_errno().') ';
    32.  echo mysqli_connect_error();
    33. }
    34. ?>
    При запуске скрипта возникает диагностическое сообщение:
    Произошла ошибка: Unknown column '127.0.0.1' in 'field list'
    Где эта колонка с именем '127.0.0.1' ума не приложу. Думал, что возможно какие-то имена колонок совпадают с неким служебным словом. Покрутил имена не помогло. Просмотрел код, ошибок не заметил... [​IMG]
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @eleks, заключи значения в обычные апострофы или кавычки.
    --- Добавлено ---
    И попроси модеров создать для тебе отдельную тему. И больше не поднимай чужие, не самые свежие, темы своими вопросами.
    --- Добавлено ---
    Прикол с mediumint не понял. Байты экономишь?

    И макс. длина IPv4 – 15 символов ;)
     
    eleks нравится это.
  8. eleks

    eleks Новичок

    С нами с:
    12 окт 2019
    Сообщения:
    8
    Симпатии:
    1
    Спасибо! Это сработало. Намутили с этими апострофами. Порой трудно их отличить от кавычек, особенно листая печатные издания.
    Да. Длина одной записи получилась слишком большой и лет эдак через 600, эта таблица полностью исчерпает доступное дисковое пространство. Пусть лучше через 40 лет возникнет ошибка записи из-за переполнения mediumint :)
    Отлично! Значить время жизни можно увеличить ;)