dronthpi05943
2016-07-27 07:04 浏览 316
已采纳

mysqli_fetch_assoc仅返回数组的第一个元素

I'm working on a project, where the logged in user should be able to post notes on the homepage, and being logged in the certain user's notes should be printed above the new note form. I've written a function for that, where the mysqli_query recognizes all the 6 entries I have, but the mysqli_fetch_assoc prints only the first note out of 6. What could I do wrong? Here is my code:

<?php    
    function find_notes_by_id($user_id) {
    global $connection;
    
    $safe_user_id = mysqli_real_escape_string($connection, $user_id);
    
    $query = 'SELECT content ';
    $query .= 'FROM notes ';
    $query .= 'WHERE user_id = '.$safe_user_id;
    $result = mysqli_query($connection, $query);
 
    //mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 6 [type] => 0 )

    confirm_query($result);

    $row = mysqli_fetch_assoc($result);
    //Array ( [content] => First! ) = it only shows the very first element
    return $row;
}
?>

<?php
$notes_set = find_notes_by_id($userRow['id']);
  foreach($notes_set as $note){
    echo $note;
    echo "<br />";
  }
?>

enter image description here

</div>
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答 默认 最新

  • 已采纳
    doubinchou4219 doubinchou4219 2016-07-27 07:09

    1.You need to iterate over your result-set object through while()

    2.Save all your data to an array and then return that array to get all records

    like below:-

    <?php    
      function find_notes_by_id($user_id) {
       global $connection;
    
        $safe_user_id = mysqli_real_escape_string($connection, $user_id);
    
        $query = "SELECT `content` FROM `notes` WHERE `user_id` = $safe_user_id";
        $result = mysqli_query($connection, $query);
    
        confirm_query($result);
    
        $final_data = array(); // create an array
        while($row = mysqli_fetch_assoc($result)){ // iterate over the result-set object to get all data
            $final_data[] = $row; //assign value to the array
        }
        return $final_data; // return array
      }
    ?>
    

    Now:-

    <?php
    $notes_set = find_notes_by_id($userRow['id']);
    
    print_r($notes_set) ; // print result to check array structure so that you can use it correctly in foreach
      foreach($notes_set as $note){
        echo $note['content'];
        echo "<br />";
      }
    ?>
    
    点赞 评论 复制链接分享
  • duanlisha2335 duanlisha2335 2016-07-27 07:08

    You can get all results like so:

    $arr = $result->fetch_all(MYSQLI_ASSOC);
    

    Or use a while loop:

    while($row = $result->fetch_assoc()){
        echo $row['content'] . '<br />';
    }
    
    点赞 评论 复制链接分享
  • doulao7572 doulao7572 2016-07-27 07:10

    Save data into an array. Use it through foreach or for loop.

    $content = [];
    while($row = mysqli_fetch_assoc($result)){
       $content[] = $row['content'];
    }
    return $content;
    
    点赞 评论 复制链接分享
  • dongyou1926 dongyou1926 2016-07-27 07:10

    Need to change the function like this

    function find_notes_by_id($user_id) {
        global $connection;
    
        $safe_user_id = mysqli_real_escape_string($connection, $user_id);
    
        $query = 'SELECT content ';
        $query .= 'FROM notes ';
        $query .= 'WHERE user_id = '.$safe_user_id;
        $result = mysqli_query($connection, $query);
    
        //mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 6 [type] => 0 )
    
        confirm_query($result);
        $row = array();
        while($result1 = mysqli_fetch_assoc($result)){
            //Array ( [content] => First! ) = it only shows the very first element
            $row[] = $result1;
        }
        return $row;
    }
    
    点赞 评论 复制链接分享
  • doulao7998636570 doulao7998636570 2016-07-27 07:13

    You have to iterate over. Problem is with this code

    $row = mysqli_fetch_assoc($result);
    return $row;
    

    Change that to

    $x = array();
    while( $row = mysqli_fetch_assoc($result))
    {
      $x[] = $row;
    }
    return $x;
    
    点赞 评论 复制链接分享
  • dqyin0101 dqyin0101 2016-07-27 07:25

    Instead declaring $connection as global pass the $connection variable to the function which would be a efficient way and get the result as array

    <?php    
                function find_notes_by_id($user_id,$connection) {
    
                $safe_user_id = mysqli_real_escape_string($connection, $user_id);
    
                $query = 'SELECT content ';
                $query .= 'FROM notes ';
                $query .= 'WHERE user_id = '.$safe_user_id;
                $result = mysqli_query($connection, $query);
    
    
                confirm_query($result);
    
             $data = array(); // create an array
           while($row = mysqli_fetch_assoc($result)){ 
             $data[] = $row; 
        }
          return $data;
            }
            ?>
    

    Now call the function like this

     <?php
    $notes_set = find_notes_by_id($userRow['id'],$connection);
      foreach($notes_set as $note){
        echo $note['content'];  
      }
    ?>
    
    点赞 评论 复制链接分享

相关推荐