【问题标题】:Issues getting bind_results to work in while loop让 bind_results 在 while 循环中工作的问题
【发布时间】:2015-12-08 03:09:32
【问题描述】:

我正在尝试遍历我的 bind_results,但它并没有像我需要的那样工作。我已经尝试了这 20 种不同的方法,结果总是一样的。我只得到$survey_user_id$survey_result 的第一条记录来回显。

另外,当我像在查询中那样执行COUNT 时,是否也需要循环遍历它?因为到目前为止,当 rating_draft_result.id 有多个 id 时,它只计算 1 条记录。

try {
$survey_title_stmt = $con->prepare("SELECT COUNT(rating_draft_result.id), rating_draft_result.user_id, rating_draft_result.result 
                    FROM rating_draft_result
                    INNER JOIN users ON
                    rating_draft_result.user_id = users.id
                    AND rating_draft_result.result = users.id");

if ( !$survey_title_stmt || $con->error ) {
     // Check Errors for prepare
        die('Survey SELECT total count prepare() failed: ' . htmlspecialchars($con->error));
    }
if(!$survey_title_stmt->execute()) {
        die('Survey SELECT total count execute() failed: ' . htmlspecialchars($survey_title_stmt->error));
}
 $survey_title_stmt->store_result();
} catch (Exception $e ) {
    die("Survey SELECT total count: " . $e->getMessage());
}
    $survey_title_stmt->bind_result($survey_id, $survey_user_id, $survey_result);
while ($survey_title_stmt->fetch()) {
    $survey_id;
    $survey_user_id;
    $survey_result;
}
?>              
                <div class="survey_results_out">
                    <div id="survey_results_title">Survey Results</div>
                        <div class="survey_popup_container">
                            <a class="survey_popup" href="javascript:void(0)">Who drafted best results</a>
                            <div id="">Users that completed this survey</div><?php echo $survey_id; ?>
                            <div class="survey_popup_wrap light_admin">
                                <a class="close_survey_popup" href="javascript:void(0)">X</a>
                                <div id="indexpopupTitleWrap">
                                    <div id="indexpopupTitle">Results of who drafted the best</div>
                                </div>
                                <div id="survey_results_content_wrap">
                                    <div id="survey_results_content_usernames">
<?php                                   
    echo $survey_user_id;
    echo $survey_result;
?>

我的数据库表是这样的...

users
CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `firstname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `lastname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `phone_number` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
 `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `password` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `salt` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
 `joined` datetime NOT NULL,
 `group` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

rating_draft_result
CREATE TABLE `rating_draft_result` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `result` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

期望的输出:

users  id``firstname``lastname``email``phone_number``username``password``salt``joined group

 1   Jack   Johnson  jack@email.com  2222  jackusername  ffd  fdddfd  today  1
 10   Tom   Thompson  fdfdfddf@fef.com 5555  Tomusername


rating_draft_result
     `id` `user_id` `result`
      20    1         10

我希望能够将 rating_draft_result 的 user_id 和 result 与用户表的 id 字段匹配。

所以我想获取 jackusername 和 tomusername 字段。

【问题讨论】:

  • 当我将它输入到 phpmyadmin SQL 中时,我只得到一个结果。那么在我的查询中是什么导致这只有SELECT 一个结果?
  • 您的主选择有 COUNT(一个聚合函数),没有 group by 子句。实际上,这是获取非空 rating_draft_result.id 的计数以及 rating_draft_result.user_idrating_draft_result.result 的随机值。可能只需要 GROUP BY rating_draft_result.user_id, rating_draft_result.result 添加到查询中
  • 喜欢这个? SELECT COUNT(rating_draft_result.id), rating_draft_result.user_id, rating_draft_result.result FROM rating_draft_result INNER JOIN users ON rating_draft_result.user_id = users.id AND rating_draft_result.result = users.id GROUP BY rating_draft_result.user_id, rating_draft_result.result
  • 是的,就像那样。聚合函数将所有结果汇总到一行(在所有行上执行它们的函数)。您可以使用 GROUP BY 将它们汇总到多组行中。
  • @Kickstart 我试过了,但没有帮助,

标签: php mysql loops while-loop bind


【解决方案1】:

不太确定您想要该数据是什么。

但是以下可能会有所帮助:-

这会得到 rating_draft_result.id 和 2 个用户名

SELECT rating_draft_result.id, u1.username, u2.username 
FROM rating_draft_result
INNER JOIN users u1 ON rating_draft_result.user_id =  u1.id
INNER JOIN users u2 ON rating_draft_result.result = u2.id

这将获取 rating_draft_result 表中每对用户名的 rating_draft_result.id 计数

SELECT COUNT(rating_draft_result.id), u1.username, u2.username 
FROM rating_draft_result
INNER JOIN users u1 ON rating_draft_result.user_id =  u1.id
INNER JOIN users u2 ON rating_draft_result.result = u2.id
GROUP BY u1.username, u2.username 

【讨论】:

  • 我做了一个调查。 rating_draft_result.user_id 是填写的用户id。 rating_draft_result.result 是他们选择的用户的 ID。在我的用户表中,id 是用户的 id。所以,我只是想将rating_draft_result.user_idrating_draft_result.result 与该users.id 匹配,这样我就可以调用用户名了。
  • 那么可能是第二个查询。
  • 我都试过了。两者都只回显一个用户名。第一个显示计数为 26,而应该是 2。我认为它是在计算 users 表和 rating_draft_result 表中的记录数量。它也只显示 user_id 和结果的一个用户名。第二个查询仅显示一个用于计数。它也只显示一个 user_id 和结果记录。
  • 你能把表格和几个示例行放到sqlfiddle.com 上来演示这个问题。如果我正确理解您的数据,这两个查询都不应该给您您所说的内容。可能需要我一段时间才能回复(即将回家,所以稍后再查看)。
  • 这就是第二个所做的 - sqlfiddle.com/#!9/89be1/6 。除非您希望计数列是所有匹配项的计数,或者一个用户的所有匹配项,而不是所有匹配组合的计数。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 2011-06-19
  • 2016-06-11
  • 2016-09-27
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多