如何使用循环中的变量查询mysqli db(php)

How do I query mysqli db's with variables in a loop (php)

提问人:HouseMixesForever 提问时间:4/26/2021 最后编辑:RiggsFollyHouseMixesForever 更新时间:4/28/2021 访问量:33

问:

我正在学习一些 php 和 mysqli 和 atm,我正在尝试创建一个简单的私人消息传递系统。为此,我创建了两个我需要的表,一个用于我的站点用户,一个用于消息传递。两个表之间有一个连接:atm,它是用户名(而不是用户ID)。我创建了一个有效的 php 脚本,用于获取会话用户的 pms 列表。为此,我创建了一个 foreach 循环,允许我在表单中显示具有相同收件人用户名(如会话用户)的每个 pm。我的问题是 pm 表不包含发件人的 prename 和 name,这就是需要在表单中显示的内容,而不是在用户名上。

我已经发现在 foreach 循环中不可能从另一个表中查询 pm 以外的内容,但无论如何我都无法让它工作。 我尝试过:

  1. 使用 PDO 的 prepared 语句在 foreach 循环内的 while 循环中获取它们 - >整个表单内容不显示
  2. 像在foreach之外一样查询和获取(顺便说一句,这确实有效。 ->整个表单内容不显示

由于我是mysqli的新手,我不知道现在该尝试什么。有人可以给我提示吗?

“用户”表列:

CREATE TABLE `users` (
  `id` smallint(6) NOT NULL,
  `username` tinytext NOT NULL,
  `password` char(80) NOT NULL,
  `usergroup1` tinyint(2) NOT NULL,
  `usergroup2` tinyint(2) NOT NULL,
  `prename` char(30) NOT NULL,
  `name` char(30) NOT NULL,
  `email` char(50) NOT NULL,
  `date` date NOT NULL,
  `rights` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

“PM”表列:

CREATE TABLE `pm` (
  `id` int(11) NOT NULL,
  `sentby` char(32) NOT NULL,
  `recipient` char(32) NOT NULL,
  `subject` varchar(90) NOT NULL,
  `topic` varchar(90) NOT NULL,
  `message` varchar(500) NOT NULL,
  `new` tinyint(3) NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

pm.php(提交尚未设置)

<html>
<head>
    <title>User Portal</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<script>
function onSelectChange(){
    document.getElementById('frm').submit();
};
</script>
 <?php
$phpself = $_SERVER['PHP_SELF'];

//start session and define mysqli connection $conn
include 'header.php';

//query own private messages as session user
$sqlownpn = "SELECT * FROM pm WHERE recipient='$username'";
$queryownpn = mysqli_query($conn, $sqlownpn);

echo "<h3>Inbox</h3><br>";

echo "<div id=“resp-table-body”>
        <form action='$phpself' id='frm' method='post' enctype='multipart/form-data'>

            <select name='pn' id='pn' size='3' onchange='onSelectChange()'>";

function build_choice($rows2)
{  
    $result = "";
    foreach ($rows2 as $row2){
        $sentby = $row2['sentby'];
        $new = $row2['new'];
        if($new == 1) {
            $result.= "<option value='{$row2['id']}'>NEU | {$row2['timestamp']} | $sentby | {$row2['thema']} | {$row2['ueberschrift']}</option></div>";

        } elseif($new == 2) {
          $result.= "<option value='{$row2['id']}'>{$row2['timestamp']} | $sentby | {$row2['thema']} | {$row2['ueberschrift']}</option></div>";
        };
        return $result;
    };
};
  
echo build_choice($queryownpn);
echo "</select><br></form></div><br>";
?>
<br>
<br>
</body>
</html>

此脚本正在工作。我只需要获取发件人用户名的关联前名和名称(在定义为 $sentby 的循环中)。所有 pms 都是由存在于 users 表中的用户创建的。

有什么想法吗?

php 循环 mysqli foreach

评论

0赞 RiggsFolly 4/26/2021
因此,在哪里创建并赋予价值$username
2赞 CBroe 4/26/2021
“两张桌子之间有一个连接,atm,它是用户名(而不是用户ID)。”- 那么这是你应该解决的第一件事。为此使用 ID,这就是它们的用途。您不希望仅仅因为某些用户希望在以后更改其名称而更改所有邮件记录中的数据。(即使这不是您的应用程序中的用例,也没关系 - 使用。这。ID。
0赞 RiggsFolly 4/26/2021
小点If's、Loops 和函数大括号不需要分号。.喜欢};
0赞 HouseMixesForever 4/26/2021
$username 是从会话用户名创建的,header.php from '$_SESSION['username'];'我从第一天起就使用用户名,我知道在在线项目中使用 userid 代替。只是为了让我更好地看到。

答:

0赞 HouseMixesForever 4/28/2021 #1

我找到了一种将 INNER JOIN 添加到函数中的方法:

global $conn;
$sqlnamelist = "SELECT a.id, a.prename, a.name, b.absender FROM users AS a INNER JOIN pm AS b ON a.id = b.sender";
$querynamelist = mysqli_query($conn, $sqlnamelist);
      while ($row4 = mysqli_fetch_assoc($querynamelist)) {
    $sender = $row4["sender"];
    $vorname = $row4["prename"];
    $nachname = $row4["name"];
    if($sentby == $sender) {
    $valid = "1";
    $name = "$prename $name";
    }
    else {
    continue;   
    }

这安全吗?