根据 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 值显示两个不同的值的主要内容,如果未能解决你的问题,请参考以下文章
SQL中inner join,outer join和cross join的区别
mysql 里面JOIN 和 INNER JOIN 区别是啥