2013-03-22 2 views
0

Я хочу запустить цикл foreach из базы данных, но я не знаю, как начать. У меня есть массив, который я сгенерировал из цикла в то время:PHP & MySql - массив foreach

/* mysql query for geting leave_type ID */ 

    $leaveType = mysql_query(" 
    SELECT `leave`.leave_type_id_leave_type, 
     `leave`.staff_leave_application_staff_id_staff, 
     `leave`.date, 
     `leave`.date_updated, 
     `leave`.active 
    FROM `leave` 
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    GROUP BY `leave`.leave_type_id_leave_type 
    "); 

    /* Now put all leave Type ID in an array */ 

    echo "<table>"; 
    $types = array(); 
    while($leaveFW = mysql_fetch_array($leaveType)){ 
     $types[] = $leaveFW['leave_type_id_leave_type']; 
    } 
print_r($types); 

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

$leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
month FROM `leave` 
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
and `leave`.leave_type_id_leave_type = $type"); 

Я хочу показать $leaveQ['month'] и $leaveQ['total'] в цикле Еогеасп.

Может быть мой Еогеасп, как это, но как получить $type['month'] и $type['total']:

foreach ($types as $type) 
{ 
    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as month 
    FROM `leave` WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = $type"); 
} 

ответ

2

Может youwant что-то вроде этого

foreach($types as $result) 
{ 
    $iid = $result['staff_leave_application_staff_id_staff']; 
    $type = $result['leave_type_id_leave_type']; 

    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
    month FROM `leave` 
     WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = '".$leaveFW['leave_type_id_leave_type']."'"); 


    while($row = mysql_fetch_assoc($leaveQ)) 
    { 
     echo $row['month']."<br>"; 
     echo $row['total']."<br>"; 
    } 
} 
+0

Спасибо, что работало, но почему вы используете '$ leaveFW [«leave_type_id_leave_type»] 'внутри запроса ?? '$ result' вернет идентификатор. И не нужно устанавливать $ iid и $ type, $ iid - глобальная переменная. – user007

+0

@ user1983017 что вы подразумеваете под этой строкой .. «Теперь я хочу запустить цикл foreach, который будет запрашивать код ниже для каждого идентификатора в массиве.:« Then..please уточнить его, и я отредактирую свой ответ – alwaysLearn

0
foreach($types as $type){ 
    $leaveQ = mysql_query("SELECT Count(*) as total, monthname(date) as 
    month FROM `leave` 
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
    and `leave`.leave_type_id_leave_type = $type"); 
    while($leave = mysql_fetch_assoc($leaveQ)){ 
    var_dump($leave['total'] , $leave['month']); 
    } 
    } 
2

Не делайте этого!

  • Функции mysql_ устарели от PHP 5.5!
  • Выполнение этого (получить один запрос, затем запустить другой запрос для каждой строки в цикле foreach) - это плохой подход, обычно встречающийся во многих кодах, пролетающих вокруг «сети».
  • Кроме того, я думаю, вы хотите получить счет за каждый месяц; в этом случае вам необходимо использовать предложение GROUP BY для этого

Правильный способ сделать это - использовать операции JOIN, а вместо запроса для каждой строки - только один запрос для получения всех данных.

Слепо следуя этому совету, не меняя слишком много, просто объединение двух запросов, ваш запрос должен выглядеть следующим образом:

SELECT Count(*) as total, monthname(date) as month, types.leave_type_id_leave_type 
FROM `leave` 
JOIN (SELECT DISTINCT `leave`.leave_type_id_leave_type 
    FROM `leave` 
    WHERE `leave`.staff_leave_application_staff_id_staff = $iid) as types 
    ON leave.leave_type_id_leave_type = types.leave_type_id_leave_type 
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
GROUP BY monthname(date), types.leave_type_id_leave_type 

различия в своем подходе:

  • внутренний запрос почти то же, что и ваш 1-й запрос, но
    • вместо GROUP BY, я использовал DISTINCT - в этом случае это одно и то же, но я думаю, что это проще читать, и это важный аспект!
    • я только выбрал соответствующую колонку для него (leave_type_id_leave_type)
  • я изменил внешний запрос немного более
    • джойн делает то, что заменяет «Еогеасп» подход
    • только те строки, которые " принимать во подсчет»(в данном случае, буквально :)), которые являются подходящими для внутреннего запроса
  • это будет возвращать счетчик для каждого месяца и Каждый тип.

Чтобы сделать это еще лучше:

  • Используйте правильно параметризованных подготовленные заявления: более высокую производительность, и привыкнуть к ней заставляет избегать инъекции SQL в ситуациях, когда это относится ...
    • вы может использовать PDO для этого, он не устарел ...
  • Рассматривая полученный запрос, легко видеть, что это может быть дополнительно упрощено и не нуждается в внутреннем q uery, также избавившись от одного фильтра на $ IID

 

SELECT Count(*) as total, monthname(date) as month, leave_type_id_leave_type 
FROM `leave` 
WHERE `leave`.staff_leave_application_staff_id_staff = $iid 
GROUP BY monthname(date), leave_type_id_leave_type 

Различия в настоящее время:

  • огромный скачок производительности ...
  • намного меньше, и много читаемый код

EDIT

Here is the SQL fiddle to see how this works

+0

Действительно, это было очень полезная информация, но это не решит мою проблему. Во всяком случае +1 для хорошей информации – user007

0

Если я правильно понимаю, что вы хотите, чтобы цикл через тип, найденные из вашего блока кода, а затем выдавать больше запросов к базе данных и извлекать больше данных.

Вы можете в основном повторно использовать первый блок снова коды, завернутый с петлей Еогеаспа:

foreach($types as $type){ 
    $query = mysql_query("YOUR_SQL_USING_$TYPE"); 

    while($row = mysql_fetch_array($query)){ 
     print_r($row); 
     // or print($row['COLUMN_NAME']);... 
    }  
} 
+0

Хотя это решает проблему OP, я не думаю, что это правильный подход в этом случае, и этот ответ не помогает OP делать это правильно. – ppeterka

+0

@ppeterka Я подтверждаю ваше мнение. – zaf