Подскажите пожалуйста с кодом на php. В арсенале следующее: Массив с именами (допустим $name) Таблица в mysql следующего вида: Имя | Почта Иван | ivan@mail.ru Степан | stepan@mail.ru и т.д. Задача: Необходимо из таблицы вытащить все электронные адреса пользователей из массива $name, и записать эти адреса в массив $mail. Сам пытался через foreach сделать но не получилось...
PHP: name = [ Иван, Банан, Греха, Рак ]; sql = sprintf ( "SELECT `Почта` FROM `Reken` WHERE `Имя` IN( '%s' )", implode ( "','", name ) ); mail = DB : query( sql ) -> fetchAll( DB : FETCH_COLUMN ); print_r ( mail );
В данный момент код выглядит так, и выводит пустой массив... Код (Text): $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$name' )"); $result = array(); while ($row = $res->fetch_array()) $result[] = $row[4]; # mail 4 столбик в таблице print_r($result);
вы из таблицы выбираете только один "столбик" - mail потому надо $row[0] --- Добавлено --- и далее по тексту нет ни одного $ пых будет матерится безбожно
ADSoft я Вас понял, поменял на "0", но всё равно на выходе пустой массив получаю... Я правильно написал первую строку кода? Код (Text): $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$name' )"); Код должен выбрать все значения столбика mail из таблицы где значения столбика name совпадают со значениями из массива name
если значение одно - достаточно user_name = '$name' PHP: while ($row = $res->fetch_array()) $result[] = $row[0]; print_r($row); // посмотрит что тут будет print_r($result);
Да, значение одно. Имена в массиве полностью соответствуют именам в таблице mysql Попробовал вариант с user_name = '$name' На выходе пустая страница...Даже пустого массива row не показывает...
Вот вывод содержания $name Код (Text): array(12) { [2]=> string(7) "Иван" [6]=> string(12) "Степан" [7]=> string(8) "Татьяна" # и .т.д. } Вообще я этот массив из другой таблицы Mysql вытянул... Что ещё можно сделать? Что бы массив подошел для сравнения с таблицей в Mysql...
ну по хорошему - это надо делать в одном запросе, с использованием обеих таблиц, но для этого надо знать их структуру Если так как щас, то предварительно "готовить" список PHP: $list = implode("','", $name ) $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$list' )");
ADSoft спасибо что помогаете Вообще у меня такая задача: Есть таблица base20 которая содержит в себе информацию, примерно следующего вида: Учреждение | Месяц | Разная информация ... Есть таблица update1 которая содержит в себе информацию, примерно следующего вида: Учреждение | Электронный адрес Учреждения в двух таблицах полностью идентичны (одинаковые названия) Таблицу base20 заполняют учреждения всякой разной информацией, ежемесячно. Сама задача заключается, что бы при запуске скрипта, происходили следующие действия: 1) Сравнить, все ли учреждения заполнили информацию, в текущем месяце 2) Если найдутся учреждения которые не заполнили информацию, отправить им уведомления по email. Первую задачу я решил следующим образом. Создал массив и заполнил его учреждениями, которые заполнили "октябрь", далее создал второй массив и заполнил его учреждениями, которые заполнили "ноябрь". Далее через операцию array_diff обработал два массива, и получил массив с учреждениями, которые не отправили информацию относительно прошлого месяца. Вот таким образом и получился массив name... Вторую задачу собственно сейчас мы и пытаемся решить. Нужно на основании полученного массива name, вытащить из таблицы update1 электронные адреса этих учреждений, и записать эти адреса в массив mail. Ну а дальше я уже знаю, как отправить электронные письма... P.S. Код (Text): $list = implode("','", $name ) $res = mysqli_query($mysqli, "SELECT mail FROM `update1` WHERE user_name IN( '$list' )"); Ругается PHP Код (Text): Parse error: syntax error, unexpected '$res' (T_VARIABLE)
писал с телефона, неудобно ; забыл PHP: $list = implode("','", $name ); --- Добавлено --- По задаче, что то типа того Код (Text): SELECT base20.name, update1.email FROM base20 LEFT JOIN update1 ON base20.name = update1.name WHERE base20.month = 'октябрь' выдаст все организации с емейлом, у которых заполнено в октябре но ваш подход в целом имеет кучу недостатков, начиная от того - что будет через год )))), когда названия месяцев начнут повторятся (поэтому нужно хранить полную дату сдачи отчета и сравнивать по тек месяцу и году типа Код (Text): WHERE MONTH(date)=MONTH(NOW()) && YEAR(date)=YEAR(NOW()), заканчивая структурой таблиц в БД, зачем update1 - непонятно... в вашем случае email нужно делать уникальным полем в таблице base20
Ещё раз спасибо. Я тоже не заметил сразу, что точка с запятой отсутствует. Теперь всё получилось. По поводу подхода, были причины именно так сделать...А все последующие года уже в другую таблицу будут записываться