如何在循环中使用变量查询 mysqli 数据库 (php)



我正在学习一些php、mysqli和atm,我正在尝试创建一个简单的私有消息系统。为此,我创建了两个我需要的表,一个用于我的网站用户,另一个用于消息传递。两个表atm和它的用户名(而不是用户ID(之间有一个连接。我创建了一个工作php脚本,它为会话用户获取pms列表。为此,我创建了一个foreach循环,允许我使用相同的收件人用户名显示每个下午,就像表单中的会话用户一样。我的问题是,下午表中不包含发件人的婚前姓名和姓名,而这正是需要在表单中显示的用户名。

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

  1. 使用PDO准备语句,以便在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>

这个脚本正在运行。我只需要获得发送者用户名的关联prename和name(在循环中定义为$sentby(。所有pms都是由用户表中现有的用户创建的。

有什么想法吗?

我找到了一种将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;   
}

这样安全吗?

最新更新