2016-09-23 7 views
-2

Я в основном пытаюсь создать, где дата окончания даты даты = сегодняшняя дата, но в этом случае 22/09/2016, где opmanager хранится в пользователях, получает этот адрес электронной почты и foreach opmanager, который имеет конец месяца с 22/09/2016 отправить письмо. Сценарий электронной почты, который я сделал, готов к внедрению в echoPHP foreach issue при разделении значений

Однако, когда db извлекает два разных диспетчера, только один менеджер получает электронное письмо и не отправляется в foreach opmanager.

Код ниже:

<?php 

include ("../dbconnect.php"); 

$sql='SELECT * FROM `clients` WHERE endofmonthform="22/09/2016"'; //TODAYS DATE BACK HERE! 

$result=mysql_query($sql); 

while($row=mysql_fetch_array($result)){ 

    $enddate = $row['endofmonthform']; // End 

    $startdate = $row['startofmonthform']; // Start 

    $email = $row['email']; //Email to send email to 

    $id = $row['id']; 

    $formlevel = $row['formlevel']; //To update and check formlevel 

    $sitegroupname = $row['mastersite']; 

    $manager = $row['opmanager']; 

} 

$query="SELECT userEmail FROM `users` WHERE userName='".$manager."'"; 
$resultSet = mysql_fetch_all($query); 
foreach ($query as $row) { 
    echo $row['userEmail']; //Where send email function will be 
} 
?> 

мне это нужно, чтобы отправить по электронной почте каждому менеджеру

+1

Вы пытаетесь цикл строки, а не результат набора. Кроме того, вам нужно забрать его. Посмотрите, как вы это сделаете в первом запросе ('while ($ row = mysql_fetch_array ($ resultSet)) {') – Qirel

+2

'mysql_ *' функции устарели, поскольку PHP 5.5 (и ** полностью удалены ** в PHP 7), и вы должен [прекратить использовать их] (http://stackoverflow.com/q/12859942), если сможете. Вы должны выбрать другой API, который позволит вам использовать [подготовленные операторы] (http://stackoverflow.com/q/60174/) (которые вы действительно должны * при работе с пользователем), например 'mysqli_ *' или PDO - см. [Выбор API] (http://php.net/manual/en/mysqlinfo.api.choosing.php). – Qirel

+0

да, do $ fetch = $ resultSet -> fetch_assoc(); а не foreach ($ fetch как $ row) { echo $ row ['userEmail']; } – Ognj3n

ответ

1

Помимо ошибок кодирования, причина это только отправив письмо к одному менеджеру, потому что менеджер бит выполняется только один раз. Ваш второй вопрос:

SELECT userEmail FROM `users` WHERE userName='".$manager."' 

возвращает набор пользователей, где имя пользователя равно ПОСЛЕДНЕГО $ менеджер из предыдущего цикла, поскольку этот бит кода НЕ внутри первого цикла.

Простое перемещение этого фрагмента кода внутри цикла исправит вашу первоначальную проблему. Остальные исправления можно найти ниже:

include ("../dbconnect.php"); 

$sql='SELECT * FROM `clients` WHERE endofmonthform="22/09/2016"'; //TODAYS DATE BACK HERE! 

$result=mysql_query($sql); 

while($row=mysql_fetch_array($result)){ 

    $enddate = $row['endofmonthform']; // End 

    $startdate = $row['startofmonthform']; // Start 

    $email = $row['email']; //Email to send email to 

    $id = $row['id']; 

    $formlevel = $row['formlevel']; //To update and check formlevel 

    $sitegroupname = $row['mastersite']; 

    $manager = $row['opmanager']; 


    $query="SELECT userEmail FROM `users` WHERE userName='".$manager."'"; 
    $result=mysql_query($query); 

    while($row=mysql_fetch_array($result)){ 
     echo $row['userEmail']; //Where send email function will be 
    } 

} 

Тем не менее, это все еще плохой код .... Он использует устаревший API (mysql_) и уязвимо для инъекции SQL. Посмотрите на mysqli или pdo для лучшего API и prepared statements для проблемы с SQL-инъекцией.

Если вы хотите легко использовать базу данных с PHP вы могли бы посмотреть мою pdoWrapper: https://github.com/Mastermindzh/pdoWrapper

Edit:

Как было отмечено в комментариях один может, на самом деле следует использовать присоединиться, чтобы получить эти данные. Это может быть немного больше для TS/OP, чтобы понять, в этот момент, но я добавлю его в любом случае для полноты картины:

include ("../dbconnect.php"); 

$sql='SELECT c.endofmonthform, c.startofmonthform, c.email, c.id, c.formlevel, c.mastersite, c.opmanager, u.userEmail FROM `clients` as c LEFT JOIN `users` as u on c.opmanager = u.userName WHERE endofmonthform="22/09/2016"'; //TODAYS DATE BACK HERE! 

$result=mysql_query($sql); 

while($row=mysql_fetch_array($result)){ 

    $enddate = $row['endofmonthform']; // End 

    $startdate = $row['startofmonthform']; // Start 

    $email = $row['email']; //Email to send email to 

    $id = $row['id']; 

    $formlevel = $row['formlevel']; //To update and check formlevel 

    $sitegroupname = $row['mastersite']; 

    $manager = $row['opmanager']; 

    echo $row['userEmail']; //Where send email function will be 

} 
+1

Цитирование с помощью набора результатов sql, а затем перебирание совпадающих записей из другой таблицы - это не путь. Вы когда-нибудь слышали о «join» в sql? – Shadow

+0

Приведите пример @shadow? Ive загрузил полный сценарий, который я надеюсь запустить. Ive использовал скрипт smtp, который работает, и код, используемый Риком ван Лишоутом, тянет каждую из писем. Однако не решает мою проблему .... Пожалуйста, см. Http://pastebin.com/7PD2MyuC – user3473873

+0

@ Тень, конечно, у меня есть, я не чувствовал, что это необходимо, чтобы включить его, потому что уже существует немало ошибок. –

Смежные вопросы