【问题标题】:Mysqli_query inside of a foreach loopforeach 循环中的 Mysqli_query
【发布时间】:2015-08-26 10:09:46
【问题描述】:

我在 foreach 循环中的 mysqli_query 遇到问题,我首先从表中获取字符串,然后将其分成数组。然后我尝试遍历数组并在循环内调用查询。

$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);

对于这个用户,语言是德语、意大利语、丹麦语和英语,但是$posts 数组只包含从第一种语言(德语)中找到的第一个帖子,有人可以帮忙吗?我正在尝试获取$userLangs 数组中每种语言的所有帖子。

它正在通过 foreach 循环,因为每次回显的 $lang 变量都会发生变化,但查询仍然无法正常工作。

感谢您的帮助!

【问题讨论】:

  • 在 $userLangs 上使用 implode 并更改您的查询 WHERE Language IN.. 无需多次访问数据库,至于您的问题,每次迭代都会覆盖 $getLangPosts
  • 这是一种非常缓慢的方法。加入表格并进行一次查找。

标签: php mysql arrays mysqli foreach


【解决方案1】:
select posts.* from posts
left join users on users.language=posts.language
where users.username='your_desiredusername'
group by users.language;

只需尝试通过填写用户名将其作为单个查询运行 无需多次查询

【讨论】:

  • 这是否考虑到 user.languages 字段中有多种语言的事实? :)
  • 我试过 $sql = "select posts.* from posts left join users on users.Languages=posts.Language where users.username='$username' group by users.Language"; $getLangPosts = mysqli_query($con, $sql); while($row1 = mysqli_fetch_assoc($getLangPosts)){ array_push($posts, $row1['Language']); } print_r($posts); 并返回 mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given 对格式化感到抱歉
  • 那么,结果如何? ,你得到你想要的了吗
  • 它返回了上一条评论的错误信息mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given
  • 试试 echo $sql;并复制返回的字符串并在您的 phpmyadmin 中尝试该字符串,请告诉我结果...
【解决方案2】:

您可以通过执行 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);
    }
}

【讨论】:

    【解决方案3】:

    更新
    请参阅此代码:

    <?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 查询实际返回的内容会有所帮助。

    【讨论】:

    • 我做了str替换和分解,因为用户表中的语言字段就像German, Italian, Danish, French,所以我想去掉空格然后放入一个数组中循环跨度>
    • 你是救生员!非常感谢!我被这个问题困扰了很久:D
    【解决方案4】:

    mysqli_fetch_assoc 在每次调用时只获取一行,您需要像这样使用它:

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

    【讨论】:

    • 感谢您的回答!这只是现在将语言为德语的帖子添加到数组中,不知道是否与查询有关?多年来我一直对此感到困惑
    【解决方案5】:

    需要循环内部查询来获取列数据

    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']);
        }
    

    或者你应该使用 IN 子句而不是循环

    $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']);
     }
    

    【讨论】:

    • 感谢您的回答!现在它获得了不止一个德语帖子,但它只收到了德语帖子。我认为与查询有关?只是一个猜测。将尝试 IN 子句:)
    • 我尝试了第二个解决方案,它不会抛出错误,但是当我尝试 print_r 它时数组是空的:/
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2012-07-19
    • 2013-10-01
    相关资源
    最近更新 更多