2015-08-26 2 views
0

У меня возникают проблемы с mysqli_query изнутри цикла foreach, сначала я получаю строку из таблицы, а затем разделяю ее на массив. Затем я пытаюсь выполнить цикл через массив и вызывать запрос внутри цикла.Mysqli_query внутри цикла foreach

$langs_result = mysqli_query($con, "SELECT Languages FROM users WHERE Username = '$username'"); 

    $row = mysqli_fetch_assoc($langs_result); 

    $langs = $row['Languages']; 
    $userLangs = str_replace(" ","",$langs); 
    $userLangs = explode(",",$langs); 
    print_r($userLangs); 
    $posts = array(); 

    foreach($userLangs as $lang){ 
     echo "$lang <br>"; 
     $sql = "SELECT * FROM posts WHERE Language = '$lang'"; 
     $getLangPosts = mysqli_query($con, $sql); 
     array_push($posts, mysqli_fetch_assoc($getLangPosts)); 
    } 

    print_r($posts); 

для этого пользователя langusges является немецким, итальянским, датским и английским, но $posts массива содержит только первый пост нашел первого язык (немецкого), может кто-нибудь помочь? Я пытаюсь получить все сообщения для каждого языка в массиве $userLangs.

Просматривает цикл foreach, так как переменная $lang меняется, но запрос все еще не работает должным образом.

Спасибо за помощь!

+0

Использование взрываются на $ userLangs и изменить свой запрос WHERE Язык IN .. Нет необходимости ударить дб несколько раз, по вашей проблеме, $ getLangPosts перезаписывается для каждой итерации – Mihai

+0

Это очень медленный способ сделать это. Присоединитесь к столам и сделайте только один поиск. – Popnoodles

ответ

0

UPDATE
Смотрите этот код:

<?php 

$langs_result = mysqli_query($con, "SELECT Languages FROM users WHERE Username = '$username'"); 

$row = mysqli_fetch_assoc($langs_result); 

$langs = $row['Languages']; 

// $langs = 'German, Italian, Danish, French'; added this to run the test 

// $userLangs = str_replace(" ","",$langs); this is not needed, see the explode below 
$userLangs = explode(", ",$langs); 

foreach($userLangs as $lang){ 
    echo $lang; 
    $sql = "SELECT * FROM posts WHERE Language = '$lang'"; 

    $getLangPosts = mysqli_query($con, $sql); // this is the result of the select * 
    while($post = mysqli_fetch_assoc($getLangPosts)){ // iterate over all the results 
     $postField = $post["yourChoiceField..say..Title"]; // get something from each row 
     array_push($posts, $title); // push into array 
    } 
} 

print_r($posts); 

Поскольку первоначальный выбор основан на username я не считаю, что первый цикл необходимо, чтобы ваш код был на правильном пути.
Второй цикл был необходим, чтобы перебирать столбцы и поле для заполнения массива $posts.


Вы должны выполнить mysqli_fetch_assoc в цикле

$langs_result = mysqli_query($con, "SELECT Languages FROM users WHERE Username = '$username'"); 

while($row = mysqli_fetch_assoc($langs_result)){ 

    $langs = $row['Languages']; 

    $userLangs = str_replace(" ","",$langs); // i don't get why you are doing this though 
    $userLangs = explode(",",$langs); 
    print_r($userLangs); 

    $posts = array(); 

    foreach($userLangs as $lang){ 
     echo "$lang <br>"; 
     $sql = "SELECT * FROM posts WHERE Language = '$lang'"; 
     $getLangPosts = mysqli_query($con, $sql); 
     array_push($posts, mysqli_fetch_assoc($getLangPosts)); 
    } 

    print_r($posts); 
} 

Это помогло бы знать, как что select запрос фактически возвращает.

+0

Я заменяю и взрываю str, потому что поле языков в пользовательской таблице похоже на «немецкий, итальянский, датский, французский», поэтому я хотел избавиться от пробелов, а затем положить в массив, чтобы пройти через – angusVen

+0

Вы спасатель жизни! Спасибо огромное! Я застрял в этом вопросе целую вечность: D – angusVen

+0

добро пожаловать! –

0

Вы должны цикла внутренний запрос, чтобы получить данные столбца

