【问题标题】:PHP Not 'Syncing' with MySQL DB?PHP 不与 MySQL 数据库“同步”?
【发布时间】:2015-07-28 14:28:53
【问题描述】:

我有一个包含用户信息的 mySQL 数据库。使用正常工作的用户注册系统将信息添加到数据库中。这是一个示例用户 (PHPmyadmin):

问题是我有一个基于 PHP 的“我的帐户”页面,可以检索有关用户帐户的信息。当我从 PHPMyAdmin 更新用户信息时,甚至当我添加有关用户的新数据时,此信息似乎与 MySQL 不同步(例如,我的 PHP 不会检测到新添加的“RealName”字段,尽管它识别已存在一段时间的“电子邮件地址”字段。

PHP/HTML:

<div class="modal-body">
        <img src="assets/user.jpg" style="border-radius:150px;height:150px;width:150px;float:left;"><br>
        <h2 class="desc" style="font-style: normal;padding:0px;margin:0px;float:left;">&nbsp <?=$_SESSION['RealName']?></h2><br><br>
        <h4 class="desc" style="font-style: normal;padding:0px;margin:0px;float:left;"><i>&nbsp &nbsp @<?=$_SESSION['Username']?></i></h4><br><br>
        <hr>
        <a href=""><p class="desc" style="font-style: normal;float:left;">&nbsp &nbsp Change Profile Image...</h2></a> <a href=""><p class="desc" style="font-style: normal;float:left;">&nbsp &nbsp Change Your Name...</h2></a>
        </div>
        <div class="modal-footer-alt"><br><br>
        <h4>Account Info &nbsp</h4>
        <p class="desc" style="font-style: normal;float:left;"><b>E-Mail Address: </b><?=$_SESSION['EmailAddress']?> &nbsp</p> <code style="float:left;">Private</code><br><br>
        <p class="desc" style="font-style: normal;float:left;"><b>Password: </b> ●●●●●●●●●● &nbsp</p> <code style="float:left;">Private</code><br>
        <h4>Bio &nbsp</h4>
        <textarea rows="4" cols="40"><?=$_SESSION['Bio']?></textarea>
        <h4>More &nbsp</h4>
        <a href="../account/die.php"><button class="btn btn-default">Log Out</button></a><a href="../account/die.php"><button class="btn btn-default">Sign Up for Contributor Rewards</button></a>
</div>

它在网页上的显示方式: 请注意,某些信息会出现,而其他信息不会。这不是我的 HTML 的问题,就像我用静态值替换 PHP 一样,它显示正常。

这是我用来启动会话的代码:

<?php
session_start();

$dbhost = "PRIVATE"; // this will ususally be 'localhost', but can sometimes differ
$dbname = "PRIVATE"; // the name of the database that you are going to use for this project
$dbuser = "PRIVATE"; // the username that you created, or were given, to access your database
$dbpass = "PRIVATE"; // the password that you created, or were given, to access your database

mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error());
mysql_select_db($dbname) or die("MySQL Error: " . mysql_error());
?>

注销代码:

<?php include "base.php"; $_SESSION = array(); session_destroy(); ?>

【问题讨论】:

  • 您正在从会话中提取数据。您的代码是否会在每次网页浏览时更新会话值?
  • 看起来页面正在显示来自会话的信息,而不是直接来自数据库。您能否将从数据库中获取它的代码发布到会话中?
  • 不,它没有。但是,我已经尝试注销并重新登录 - 这不应该终止会话吗?
  • 注销不会终止会话。会话应该被明确地销毁session_destroy()
  • 请注意,mysql 不再受支持。尝试改用mysqli 或pdo。

标签: php mysql mysqli phpmyadmin


【解决方案1】:

我不同意您的工作流程,不会使用此方法。在与用户相关的所有内容中,我只信任来自 DB 的最新数据(或身份验证机构,例如,在 OAuth 或 OpenId 的情况下),从不存储会话数据。

每次我需要像用户数据这样的关键信息时,我都会查询数据库。用户可以在会话中间更改他/她的姓名,这应该由您的系统实时反映。

我也会避免OR DIE。请考虑使用try...catch 并处理错误。

try {
  include ('ConnectionData.php'); // user, pass, db, localhost
  $sqlGetId = "SELECT etcetcetc";
  $sqlResultGetId = mysql_query($sqlGetId);
  $rowGetId = mysql_fetch_array($sqlResultGetId);
  if ( $rowGetId[0] > 0 ) {
    // consume data

【讨论】:

    【解决方案2】:

    您需要重新加载您的$_SESSION 值...这可以通过创建一个页面logout.php 并在其中包含函数session_start(); session_destroy(); 来实现。您的登录页面也需要更新以包含正确的会话数据。

    【讨论】:

    • 我已经这样做了。我的 logout.php 包括我在问题中所述的那些行。 Session_start() 在页面登录时被调用。
    • 在页面登录时,您是否将 DB 值设置为 $_SESSION?这就是我想要表达的观点。
    • 谢谢,看来我想通了。我设置了一些值,但没有设置其他值。
    • 没问题。你还应该看看托尼吉尔的回答。我同意他关于工作流程的看法。
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2019-01-30
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多