在while循环语句中运行第二个查询后,如何再次使用第一个查询的id值$row['id']
?为了向您展示我的意思,下面是我正在尝试做的示例代码。
我希望我解释得对。
这是代码。
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"SELECT users.*
FROM users
WHERE user_id = 4");
if (!$dbc) {
// There was an error...do something about it here...
print mysqli_error($mysqli);
}
while($row = mysqli_fetch_assoc($dbc)) {
echo '<div>User: ' . $row['id'] . '</div>';
echo '<div>Link To User' . $row['id'] . '</div>';
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$dbc2 = mysqli_query($mysqli,"SELECT COUNT(cid) as num
FROM comments
WHERE comments_id = $row[id]");
if (!$dbc2) {
// There was an error...do something about it here...
print mysqli_error($mysqli);
} else {
while($row = mysqli_fetch_array($dbc2)){
$num = $row['num'];
}
}
echo '<div>User ' . $row['id'] . ' Comments# ' . $num . '</div>';
}
答案 0 :(得分:3)
呃....你为什么不把你的第二个“行”变量变成其他东西? $ 2行?我对你的问题感到有点困惑......
答案 1 :(得分:2)
每当你看到嵌套查询时 - 你知道你做错了什么。没有例外。
您的查询必须是这样的(我不确定列名,但希望您有一个想法):
$sql = "SELECT users.*, COUNT(cid) as num
FROM users LEFT JOIN comments ON comments_id = id
WHERE user_id = 4
GROUP BY cid";
$dbc = mysqli_query($sql);
if (!$dbc) trigger_error(mysqli_error($mysqli).$sql);
(请注意,我先为变量分配了一个查询。这对于调试来说非常好。总是这样做)
虽然我根本不理解第一个循环的含义。您的第一个查询不会只返回一行吗?为什么要循环呢?只需获取一行然后在输出中使用。
正如Jan在评论中指出的那样,您的主要问题是重新打开数据库连接。虽然必须只打开一次。每次运行查询时都不必连接到数据库。只做一次。
你正在学习的书是什么?
答案 2 :(得分:0)
我想你在这里问错了。 是的,您可以在嵌套查询中使用$ row ['id']。您可以使用'。'将其连接到查询字符串。操作
$dbc2 = mysqli_query($mysqli,"SELECT COUNT(cid) as num
FROM comments
WHERE comments_id = ".$row['id']);
然而这是可怕的。您还应该只使用一个连接并将变量存储在一个中心位置。
您应该将查询更改为此类(未测试):
SELECT
users.*,
(SELECT count(*)
FROM comments
WHERE comments.user_id = users.user_id) AS 'comment_count'
FROM users
LEFT JOIN comments ON
comments.user_id = user.user_id
WHERE users.user_id = 4;
通过添加select语句作为计数字段,您可以在单个查询中获得所需的一切。 这应该避免所有那些丑陋的循环。如果你在循环中进行这些查询,那么它将非常缓慢,并且通常有一种方法可以在一个更复杂的查询中执行相同的操作。
答案 3 :(得分:0)
就个人而言,我个人避免使用像$ row和$ result这样的通用变量名称 - 当你做这样复杂的循环时,你会变得不稳定,并且通常使用具有描述性名称的变量$ user或$ comment。
此外 - @Keyo关于使用子查询的观点将有助于显着减少您必须对数据库进行的查询次数。
答案 4 :(得分:-1)
我不知道你的表的结构是什么,所以我认为 id 实际上是 user_id 因为我相信你试图将用户与其关联评论。也许你在重写代码时将错误发布在这里?无论如何,我的最后一点将基于这些假设。
无需重新连接到循环内的同一数据库。
您的第二个循环不应该覆盖$ row数组。请使用$ row2来防止头痛。
如上所述,您可以使用LEFT JOIN或子查询在单个查询中完成所有工作。
您的第一个查询会返回一条记录,因此无需循环显示。
这是您完全重写的代码,未经过测试,并假设您希望根据我在第一段中的假设显示用户数据。
$ mysqli = mysqli_connect(“localhost”,“root”,“”,“sitename”); $ dbc = mysqli_query($ mysqli,“SELECT users。*, COUNT(cid)AS号 FROM users LEFT JOIN comments on comments_id = user_id WHERE user_id = 4 GROUP BY users.user_id“);
if(!$ dbc){ //有一个错误......在这里做些什么...... print mysqli_error($ mysqli); }
if($ row = mysqli_fetch_assoc($ dbc)){ echo'User:'。 $ row ['user_id']。 ''; echo'Link To User'。 $ row ['user_id']。 ''; 回声'用户'。 $ row ['user_id']。 ' 评论# ' 。 $ num。 ''; }
下次请提供您的桌面结构,以便我们为您的问题提供更准确的解决方案。
我会在这里解释一下,因为我看到你们中的一些人在你对这篇文章的回答中多次引用同样的错误。
这是您在使用引号时告诉PHP的内容:
单引号:请勿在此解析。
双引号:请解析引号内的内容。
无引号:这是一个常数或数字,如果它只是一个常数,请解析。
当您使用数组时,如果没有任何要解析的内容,方括号内的元素应该是单引号。如果有数字或常数,您可以删除引号。例如:
// If your string is double quoted, you use regular brackets to encapsulate the array
$sql = "SELECT * FROM tableA WHERE id = {$myarray['id']}";
或者,还有另一种类似的方法:
$sql = "SELECT * FROM tableA WHERE id = ".$myarray['id'];
也可以写成:
$sql = 'SELECT * FROM tableA WHERE id = '.$myarray['id'];
另外两个例子:
// This is correct
echo $myarray[5];
// If you are using constants, this is correct too
define('MYCONSTANT', 5);
echo $myarray[MYCONSTANT];
// This shouldn't be used, because 'name' isn't a constant...
echo $myarray[name];
// Use this instead...
echo $myarray['name'];
// Or, like I explained above, escape the array
echo "My name is {$myarray['name']}";
希望它有所帮助。