За последние 24 часа нас посетили 20844 программиста и 1010 роботов. Сейчас ищут 365 программистов ...

работа с массивами в mysql

Тема в разделе "PHP для новичков", создана пользователем Reken, 16 ноя 2020.

Метки:
  1. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Подскажите пожалуйста с кодом на php.

    В арсенале следующее:
    Массив с именами (допустим $name)

    Таблица в mysql следующего вида:
    Имя | Почта
    Иван | ivan@mail.ru
    Степан | stepan@mail.ru
    и т.д.

    Задача:
    Необходимо из таблицы вытащить все электронные адреса пользователей из массива $name, и записать эти адреса в массив $mail.

    Сам пытался через foreach сделать но не получилось...
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Ну покажите код то?
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    PHP:
    1. name = [ Иван, Банан, Греха, Рак ];
    2.  
    3. sql = sprintf ( "SELECT `Почта` FROM `Reken` WHERE `Имя` IN( '%s' )", implode ( "','", name ) );
    4.  
    5. mail = DB : query( sql ) -> fetchAll( DB : FETCH_COLUMN );
    6.  
     
  4. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    В данный момент код выглядит так, и выводит пустой массив...
    Код (Text):
    1. $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$name' )");
    2. $result = array();
    3. while ($row = $res->fetch_array())
    4. $result[] = $row[4]; # mail 4 столбик в таблице
    5. print_r($result);
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    вы из таблицы выбираете только один "столбик" - mail
    потому надо $row[0]
    --- Добавлено ---
    и далее по тексту нет ни одного $
    пых будет матерится безбожно
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    array to string sql
    --- Добавлено ---
    балина как же без тебя тут не обойтись o_O
     
  7. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    ADSoft я Вас понял, поменял на "0", но всё равно на выходе пустой массив получаю...
    Я правильно написал первую строку кода?
    Код (Text):
    1. $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$name' )");
    Код должен выбрать все значения столбика mail из таблицы где значения столбика name совпадают со значениями из массива name
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    если значение одно - достаточно user_name = '$name'

    PHP:
    1. while ($row = $res->fetch_array())
    2. $result[] = $row[0];
    3. print_r($row); // посмотрит что тут будет
    4. print_r($result);
     
  9. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Да, значение одно. Имена в массиве полностью соответствуют именам в таблице mysql
    Попробовал вариант с user_name = '$name'
    На выходе пустая страница...Даже пустого массива row не показывает...
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    А в бд то есть такие значения?
     
  11. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Да, конечно.
    Полностью совпадают с именами из массива.
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    в $name что содержится?
    var_dump($name);
     
  13. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Вот вывод содержания $name
    Код (Text):
    1. array(12) { [2]=> string(7) "Иван" [6]=> string(12) "Степан" [7]=> string(8) "Татьяна" # и .т.д. }
    Вообще я этот массив из другой таблицы Mysql вытянул...
    Что ещё можно сделать? Что бы массив подошел для сравнения с таблицей в Mysql...
     
  14. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    ну по хорошему - это надо делать в одном запросе, с использованием обеих таблиц, но для этого надо знать их структуру
    Если так как щас, то предварительно "готовить" список

    PHP:
    1. $list = implode("','", $name )
    2. $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$list' )");
     
  15. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    ADSoft спасибо что помогаете
    Вообще у меня такая задача:

    Есть таблица base20 которая содержит в себе информацию, примерно следующего вида:
    Учреждение | Месяц | Разная информация ...

    Есть таблица update1 которая содержит в себе информацию, примерно следующего вида:
    Учреждение | Электронный адрес

    Учреждения в двух таблицах полностью идентичны (одинаковые названия)

    Таблицу base20 заполняют учреждения всякой разной информацией, ежемесячно.
    Сама задача заключается, что бы при запуске скрипта, происходили следующие действия:

    1) Сравнить, все ли учреждения заполнили информацию, в текущем месяце
    2) Если найдутся учреждения которые не заполнили информацию, отправить им уведомления по email.

    Первую задачу я решил следующим образом. Создал массив и заполнил его учреждениями, которые заполнили "октябрь", далее создал второй массив и заполнил его учреждениями, которые заполнили "ноябрь". Далее через операцию array_diff обработал два массива, и получил массив с учреждениями, которые не отправили информацию относительно прошлого месяца.
    Вот таким образом и получился массив name...

    Вторую задачу собственно сейчас мы и пытаемся решить. Нужно на основании полученного массива name, вытащить из таблицы update1 электронные адреса этих учреждений, и записать эти адреса в массив mail. Ну а дальше я уже знаю, как отправить электронные письма...

    P.S.
    Код (Text):
    1. $list = implode("','", $name )
    2. $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$list' )");
    Ругается PHP
    Код (Text):
    1. Parse error: syntax error, unexpected '$res' (T_VARIABLE)
     
  16. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    писал с телефона, неудобно ; забыл
    PHP:
    1. $list = implode("','", $name );
    --- Добавлено ---
    По задаче, что то типа того
    Код (Text):
    1. SELECT base20.name, update1.email FROM base20
    2. LEFT JOIN update1 ON base20.name = update1.name
    3. WHERE base20.month = 'октябрь'
    выдаст все организации с емейлом, у которых заполнено в октябре

    но ваш подход в целом имеет кучу недостатков, начиная от того - что будет через год )))), когда названия месяцев начнут повторятся (поэтому нужно хранить полную дату сдачи отчета и сравнивать по тек месяцу и году
    типа
    Код (Text):
    1. WHERE MONTH(date)=MONTH(NOW()) && YEAR(date)=YEAR(NOW()),
    заканчивая структурой таблиц в БД, зачем update1 - непонятно... в вашем случае email нужно делать уникальным полем в таблице base20
     
  17. Reken

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

    С нами с:
    4 июл 2019
    Сообщения:
    198
    Симпатии:
    5
    Ещё раз спасибо.
    Я тоже не заметил сразу, что точка с запятой отсутствует.
    Теперь всё получилось.

    По поводу подхода, были причины именно так сделать...А все последующие года уже в другую таблицу будут записываться
     
  18. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    И какие? Технических ограничений не вижу