使用数组从mysql表中选择

时间:2015-01-10 06:45:18

标签: php mysql select

我正在尝试使用从另一个表获取的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
}

?>

3 个答案:

答案 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的类型。修正如上。