【问题标题】:mysqli_multi_query() repeats the fetched with nullmysqli_multi_query() 使用 null 重复获取
【发布时间】:2018-10-22 22:04:01
【问题描述】:

我正在尝试使用 mysqli_multi_query() 从多个表中获取所有知道“Photoshop”的用户及其所有详细信息。而且我也得到了结果,但是也有一些不速之客以及正确的结果是空的。他们为什么会在这里?

代码和输出如下:

<?php
    $sql = "SELECT user_id FROM ts_users_skills WHERE skillsTeach='Photoshop'";
    if($res = mysqli_query($conn,$sql)) {
        while ($id=mysqli_fetch_array($res)) {
                $id=$id['user_id'];
                // echo($id);
                $get_teachers_details="SELECT * FROM ts_students_log WHERE user_id='$id';";
                $get_teachers_details.="SELECT * FROM ts_students_info WHERE user_id='$id';";
       if (mysqli_multi_query($conn,$get_teachers_details))
        {
            do
                {
    // Store first result set
                if ($mul_res=mysqli_store_result($conn)) {
                  // Fetch one and one row
                  while ($row=mysqli_fetch_assoc($mul_res))
                    {
                    // printf("%s\n",$row['mobile']);
                         // print_r($row);
                        echo "Id: " . $row['user_id']. " Mobile: " . $row['mobile']. "Email:-" . $row['email'] . "Name:-" .$row['name'] . "<br/>";      
                    }           
                  //            Free result set         
                  mysqli_free_result($mul_res);         
                  }
                }
    while (mysqli_next_result($conn));
}
}
}
?>

输出:

     Id: 3 Mobile: 7895447755Email:-aditya@chutiya.comName:-
     Id: 3 Mobile: Email:-Name:-Aditya Porwal
     Id: 4 Mobile: 9300010740Email:-rishabhgaandu@gmail.comName:-
     Id: 4 Mobile: Email:-Name:-Rishabh Agrawal

【问题讨论】:

  • 为什么不使用 JOIN 而不是多查询?
  • 同意@Qirel,使用联接在一个查询中获取所有信息。此外,使用准备好的查询来避免 SQL 注入。
  • 尽量避免multi_query。这些本质上是不安全的,因为您无法检查通常非常重要的任何给定语句的结果。
  • 当然!我知道有些东西是可疑的 multi_query。谢谢!

标签: php mysql mysqli mysqli-multi-query


【解决方案1】:

组合您的查询以获得一个结果集,您可以随意排序:

SELECT 
    a.`user_id`,
    b.*,
    c.*
FROM ts_users_skills a
LEFT JOIN ts_students_log b
    ON a.`user_id` = b.`user_id`
LEFT JOIN ts_students_info c
    ON a.`user_id` = c.`user_id`
WHERE a.`skillsTeach` = 'Photoshop'
ORDER BY a.`user_id`;

我使用了 LEFT JOIN,但如果所有用户在 ts_students_info 和 ts_students_info 中都有行,您可以将它们更改为仅 JOIN

编辑

要在下面的 cmets 中回答您的问题,要选择多个技能,请将 where 子句更改为:

WHERE  a.`skillsTeach` in ('Photoshop','Video Editing','Web Design')

WHERE  a.`skillsTeach` = 'Photoshop'
    OR a.`skillsTeach` = 'Video Editing'
    OR a.`skillsTeach` = 'Web Design'

【讨论】:

  • 如果我想让所有知道 Photoshop、网页设计、视频编辑的用户怎么办?我试过了,但没有用。从 ts_users_skills 中选择 a.user_id, b.*, c.* a LEFT JOIN ts_students_log b ON a.user_id = b.user_id LEFT JOIN ts_students_info c ON a.user_id = c.user_id WHERE a.skillsTeach = 'Photoshop','视频编辑','网页设计'' ORDER BY a.user_id;
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2016-10-21
  • 2021-05-07
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多