【问题标题】:Php pdo inserting firm with session dataphp pdo 使用会话数据插入公司
【发布时间】:2017-05-19 06:26:59
【问题描述】:

我正在开发一个应用程序,该应用程序具有登录用户可以填写和提交的不同表单。例如,艺术家可以通过表单提交他们的视频,该电影将被保存并上传到数据库。 但是,我希望在提交表单时自动将用户 ID 和 userEmail 连接到表单,以便在拉回数据时轻松检查用户 ID 或电子邮件。 我尝试了几种不同的方法来做到这一点,但没有任何效果,因此非常感谢任何帮助。我也在我的数据库表中使用外键,但我不明白它在连接到表时是如何工作的。 所以这是我为用户和电影设置的表格 用户表

       CREATE TABLE IF NOT EXISTS.            `users` (
        `userID` int(11) NOT NULL.        AUTO_INCREMENT,
          `userEmail` varchar(100) NOT NULL,
         `userPass` varchar(100) NOT NULL,
         `userType` varchar(6) NOT NULL,
          `agreement` enum('Yes', 'No') NOT NULL,
        `userStatus` enum('Y','N') NOT NULL. DEFAULT 'N',
        `tokenCode` varchar(100) NOT NULL,
         PRIMARY KEY (`userID`),
          UNIQUE KEY `userEmail`    (`userEmail`)
        ) ENGINE= MyISAM DEFAULT.         CHARSET=latin1.        AUTO_INCREMENT=1 ;

电影表

             CREATE TABLE `movies` (
             `userID` int(11) NOT NULL,
              `userEmail` varchar(250) NOT.     NULL,
              `movie_name` varchar(300) NOT NULL,
               FOREIGN KEY (userID)    Refrences users(userID),
               FOREIGN KEY (userEmail)   REFRENCES users(userEmail),
               UNIQUE KEY `movie_name` (`movie_name`)
               ) ENGINE=MyISAM DEFAULT.               CHARSET=latin1;

表单页面在这里 (我在这里尝试将 SESSION 数据添加到 POST 并尝试使用 GET 方法添加 SESSION 数据,但均无效)

if(isset($_POST['submit']))
{
 $email = trim($_POST['email']);
 $movie = trim($_POST['movie']);

 if($user_home->upload($email,    $movie))
 {
  header("Location: Artist_Uploads.php?inserted");
 }
 else
 {
  header("Location: Artist_Uploads.php?failure");
 }
}

<form action="Artist_Uploads.php" method="post" name="upload">
<input name="email" type="hidden"   value="<?php echo.   htmlentities($row['userEmail']); ?>" />
<input name="movie" type="text" />
<input name="submit" type="submit" />
</form>

处理表单提交的页面

public function upload($email,$movie)      {   try

  {
  $stmt = $this->conn->prepare("INSERT INTO  movies(userEmail, movie_name)     VALUES(:email, :movie)");
   $stmt->bindValue(":email",$email);  
   $stmt->bindparam(":movie",$movie);
   $stmt->execute();
   return true;
  }
  catch(PDOException $e)
  {
   echo $e->getMessage(); 
   return false;
  }

 }

我尝试在 return true 下方和 return true 之前插入 lasted()。
尝试添加 VALUES ('','$_SESSION[cuserID]','$_SESSION[userEmail]','') :movies");。 我还尝试在 bindValue 或 bindCol 中添加 _SESSION 数据,这些都不起作用。 我还尝试从 users.userID、users.userEmail 添加 INSERT INTO 电影,但这也不起作用。

所以我不知道如何让它插入 userID 和 userEmail 而不将其输出到表单中然后以这种方式插入,但这似乎很危险并且容易注入,因为有人可以轻松地操纵该信息或 获取用户 ID 并开始使用它。因此,任何建议或指示将不胜感激。提前谢谢你。

【问题讨论】:

  • 请酌情使用 SQL 和 PHP 的代码块编辑您的问题。
  • 感谢编辑。尽我所能理解你的代码和解释——而且很难阅读——你正试图从$_SESSION 中获取数据。表单提交后,数据在$_POST,不在$_SESSION。否则,请确保您在 PHP 中打开了错误报告,并将任何错误作为问题的一部分分享。
  • 我想在表单提交后提交会话数据。假设用户已登录并且他们想提交电影。当他们提交他们的电影时,他们的用户 ID 和用户电子邮件将在提交表单时自动保存到数据库中。会话数据具有用户 ID 和电子邮件我只是不确定如何在用户提交表单时获取该信息以附加。从那以后会赚更多吗?
  • 会话数据应该已经跨页面保留(这就是$_SESSION 所做的),因此没有理由将其添加到您的表单中。 (除非你有一个检查随机数的安全工具,但这里似乎不是这种情况。)
  • 是的,它会在页面中持续存在。当用户在那里提交电影时,我想在数据库中知道提交电影的用户。我可以将 php echo 添加到表单中以保存该数据,但这似乎并不安全,因为可以轻松操作。所以我试图找到一种方法,在提交电影表单时将有关用户的信息提交到数据库中。

