2017-01-04 3 views
0

ログインしたユーザーが記入して提出できるさまざまなフォームを持つアプリケーションを作成しています。例えば、アーティストはフォームを通じてビデオを提出することができ、そのムービーは保存され、データベースにアップロードされます。 しかし、フォームを送信してフォームを送信するときにフォームにuserIDとuserEmailを自動的に接続すると、データを取り戻す際にユーザーIDまたは電子メールを簡単にチェックできます。 私はこれを行ういくつかの異なる方法を試したが、何も働いていないので、どんな助けでも大歓迎です。私はデータベーステーブルにも外部キーを使用していますが、テーブルへの接続でどのように動作するのか分かりません。 は、だからここにフォームのページはこちら あるセッションデータを持つphp pdoを挿入する企業

   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; 

 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 ; 

作品表ユーザーのための、映画 Usersテーブルのための私のテーブルの設定です(私はここでPOSTにセッションデータを追加しようとしたとみましたセッションデータを追加する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; 
    } 

} 

私は、trueを返してからtrueの前にinsert lasted()を試しました。
VALUE( ''、 '$ _セッション[ユーザーID]'、 '$ _セッション[ユーザーメール]'、 ''):ムービー])を追加しようとしました: また、_SESSIONデータをbindValueまたはbindColに追加しようとしました また、INSERT INTOムービーをusers.userID、users.userEmailから追加しようとしましたが、どちらもうまくいきませんでした。

私はuserIDとuserEmailを挿入せずに出力する方法を知りませんフォームはそれをそのまま挿入しますが、誰かがその情報を簡単に操作できたり、ユーザーIDを取得して遊んでいたりするので、危険な状態になって注射に気付いてしまいますので、提案や指摘は大変ありがとうございます。

+0

SQLとPHPのコードブロックを適宜使用して質問を編集してください。 – alttag

+0

編集していただきありがとうございます。私があなたのコードと説明を理解している限り、それは読みにくいです。あなたは '$ _SESSION'からデータを取得しようとしています。フォームが送信された後、データは '$ _POST'にあり、' $ _SESSION'にはありません。それ以外の場合は、PHPでエラー報告を有効にして、問題の一部としてエラーを共有してください。 – alttag

+0

フォームのデータを提出した後に提出したいと思います。ユーザーがログインしていて、映画を送信したいとします。彼らが映画を提出すると、フォームが提出されたときにユーザーIDとユーザーの電子メールが自動的にデータベースに保存されます。セッションデータにはユーザーIDと電子メールがあります。ユーザーがフォームを送信したときにその情報を添付する方法がわかりません。それ以来より多くのことができますか? – shutterfly

答えて

1

に一意に恒久的に使用するユーザー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; 
    } 
} 
+0

あなたのコードをもっと見ると、おそらく 'movie_name'の一意のキーも削除するべきでしょう。私はなぜ2つの映画は[同じ名前を含むことができなかった](http://www.andsoitbeginsfilms.com/2013/07/top-15-movies-with-same-title.html)が見えない。 – Mike

+0

私はログインする最初の部分を持っており、データベースでチェックしてセッション情報を保存します。私はstmt-> bindValue(1、$ _SESSION ['userid']);がある部分を取得しません。 1からのものは何ですか?それはユーザーに依存しませんか?次に、2番目の方法では、ユーザーIDを持っている場合に、入力するユーザーIDをどのように知っているのでしょうか。私はそれが私にそれを伝えていない場合私はそれがユーザーIDを知っている方法を取得しない私を捨てていると思う。 – shutterfly

+0

OK私はあなたが示唆したように、私は次のエラーを取得しました:定義された関数 "次のエラー"で呼び出されたuser :: uploadの引数2が欠落しています "undefined indexユーザーID"関数の "整合性制約違反" null "私は記入しましたが、まだそのエラーを返します。また、私はユニークである必要があると私はコメントを参照して、ユーザーのテーブルで一意の電子メールを持っています。私はそれらのエラーのいくつかは、ユーザーIDの入力がフォームになっていないことを知っていますが、私はそれがセキュリティのためでなければならないとは思わない。 – shutterfly

0

ここで起こっていくつかの問題があります。あなたが見ているエラーを完全に理解しているとは言えません(質問の一部としてエラーメッセージを投稿してください)。

しかし、私はあなたのテーブルスキーマに潜在的に重大な問題があると思います。 moviesテーブルに外部キーとしてusers.userIDがある場合は、アトリビュート(またはそれに関連付けられた外部キー)は必要ありません。この情報はuserIDusersmoviesを結合することで得られます。また、userEmailに外部キーを作成しようとすると、別の問題が発生します。users.userEmailは一意ではありません。

+0

テーブルに一意のインデックスを追加すると、電子メールが一意になる可能性があります。 – Mike

+0

そのように設計できました。おそらくそうだろう。そうではありませんでした。 – alttag

0

回答:他のフォームを処理するページで

は、次の手順に従ってください

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

すべてが正常であり、それが完璧に動作します。セッションが設定されていることを確認するか、動作しません。

関連する問題