2017-01-04 16 views
0

我正在处理具有登录用户可以填写和提交的不同表单的应用程序。例如,艺术家可以通过表单提交他们的视频,该电影将被保存并上传到数据库。 但是,我希望提交表单时,它会自动将用户ID和用户电子邮件连接到表单,以便我可以在撤回数据时轻松检查用户标识或电子邮件。 我已经尝试了几种不同的方法来做到这一点,没有任何工作,所以任何帮助,非常感谢。我也在我的数据库表中使用外键,但我不明白这是如何工作连接到表。 所以这里是为用户和电影 用户表Php pdo将会话数据插入公司

 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数据的GET方法都不工作)

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之后插入lasted()并返回true。
试过添加VALUES('','$ _ SESSION [cuserID]','$ _ SESSION [userEmail]',''):movies“); 我也尝试在bindValue或bindCol中添加_SESSION数据 我也尝试添加INSERT INTO电影FROM users.userID,users.userEmail但是也没有效果

所以我不知道如何让它插入userID和userEmail而不输出它然后插入表单然后插入它,但这似乎是危险的,并打开注入,因为有人可以轻松地操纵该信息或 获得用户ID并开始玩它,所以任何建议或指针将不胜感激。

+0

请根据需要使用适用于SQL和PHP的代码块编辑您的问题。 – alttag

+0

感谢您的编辑。我最好理解你的代码和解释 - 而且很难阅读 - 你试图从'$ _SESSION'中获取数据。提交表单后,数据位于'$ _POST'中,而不是'$ _SESSION'中。否则,请确保您在PHP中打开了错误报告,并在问题中分享任何错误。 – alttag

+0

我想提交会议资料时不要在提交表格后提交表格。说一个用户登录,他们想提交一部电影。当他们提交他们的电影时,他们的用户ID和用户电子邮件将自动保存到数据库当表单submited。会话数据包含用户ID和电子邮件我只是不确定如何在用户提交表单时获取该信息。那是因为更多吗? – shutterfly

回答

1

用户标识或用户名,无论您用于唯一且永久地使用标识每个用户应在用户通过身份验证后立即存储在会话中。我永久地说,因为通过使用电子邮件,然后甚至在电子邮件上设置外键约束,您正在寻找一个痛苦的世界。不要这样做。使用一些永远不会被用户修改的东西。通常用户不允许修改他们的用户名,并且给用户修改他们的用户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; 
    } 
} 
+0

仔细看看你的代码,你应该也可以删除'movie_name'上的唯一键。我不明白为什么两部电影[不能包含相同的名字](http://www.andsoitbeginsfilms.com/2013/07/top-15-movies-with-same-title.html)。 – Mike

+0

我有他们登录的第一部分,它在数据库中检查它们并保存会话信息。我没有得到你有stmt-> bindValue的部分(1,$ _SESSION ['userid']);什么是1?这不会取决于用户吗?然后在第二个有如何知道用户ID输入,如果你只有userid。我想这就是抛弃我,如果我不告诉它,我不知道它如何知道用户ID。 – shutterfly

+0

好,我按照你的建议做了,我得到以下错误“缺少用户::上传参数2调用在函数中定义”下一个错误“函数中未定义的索引用户ID”也得到“完整性约束违规电影名称不能空“我填写了,但仍然给错误。我也有电子邮件作为唯一的用户表我看到的评论,我需要是独特的,它是。我知道其中的一些错误是成为用户ID的输入不是在形式,但我不认为它应该是为了安全。 – shutterfly

0

有几个问题怎么回事。我不能说我完全理解你所看到的错误(请将任何错误信息作为问题的一部分发布)。

但是,我发现您的表格架构存在潜在的重大问题。如果movies表的users.userID作为外键,则根本不需要userEmail属性(或其关联的外键),因为此信息是通过在userID上加入usersmovies获得的。另外,试图在userEmail上构建外键是额外的问题,因为users.userEmail不保证是唯一的。

+0

如果您向表中添加唯一索引,则电子邮件很可能是唯一的。 – Mike

+0

可以这样设计。可能应该是。事实并非如此。 – alttag

0

答:

在那处理表单的页面做以下

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

其他的一切是正常的,它完美的作品。只要确保你有会话设置或它不会工作。