我正在尝试使用从另一个表获取的ID数组来显示数据库表中的行。我希望它显示第一行$ rowsfriend。并显示第二行,即行..........但它只显示$ rowsfriend
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "ochat";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM friends where friend1='".($_POST[id])."'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$rowsfriend = $row["friend2"];
echo $rows;
}
}
$sqll = "SELECT * FROM users WHERE id IN ($rowssfriend)";
$resultt = $conn->query($sqll);
if ($resultt->num_rows > 0) {
while($roww = $resultt->fetch_assoc()) {
$rowsss = $row["username"];
echo $rowss;
}
}
else {
?>
<h1>Register</h1>
<form action="selectfriends.php" method="post">
id:<br />
<input type="text" name="id" value="" />
<br /><br />
<input type="submit" value="enter" />
</form>
<?php
}
?>
答案 0 :(得分:1)
如果您愿意,请尝试使用此版本的代码:
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "ochat";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT users.* FROM users WHERE users.id IN (SELECT friend2 FROM friends where friend1='".($_POST[id])."')";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$rows = $row["username"];
echo $rows;
}
}
else {
?>
<h1>Register</h1>
<form action="selectfriends.php" method="post">
id:<br />
<input type="text" name="id" value="" />
<br /><br />
<input type="submit" value="enter" />
</form>
<?php
}
?>
据我所知,代码很好,问题在于变量名称拼写为@Admieus写的,但事实上在第一个循环变量$rowsfriend
的每次迭代中都被覆盖了一个新值,所以在循环结束后,$rowsfriend
包含第一个查询$sql
的结果中的最后一个ID。
上述版本只使用子查询进行一次查询,直接获取friend1
中给出的$_POST[$id]
朋友的用户名。
我希望它有所帮助。
答案 1 :(得分:1)
您可以编写此嵌套查询,而不是两个查询。
$sqll = "SELECT * FROM USERS WHERE ID IN (SELECT friend2 FROM friends WHERE friend1='".$_POST[$id]."')";
$resultt = $conn->query($sqll);
if ($resultt->num_rows > 0)
{
while($roww = $resultt->fetch_assoc())
{
$rowsss = $row["username"];
echo $rowss;
}
}
希望这可以解决您的问题。
答案 2 :(得分:0)
第二个循环中存在拼写错误。
您将值指定给$rowsss
并尝试从$rowss
回显注意差异。
此外,您将fetch_assoc结果分配给$roww
,然后尝试使用$row
再次调用它。
$sqll = "SELECT * FROM users WHERE id IN ($rowsfriend)";
$resultt = $conn->query($sqll);
if ($resultt->num_rows > 0) {
while($roww = $resultt->fetch_assoc()) {
$rowsss = $roww["username"];
echo $rowsss;
}
}
改进之处在于:检查变量名称,使名称易于理解且难以混淆。
例如,包含sql查询的变量不应该命名为$sql
,更糟糕的是第二个查询不能命名为sqll
。而是使用暗示你正在做什么的名字。
$querySelectFriendsFrom = "SELECT * FROM users WHERE id IN ($friendId)";
不要把这看作是一个严格的规则,它更像是防止愚蠢错误的提示。
更新:查询中还有一个引用rowssfriend
而非rowsfriend
的类型。修正如上。