2017-01-04 39 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']; 

其他的一切是正常的,它完美的作品。只要確保你有會話設置或它不會工作。