从数据库获取数据值以保存到会话存储?

Posted

技术标签:

【中文标题】从数据库获取数据值以保存到会话存储?【英文标题】:Getting Data values from database to save to session storage? 【发布时间】:2020-09-11 14:34:24 【问题描述】:

我想让我的网页从数据库中的表中获取值并以代码中显示的格式在屏幕上显示它们,但是我想获取 BikeID 和 ContactEmail 的值并保存将它们保存到要在单击更新按钮时进入的更新确认页面上使用的会话存储。但是第一个问题是这些值不会保存到会话存储中,第二个问题是即使它们保存了,会话也会根据单击按钮时选择的 Table/BikeID 获得正确的值。代码运行后的页面布局图如下。

如果有人有任何想法,我将不胜感激。

  <?php

        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

        $username="Username"; // change this to your database username
        $password="Password"; // change this to your database password
        $database="Database"; // change this to your database username

        $conn = new mysqli('localhost', $username, $password, $database);
        // Check connection
        if ($conn->connect_error) 
        die("Connection failed: " . $conn->connect_error);
        
        $sql = "SELECT * FROM tblBikeStolen, tblBike WHERE tblBike.BikeID=tblBikeStolen.BikeID";
            $result = $conn->query($sql);

            if ($result->num_rows > 0) 
            // output data of each row
                while($row = $result->fetch_assoc()) 
                echo "<div id='UpdateTable'><table><tr><td> User No: " . $row["User"] . "</td> 
 <td>Bike ID: " . $row["BikeID"]. "</td><td> Contact: " . $row["ContactEmail"] . "</td></tr><tr><td> 
 Reported Time: " . $row["ReportTime"] . "</td><td> Address: " . $row["Address"] . "</td><td> Bike 
 MPN: " . $row["BikeMPN"] . "</td></tr><tr><td> Bike Brand: " . $row["BikeBrand"] . "</td><td> Bike 
 Model: " . $row["BikeModel"] . "</td><td> Bike Type: " . $row["BikeType"] . "</td><tr><td> 
 Investigation Notes: " . $row["UpdateNotes"] . "</td></tr><tr><td> Status: " . $row["Status"] . " 
 </td></tr><tr><form><button class='btn btn-primary btnUpdateInvest' type='submit' 
 value='Update'formaction='ConfirmUpdate.php' onClick='UpdateFunctionDAO.php'>Update</button></form> 
 </tr></table></div>";
                $BikeID = $row['BikeID'];
                $_SESSION["BikeID"] = $BikeID;
                $ContactEmail = $row['ContactEmail'];
                $_SESSION["ContactEmail"] = $ContactEmail;
                
                 else  echo "0 results"; 

                $conn->close();

    ?>

【问题讨论】:

【参考方案1】:

我建议从简单开始,然后扩展您的用例:

不要使用formaction = 'ConfirmUpdate.php',而是尝试使用formaction = 'ConfirmUpdate.php?bikeid=&lt;your-bike-id&gt;&amp;contactemail=&lt;the-contact-email&gt;'

在 ConfirmUpdate.php 中,检查 $_GET['bikeid']$_GET['contactemail'] 是否已设置且有效。如果您没有获得这些密钥中的任何一个或者它们无效,请在屏幕上写一条有意义的错误消息,指示用户下一步该做什么。

如果您收到了这两个键并且它们的值都是合理的,则可以将它们存储在会话中以供将来处理。处理完成后,从会话中清除该信息。

您的 PHP 代码将如下所示:

echo "...value='Update' formaction='ConfirmUpdate.php?bikeid=" . $row["BikeID"] . "&amp;contactemail=" . $row["ContactEmail"] . "' onClick='UpdateFunctionDAO.php'>...";

试试这个,看看它是如何工作的。在此之后,您可能需要做更多的工作,以确保您在页面上发布的数据经过净化且不易被注入。

示例

假设您的初始页面名为test.php,它看起来像这样:

<?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    $username=""; // change this to your database username
    $password=""; // change this to your database password
    $database=""; // change this to your database username

    $conn = new mysqli('localhost', $username, $password, $database);

    if ($conn->connect_error) 
        die("Connection failed: " . $conn->connect_error);
    

    $sql = "your sql query";
    $result = $conn->query($sql);
    if ($result->num_rows > 0)
    
        while ($row = $result->fetch_assoc())
        
            $displayText = sprintf('<div>Some other info. Bike ID is %s and contact is %s.</div>',
                $row['bikeid'],
                $row['contactemail']
            );

            $form = sprintf('
                <form method="post" action="ConfirmUpdate.php">
                    <input type="hidden" name="bikeid" value="%s">
                    <input type="hidden" name="contactemail" value="%s">
                    %s
                    <input type="submit" value="Submit">
                </form>',
                $row['bikeid'],
                $row['contactemail'],
                $displayText
            );

            echo $form;
        
    

    $conn->close();
?>

结果

您的ConfirmUpdate.php 将如下所示:

<?php
    session_start();
    $_SESSION['bikeid'] = $_POST['bikeid'];
    $_SESSION['contactemail'] = $_POST['contactemail'];

    echo sprintf('Received bike id %s and contact email %s',
        $_SESSION['bikeid'],
        $_SESSION['contactemail']
    );
?>

当您点击第一个按钮时,您将被带到 ConfirmUpdate 页面,如下所示:

Received bike id 1 and contact email test@gmail.com

当你点击第二个按钮时,你会看到:

Received bike id 2 and contact email test@yahoo.com

在您自己的系统上进行测试,您应该能够在您的项目中复制此代码。

【讨论】:

好的,谢谢你,我去看看这个修复是否有效,我会告诉你 先不要担心会话。试着确保每个更新按钮都有一个像我展示的那样的formaction。一旦你到了那一步,我们就可以讨论下一步了。您是否能够确保更新按钮具有我提到的 formaction? 是的,每个更新按钮都有描述的formaction。 这是我到目前为止的代码。 ` $BikeID = $_GET['BikeID']; $ContactEmail = $_GET['ContactEmail']; $_SESSION["BikeID"] = "$BikeID"; $_SESSION["ContactEmail"] = "$ContactEmail"; echo "
自行车 ID:" 。 $_SESSION["BikeID"] 。 " 联系人:" . $_SESSION["ContactEmail"] 。 "
";`
太棒了。在 ConfirmUpdate.php 中,紧跟在 &lt;?php 之后,键入 var_dump($_GET)。当您再次尝试应用程序并到达 ConfirmUpdate 时,您将看到自行车 ID 和联系电子邮件。你看到了吗?

以上是关于从数据库获取数据值以保存到会话存储?的主要内容,如果未能解决你的问题,请参考以下文章

哪个 postgres 系统表存储 PID 到会话授权的映射?

CodeIgniter:将最后一个活动存储到数据库中

使用带有codeigniter的google api将google登录用户数据存储到会话中

无法将 HttpPostedFileBase 保存到会话变量并使用两次

我想要一个将表单保存到会话的按钮

保持多行文本框输入的格式存储在会话中