foreach($userLangs as $lang){ 
     echo "$lang <br>"; 
     $sql = "SELECT * FROM posts WHERE Language = '$lang'"; 
     $getLangPosts = mysqli_query($con, $sql); 

     while($row1 = mysqli_fetch_assoc($getLangPosts)) 
       array_push($posts, $row1['YOUR_COLUMN_NAME']); 
    } 

ИЛИ вы должны использовать в пункт вместо цикла

$langs_result = mysqli_query($con, "SELECT Languages FROM users WHERE Username = '$username'"); 

while($row = mysqli_fetch_assoc($langs_result)){ 

$langs = $row['Languages']; 
$userLangs = str_replace(" ","",$langs); 
$userLangs = explode(",",$langs); 
print_r($userLangs); 
$posts = array(); 

$sql = "SELECT * FROM posts WHERE Language IN ('".implode(',',$userLangs)."')"; 
     $getLangPosts = mysqli_query($con, $sql); 

     while($row1 = mysqli_fetch_assoc($getLangPosts)) 
       array_push($posts, $row1['YOUR_COLUMN_NAME']); 
} 
+0

Спасибо за ответ! Теперь у него есть больше одного поста для немецкого, но это только получение немецких. Я думаю, что есть что-то делать с запросом?Просто догадка. Попробует предложение IN :) – angusVen

+0

Я дал второе решение go и оно не бросает и ошибок, но массив пуст, когда я пытаюсь 'print_r' его:/ – angusVen

0

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

while ($row_new = mysqli_fetch_assoc($getLangPosts)){ 
    array_push($posts, $row_new); 
} 
+0

Спасибо за ответ! Это только добавление сообщений, где язык является немецким для массива, я не знаю, связано ли это с запросом? Я был смущен об этом в течение целых возрастов. – angusVen

1
select posts.* from posts 
left join users on users.language=posts.language 
where users.username='your_desiredusername' 
group by users.language; 

Просто попробуйте запустить это как один запрос, заполнив имя нет необходимости многократных запросов

+0

это учитывает тот факт, что в поле user.languages ​​имеется несколько языков? :) – angusVen

+0

да, он принимает во внимание, пожалуйста, попробуйте один раз –

+0

Я пробовал '$ sql =" выбирать сообщения. * Из сообщений left присоединяется к пользователям пользователей.Languages ​​= posts.Language где users.username = '$ username' группа пользователей. Язык "; $ getLangPosts = mysqli_query ($ con, $ sql); while ($ row1 = mysqli_fetch_assoc ($ getLangPosts)) { array_push ($ posts, $ row1 ['Language']); } print_r ($ сообщений); ' и Он дал' mysqli_fetch_assoc() ожидает параметр 1, чтобы быть mysqli_result, булево given' Сорри О форматировани – angusVen

1

Вам избежать многочисленных запросов, делая JOIN, используя FIND_IN_SET в соответствии с вашей запятую. Вероятно, вам нужно использовать REPLACE, чтобы избавиться от лишних пробелов в списке, разделенном запятыми.

Тогда вы можете просто цикл вокруг, чтобы отобразить данные, отображая язык на изменение языка: -

<?php 

$sql = "SELECT a.Languages AS user_languages, 
       b.* 
     FROM users a 
     LEFT OUTER JOIN posts b 
     ON FIND_IN_SET(b.Language, REPLACE(a.Languages, ' ', '')) 
     WHERE a.Username = '$username' 
     ORDER BY b.Languages"; 

$langs_result = mysqli_query($con, $sql); 

if($row = mysqli_fetch_assoc($langs_result)) 
{ 
    print_r(explode(', ', $row['user_languages'])); 
    $prev_langauge = ''; 
    while($row = mysqli_fetch_assoc($langs_result)) 
    { 
     if ($prev_langauge != $row['Languages']) 
     { 
      if ($prev_langauge != '') 
      { 
       print_r($posts); 
      } 
      $posts = array(); 
      echo $row['Languages']."<br>"; 
      $prev_langauge = $row['Languages']; 
     } 
     array_push($posts, mysqli_fetch_assoc($row)); 
    } 
    if ($prev_langauge != '') 
    { 
     print_r($posts); 
    } 
} 
Смежные вопросы