2017-01-04 8 views
0

Я работаю над приложением, которое имеет различные формы, которые пользователь может заполнить и отправить. Например, художник может отправить свое видео через форму, и этот фильм будет сохранен и загружен в базу данных. Однако мне бы хотелось, чтобы при отправке формы для автоматического подключения идентификатора пользователя и userEmail к форме при ее отправке, чтобы я мог легко проверить идентификатор пользователя или адрес электронной почты при возврате данных. Я пробовал несколько разных способов сделать это, и ничего не сработало, поэтому любая помощь очень ценится. Я также использую внешние ключи в своих таблицах базы данных, но я не понимаю, как это работает при подключении к таблице. Так вот мои настройки таблицы для пользователей и фильмы таблицы пользователей ТаблицыPhp pdo inserting firm with session data

 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; 

страница Формы здесь (я попытался добавить данные сессии в 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; 
    } 

} 

Я попытался вставить lasted() под возвратом true и перед возвратом true.
Пробовал добавлять VALUES ('', '$ _ SESSION [cuserID]', '$ _ SESSION [userEmail]', ''): movies ") ;. Я также попытался добавить данные _SESSION в bindValue или bindCol ни из те, кто работал либо. Я также попытался добавить INSERT INTO фильмы FROM users.userID, users.userEmail, но это тоже не сработало.

Так что я не знаю, как заставить его вставлять userID и userEmail без вывода его в форма затем вставляет его таким образом, но это кажется опасным и открытым для инъекций, потому что кто-то может легко манипулировать этой информацией, или получить идентификатор пользователя и начать играть с ним. Поэтому любые предложения или указатели будут очень благодарны.

+0

Пожалуйста, отредактируйте свой вопрос, используя блоки кода для SQL и PHP, если это необходимо. – alttag

+0

Спасибо за редактирование. Насколько я понимаю ваш код и объяснение - и это трудно читать - вы пытаетесь получить данные из '$ _SESSION'. После отправки формы данные находятся в '$ _POST', а не в' $ _SESSION'. В противном случае убедитесь, что вы включили отчет об ошибках в PHP, и сообщаете какие-либо ошибки как часть вопроса. – alttag

+0

Я хотел бы представить данные сеанса в форме не после ее отправки. Скажите, что пользователь вошел в систему, и они хотели бы отправить фильм. Когда они отправляют свой фильм, их идентификатор пользователя и электронная почта пользователя автоматически сохраняются в базе данных при отправке формы. Данные сеанса имеют идентификатор пользователя и адрес электронной почты. Я просто не уверен, как получить эту информацию для присоединения, когда пользователь отправляет форму. Значит ли это больше? – shutterfly

ответ

1

Идентификатор пользователя или имя пользователя, которое вы используете для уникально и постоянно идентифицировать каждого пользователя следует хранить в сеансе сразу после аутентификации пользователя. Я говорю постоянно, потому что, используя электронную почту, а затем даже настраивая внешние ограничения по электронной почте, вы ищете мир боли. Не делай этого. Используйте то, что никогда не будет изменено пользователем. Обычно пользователям не разрешается изменять свое имя пользователя, и было бы бессмысленно давать пользователю возможность изменять свой идентификатор пользователя.

Сначала вы аутентификация (что-то вроде этого):

<?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? Не будет ли это зависеть от пользователя? Затем во втором, как он знает, какой идентификатор пользователя вводится, если у вас просто есть идентификатор пользователя. Я думаю, это то, что меня отбрасывает. Я не понимаю, как он знает идентификатор пользователя, если я этого не скажу. – shutterfly

+0

OK Я сделал так, как вам было предложено, и у меня возникают следующие ошибки: «Отсутствующий аргумент 2 для пользователя :: upload вызываемый для определенных в функциях« следующая ошибка »неопределенный идентификатор пользователя индекса в функции« также получение »ограничения на нарушение имени фильма не может быть null "Я заполнил, но все же даю эту ошибку. Кроме того, у меня есть электронная почта как уникальная в таблице пользователей, я вижу комментарии, которые должны быть уникальными, и это так. Я знаю, что некоторые из этих ошибок становятся входными данными идентификатора пользователя, но не я считаю, что это должно быть для безопасности. – shutterfly

0

Есть несколько вопросов, здесь происходит. Я не могу сказать, что полностью понимаю ошибки, которые вы видите (пожалуйста, размещайте сообщения об ошибках как часть вопроса).

Однако я вижу потенциально значимую проблему с вашей схемой таблиц. Если таблица movies имеет users.userID в качестве внешнего ключа, то не обязательно должен иметь атрибут userEmail (или связанный с ним внешний ключ), поскольку эта информация получается путем объединения users и movies по адресу userID. Кроме того, попытка создания внешнего ключа на userEmail является дополнительной проблемой, так как users.userEmail не гарантирует уникальность.

+0

Email может быть уникальным, если вы добавите уникальный индекс в таблицу. – Mike

+0

Может быть спроектирован таким образом. И, вероятно, должно быть. Это не так. – alttag

0

Ответ:

На странице, которая обработает форму сделайте следующее

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

Все остальное нормально, и она прекрасно работает. Просто убедитесь, что у вас установлены сеансы, или это не сработает.

 Смежные вопросы

  • Нет связанных вопросов^_^