簡體   English   中英

如何在循環中使用變量查詢 mysqli db (php)

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

我正在學習一點 php 和 mysqli 和 atm 我正在嘗試創建一個簡單的私人消息傳遞系統。 為此,我創建了兩張我需要的表,一張用於我網站的用戶,一張用於消息傳遞。 兩個表 atm 與其用戶名(不是用戶 ID)之間存在一個連接。 我創建了一個有效的 php 腳本,它為 session 用戶獲取 pms 列表。 為此,我創建了一個 foreach 循環,該循環允許我在表單中顯示每個下午都具有相同的收件人用戶名,例如 session 用戶。 我的問題是 pm 表不滿足發件人的前名和姓名,這就是需要在表單中而不是在用戶名上顯示的內容。

我已經發現在 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>

該腳本正在運行。 我只需要獲取發件人用戶名的相關前名和名稱(在定義為 $sentby 的循環中)。 所有 pms 都是由存在於 users 表中的用戶創建的。

有任何想法嗎?

我找到了一種將 INNER JOIN 添加到 function 中的方法:

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;   
    }

那安全嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM