【问题标题】:Adding 2 array tables together将 2 个数组表加在一起
【发布时间】:2018-10-16 18:31:52
【问题描述】:

我试图从我的网站获取所有用户状态。 这是我的桌子

如果我添加另一个用户,我的用户名将添加到 user1 如果另一个用户添加我,则用户名将添加到 user1 并我的到 user2

所以我需要尝试从 user1 和 user2 中获取所有被接受的 id 是 1

我喜欢这样

$id = $_SESSION['user_id'] ;
$yes = '1';
     $query = $db2->prepare("SELECT * FROM friend_requests WHERE (user1='".$id."' OR user2='".$id."') AND accepted = '".$yes."'");
    $query->execute();
 foreach ($query as $row) {
        print $row['user1'] . "\t";
        print $row['user2'] . "\t";

    }

但是现在我有 $row['user2'] 和 $row['user1'] 有没有办法将它们组合在一起?所以我可以简单地做一个 pdo 循环选择状态是 id = that 吗?

我试图获取所有状态为 id = $row['user1'] 或 $row['user2'] 但我不想在我的 pdo 选择中使用或。

【问题讨论】:

  • 您正在使用->prepare(),但仍将数据直接注入查询?为什么??
  • 我只使用用户 ID,它在进入会话之前是安全的。他们$是的,我做我自己
  • 在 PHP 中进行查询的一个好方法是总是EVERY LAST QUERY使用预先准备好的语句> 这样,如果您将查询更改为使用用户提交的数据,就不会意外打开安全漏洞

标签: php mysql pdo


【解决方案1】:

您可以按如下方式编辑您的 SQL:

"SELECT id, (CASE WHEN user1 = $id THEN user2 ELSE user1 END) as user, time FROM friend_requests WHERE (user1 = $id OR user2 = $id) AND accepted = 1"

这将只返回 ID 为 $ID 的用户已接受的朋友。

这里的概念证明:http://www.sqlfiddle.com/#!9/e0b337/2

编辑:正如已经指出的那样,您应该绑定参数以防止 SQL 注入,但这超出了您的问题范围。

编辑 2:根据您下面的第二个问题,您可以执行两个循环,或者,如果表相对于可用内存较小,您可以执行 fetchAll(),如下所示。

$id = $_SESSION['user_id'] ;
$query = $db2->prepare("SELECT (CASE WHEN user1 = :userid THEN user2 ELSE user1 END) as user FROM friend_requests WHERE (user1 = :userid OR user2 = :userid) AND accepted = 1");
$query->bindParam(':userid', $id, PDO::PARAM_INT);
$query->execute();
$friends = $query->fetchAll(PDO::FETCH_ASSOC);
$friends[] = array('user'=>$id);
foreach ($friends as $k=>$friend) {
    echo $friend . "\t";
}

【讨论】:

  • 那么所有的都在 $row['user'] 中??刚刚打印了 $row['user'] 就在那里 :) 数据库中有重复项,上面的代码没有显示哪个好。
  • 是的,id=$id 的用户所有接受的朋友都将在 $row['user'] 变量中。
  • 有什么办法可以将我自己的 id 添加到 $row['user'] 以便它显示我自己的状态?试过 array_push($row['user'], '12');但没有添加 12 个
  • 是的,您可以将查询更改为:"SELECT $id as me, id, (CASE WHEN user1 = $id THEN user2 ELSE user1 END) as user, time FROM friend_requests WHERE (user1 = $id OR user2 = $id) AND accepted = 1"
  • 没用 :( 显示其他人但不是我也删除了一些
【解决方案2】:

你可以使用UNION:

<?php

$id = $_SESSION['user_id'] ;
$yes = '1';
$query = $db2->prepare("SELECT id,user2 AS `user` FROM `friend_requests` WHERE user1=:user1 AND accepted={$yes} UNION SELECT id,user1 AS `user` FROM `friend_requests` WHERE user2=:user2 AND accepted={$yes}");
$query->bindParam(':user1', $id, PDO::PARAM_INT);
$query->bindParam(':user2', $id, PDO::PARAM_INT);

$query->execute();
foreach ($query as $row) {
    print $row['user'] . "\t";
}

示例:sqlfiddle

【讨论】:

  • 有什么办法可以将我自己的 id 添加到 $row['user'] 以便它显示我自己的状态?试过 array_push($row['user'], '12');但没有添加 12 个
猜你喜欢
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多