2014-09-24 6 views
1

Это сложный foreach внутри цикла if внутри цикла, и по какой-то причине он дублирует результаты и добавляет их каждый раз, когда он запускает цикл. Код и выход следующим образом:php mysql foreach loop duplicate results

$timezonedate = date('Y-m-d'); 
$yesterday = date('Y-m-d', strtotime('-1 days')); 
$tomorrow = date('Y-m-d', strtotime('+1 days')); 

$timezonesql = "SELECT contacts.id AS contact_id, contacts.cbdate AS cbdate, contacts.cbtime AS cbtime, contacts.firstName AS contact_firstName, contacts.lastName AS contact_lastName, contacts.email AS contact_email, contacts.tel1 AS tel, contacts.rep AS contact_rep, members.id AS member_id, members.firstName AS member_firstName, members.lastName AS member_lastName, members.email AS member_email, members.timezone AS timezone FROM contacts INNER JOIN members ON contacts.rep = members.id WHERE contacts.cbdate = '$timezonedate' || contacts.cbdate = '$yesterday' || contacts.cbdate = '$tomorrow' ORDER BY contacts.id ASC"; 

$timezoneresult = mysql_query($timezonesql, $link); 

if(mysql_num_rows($timezoneresult) == 0) { 

} 

else 

{ 

while($timezoneRow = mysql_fetch_array($timezoneresult)) { 

     date_default_timezone_set($timezoneRow['timezone']); 

     $nowdate = date('Y-m-d'); 
     $beforetime = date('H:i:59', time() - 1*60); 
     $aftertime = date('H:i:00', time() + 1*60); 

     if($timezoneRow['cbdate'] = $nowdate && $timezoneRow['cbtime'] > $beforetime && $timezoneRow['cbtime'] < $aftertime) { 

         $contactid[] = $timezoneRow['contact_id']; 
         $contactemail[] = $timezoneRow['contact_email']; 
         $contactfirstName[] = $timezoneRow['contact_firstName']; 
         $contactlastName[] = $timezoneRow['contact_lastName']; 
         $memberemail[] = $timezoneRow['member_email']; 

       foreach($contactid as $key=>$val) { 
        echo "".$contactfirstName[$key]." ".$contactlastName[$key]." ".$memberemail[$key]."<br>"; 
    }  
} 
else {} 
} 
} 
exit; 

выход:

микки маус [email protected]

микки маус [email protected]
Минни Маус Минни @ электронной почты. com

mickey mouse [email protected]
minnie mouse minnie @ Email.com
Donald Duck [email protected]

микки маус [email protected]
Минни мышь [email protected]
Donald Duck [email protected]
Гая собака [email protected]

Я искал аналогичные вопросы здесь и не смог найти тот, который имел смысл исправить мою проблему. Есть идеи??

Отказ от ответственности: Я знаю, что должен использовать подготовленные заявления, и я начну, как только этот проект будет завершен.

+0

@DonCallisto contact_id и member_id уникальны. –

+0

Пожалуйста, [не используйте 'mysql_ *' функции в новом коде] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php). * Они больше не поддерживаются и [официально устарели] (https://wiki.php.net/rfc/mysql_deprecation) *. См. [Красная рамка] (http://uk.php.net/manual/en/function.mysql-connect.php)? Узнайте о [подготовленных заявлениях] (http://en.wikipedia.org/wiki/Prepared_statement) и используйте [PDO] (http://us1.php.net/pdo) или [MySQLi] (http: // us1.php.net/mysqli). [Эта статья] (http://php.net/manual/en/mysqlinfo.api.choosing.php) поможет вам решить, какой из них. –

+2

Даже если вы добавите оговорку в свой вопрос, вы не сможете остановить ненавистника mysql. Когда-либо. –

ответ

2

Ваш цикл Еогеасп должен быть вне цикла в то время:

while($timezoneRow = mysql_fetch_array($timezoneresult)) { 

     date_default_timezone_set($timezoneRow['timezone']); 

     $nowdate = date('Y-m-d'); 
     $beforetime = date('H:i:59', time() - 1*60); 
     $aftertime = date('H:i:00', time() + 1*60); 

     if($timezoneRow['cbdate'] = $nowdate && $timezoneRow['cbtime'] > $beforetime && $timezoneRow['cbtime'] < $aftertime) { 

         $contactid[] = $timezoneRow['contact_id']; 
         $contactemail[] = $timezoneRow['contact_email']; 
         $contactfirstName[] = $timezoneRow['contact_firstName']; 
         $contactlastName[] = $timezoneRow['contact_lastName']; 
         $memberemail[] = $timezoneRow['member_email']; 

} 
else {} 
} 

foreach($contactid as $key=>$val) { 
     echo "".$contactfirstName[$key]." ".$contactlastName[$key]." ".$memberemail[$key]."<br>"; 
} 
2

Вы используете свой цикл Еогеасп в неправильном месте - вы должны поставить его вне цикла while. Плюс - почему вы дублируете многие переменные? Это можно сделать просто так (сохранение соответствующих строк в одном массиве, а не 5 массивов :), например:

$contacts = array(); 
while($timezoneRow = mysql_fetch_array($timezoneresult)) { 

    date_default_timezone_set($timezoneRow['timezone']); 
    $nowdate = date('Y-m-d'); 
    $beforetime = date('H:i:59', time() - 1*60); 
    $aftertime = date('H:i:00', time() + 1*60); 

    if($timezoneRow['cbdate'] = $nowdate && $timezoneRow['cbtime'] > $beforetime && $timezoneRow['cbtime'] < $aftertime) { 
    $contacts[] = $timezoneRow; // this is enough! 
    } 
    else {} 
} // end while loop 

//print desired data 
foreach($contacts as $key=>$contactData) { 
    echo "".$contactData['contact_firstName']." ".$contactData['contact_lastName']." ".$memberemail['member_email']."<br>"; 
}