根据 INNER JOIN 中的 SESSION 值显示两个不同的值

Posted

技术标签:

【中文标题】根据 INNER JOIN 中的 SESSION 值显示两个不同的值【英文标题】:Showing two different values depending on SESSION value in INNER JOIN 【发布时间】:2020-03-21 22:36:24 【问题描述】:

我有两个不同的表,一个命名用户,另一个命名事务。交易包含 wallet1、wallet2、金额。用户包含用户详细信息,例如名字、姓氏和钱包。我正在尝试显示相应的名字和姓氏,具体取决于交易中的 SESSION_wallet 是否等于 wallet1 或 wallet2。我尝试搜索了一段时间,并想出了一个解决方案,可以为进行转移的名字和姓氏显示正确的显示名称,但是,我试图让它显示“转移到:”的正确值

这是我的一些代码,可以更好地理解我的意思:

mysqli 查询:

$result2 = mysqli_query($link, "SELECT * FROM transactions INNER JOIN users ON transactions.wallet1 = users.wallet WHERE transactions.wallet1 = '" . $_SESSION["wallet"] . "' OR transactions.wallet2 =  '" . $_SESSION["wallet"] . "' Order by transactions.id DESC LIMIT 5 ");

php 代码:

<?php  
if(mysqli_num_rows($result2) > 0)  
  
    while($row = mysqli_fetch_array($result2))  
      
    ?>  

需要显示转​​出和转入的表格:

<?php
if ($_SESSION["wallet"] == $row["wallet1"]) 
    echo "<td>Transfer to ".$row["firstname"]." ".$row["lastname"]."</td>";

else if ($_SESSION["wallet"] == $row["wallet2"])  
    echo "<td>Transfer from ".$row["firstname"]." ".$row["lastname"]."</td>";

?>

现在我的表格只显示进行转移的用户的名字和姓氏,但是,我需要它来显示进行交易的用户的名字和姓氏。 else if 代码工作正常,但第一部分没有显示相应的值。

【问题讨论】:

是进入if分支只输出echo的静态部分还是根本不进入分支? 进入if分支,但输出会话的名字和姓氏。它必须输出 transactions.wallet2 的名字和姓氏。 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或MySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough! 谢谢,但现阶段安全并不重要。我只想现在学习,然后在掌握了窍门后继续改进代码:-) 【参考方案1】:

您需要将JOIN 您的transactions 表到您的users 表两次,一次以获取每个用户名。然后为避免重复的列名覆盖输出数组中的结果,您将需要使用列别名。这样的事情应该可以工作:

$result2 = mysqli_query($link, "SELECT t.*, 
                                u1.firstname AS w1_firstname,
                                u1.lastname AS w1_lastname,
                                u2.firstname AS w2_firstname,
                                u2.lastname AS w2_lastname
                                FROM transactions t
                                INNER JOIN users u1 ON t.wallet1 = u1.wallet
                                INNER JOIN users u2 ON t.wallet2 = u2.wallet
                                WHERE t.wallet1 = '$_SESSION["wallet"]'
                                   OR t.wallet2 = '$_SESSION["wallet"]'
                                ORDER BY t.id DESC 
                                LIMIT 5 ");

然后您可以访问每个用户的名称为$row['w1_firstname'] 等:

if ($_SESSION["wallet"] == $row["wallet1"]) 
    echo "<td>Transfer to ".$row["w2_firstname"]." ".$row["w2_lastname"]."</td>";

else if ($_SESSION["wallet"] == $row["wallet2"])  
    echo "<td>Transfer from ".$row["w1_firstname"]." ".$row["w1_lastname"]."</td>";

请注意,理想情况下,您应该为此使用准备好的查询,例如:

$stmt = $link->prepare("SELECT t.*, 
                        u1.firstname AS w1_firstname,
                        u1.lastname AS w1_lastname,
                        u2.firstname AS w2_firstname,
                        u2.lastname AS w2_lastname
                        FROM transactions t
                        INNER JOIN users u1 ON t.wallet1 = u1.wallet
                        INNER JOIN users u2 ON t.wallet2 = u2.wallet
                        WHERE t.wallet1 = ? 
                           OR t.wallet2 = ?
                        ORDER BY t.id DESC 
                        LIMIT 5");
$stmt->bind_param('ss', $_SESSION["wallet"], $_SESSION["wallet"]);
$stmt->execute();
$result2 = $stmt->get_result();

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。

以上是关于根据 INNER JOIN 中的 SESSION 值显示两个不同的值的主要内容,如果未能解决你的问题,请参考以下文章

26.MySQL中的内连接INNER JOIN

SQL中inner join,outer join和cross join的区别

SQL中的INNER JOIN和JOIN有啥区别

mysql 里面JOIN 和 INNER JOIN 区别是啥

sql语句中left join和inner join中的on与where的区别分析

ql语句中left join和inner join中的on与where的区别分析