标签: php forms pdo insert session-variables


【解决方案1】:

答案:

在处理表单的页面上执行以下操作

   If (isset ($_POST ['submit']))
  {
 $email = $_SESSION ['userEmail'];

其他一切正常,运行良好。只需确保您已设置会话,否则它将无法正常工作。

【讨论】:

    【解决方案2】:

    您用于唯一且永久地识别每个用户的用户 ID 或用户名应在用户通过身份验证后立即存储在会话中。我说永久是因为通过使用电子邮件,然后甚至在电子邮件上设置外键约束,您正在寻找一个痛苦的世界。不要那样做。使用用户永远不会修改的东西。通常不允许用户修改他们的用户名,并且让用户选择修改他们的用户 ID 是没有意义的。

    首先您进行身份验证(类似这样):

    <?php
    
    if ($user->authenticate($_POST['username'], $_POST['password'])) {
        session_start();
        $_SESSION['userid'] = $user->getUserId();
    }
    else {
        echo "invalid password";
    }
    

    在后续请求中,请确保先执行session_start(),然后您可以使用会话中存储的值从数据库中检索信息。无需以表格形式发送。事实上,以表格形式发送会带来巨大的安全风险,因为人们可以将视频上传到其他用户的帐户。

    session_start();
    
    // Make sure user is logged in
    if (!isset($_SESSION['userid'])) {
        header("Location: login.php");
    }
    
    // Pull their info from the database
    $stmt = $this->conn->prepare("SELECT * FROM users WHERE userid = ?");
    $stmt->bindValue(1, $_SESSION['userid']);
    $stmt->execute();
    $user = $stmt->fetch();
    

    然后您可以根据在$user 中获得的值执行其他查询。与我之前提到的类似,从不相关的表格中删除电子邮件。您正在跨表复制信息并且修改值将非常困难。您还想添加某种独特的方式来识别电影:

    CREATE TABLE `movies` (
        `movieID` int(11) NOT NULL.        AUTO_INCREMENT,
        `userID` int(11) NOT NULL,
        `movie_name` varchar(300) NOT NULL,
        FOREIGN KEY (userID)    Refrences users(userID),
        UNIQUE KEY `movie_name` (`movie_name`)
        ) ENGINE=MyISAM DEFAULT.               CHARSET=latin1;
    

    然后查询:

    public function upload($userid,$movie)      {
        try
        {
            $stmt = $this->conn->prepare("INSERT INTO  movies(userID, movie_name)     
                VALUES(:userid, :movie)");
            $stmt->bindValue(":userid",$userid);  
            $stmt->bindparam(":movie",$movie);
            $stmt->execute();
            return true;
        }
        catch(PDOException $e) {
            echo $e->getMessage(); 
            return false;
        }
     }
    

    【讨论】:

    • 仔细查看您的代码,您可能还应该删除movie_name 上的唯一键。我不明白为什么有两部电影couldn't contain the same name
    • 我确实有他们登录的第一部分,它在数据库中检查它们并保存会话信息。我没有得到你有 stmt->bindValue(1, $_SESSION['userid']); 的部分1 来自什么?这不取决于用户吗?然后在第二个中,如果您只有用户 ID,它如何知道要输入什么用户 ID。我想这就是让我失望的原因。如果我不告诉它,我不明白它是如何知道用户 ID 的。
    • 好的,我按照你的建议做了,我得到了以下错误“在函数中定义的 user::upload 缺少参数 2”下一个错误“函数中未定义的索引用户 ID”也得到“完整性违反约束的电影名称不能为空”我填写了但仍然给出了那个错误。此外,我在用户表中确实有唯一的电子邮件,我看到我需要唯一的 cmets,它是。我知道其中一些错误是用户 ID 的输入不在表单中,但我认为这不应该是为了安全。
    • 我认为错误消息是不言自明的。如果没有,谷歌他们。我在这里的代码只是一个例子,但变量名可能会改变。您永远不应该只是复制并粘贴到您的应用程序中。尝试了解我所做的什么,以及它与您所拥有的有何不同,然后将其适应您的应用程序。
    【解决方案3】:

    这里有几个问题。我不能说我完全理解您看到的错误(请将任何错误消息作为问题的一部分发布)。

    但是,我确实发现您的表架构存在潜在的重大问题。如果movies 表具有users.userID 作为外键,则它根本不需要userEmail 属性(也不需要其关联的外键),因为此信息是通过在@ 上加入usersmovies 获得的987654326@。此外,尝试在 userEmail 上构建外键会带来额外的问题,因为不能保证 users.userEmail 是唯一的。

    【讨论】:

    • 如果您向表中添加唯一索引,电子邮件很可能是唯一的。
    • 可以这样设计。可能应该是。不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多