2012-02-11 28 views
0

は現在、HTML側の私のコードは次のようになります。DBに情報を投稿する方がいいですか?

<form action="newstory.php" method="post"> 
<input type="hidden" name="author" value="<?php echo $loggedInUser->display_username; ?>" 
/> 
<input type="hidden" name="userid" value="<?php echo $loggedInUser->user_id ?>" /> 
Story Title: <input type="text" name="story_name" /><br> 
Story: <textarea rows="10" cols="30" name="story" /></textarea><br> 
<input type="submit" /> 
</form> 

ここではPHP側です:

include("dbconnect.php"); 

mysql_select_db("scratch", $con); 

$author  = mysql_real_escape_string($_POST['author']); 
$author_id = mysql_real_escape_string($_POST['userid']); 
$story_name = mysql_real_escape_string($_POST['story_name']); 
$story  = mysql_real_escape_string($_POST['story']); 

$sql= " 
INSERT INTO stories (author, author_id, story_name, story) 
VALUES ('$author', '$author_id','$story_name', '$story') 
"; 


if (!mysql_query($sql,$con)) 
{ 
die('Error: ' . mysql_error()); 
} 
echo "Story Submitted! Redirecting to Homepage..."; 
//User is shown this for about 3 seconds 
header('Refresh: 3; URL=index.php'); 

mysql_close($con) 

私は人々ができたので

<input type="hidden" name="author" value="<?php echo $loggedInUser->display_username; ? 
>"/> 

を取り除きたいです簡単にそれを編集して任意のユーザーとして投稿できますが、私は良い方法がわかりません。同じようにuseridになります。

ご協力いただき誠にありがとうございます。

+6

ユーザーがログインしている場合、セッションを使用してIDを保存し、データベースに挿入します。 –

+2

PDOをルックアップしている間にmysql_ *関数を使用しないでください。 –

+0

フォームでユーザーデータを送信しないでください。認証に '$ _SESSION'データを使用してください。 – Richard

答えて

-1

ユーザーが設定されているかどうかを確認し、ユーザーオブジェクトが有効な場合はそのフォームのみを表示します。 mysqlで保存する直前に、POSTデータから読み取る代わりにユーザーオブジェクトの値を使用します。

<?php if (isset($_POST['story_name'])) { 
// story posted.. check if user is set 
if (isset($loggedInUser->user_id)) { 
    // save into database using $loggedInUser->user_id and $loggedInUser->author_name 
} 
?> 

<?php 
// just show the form if the user object is set 
if (isset($loggedInUser->user_id)){ 
?> 
<form> <!-- and show the form over here --> </form> 
<?php } ?> 

ああ、あなたのmysql_real_escape_string()は良いです!別のベストプラクティスは、sprintf()を使用して、クエリに変数を追加することです:フォームの隠し入力フィールドを経由してuseridを送信

$author  = mysql_real_escape_string($loggedInUser->author_name); 
$author_id = mysql_real_escape_string($loggedInUser->user_id); 
$story_name = mysql_real_escape_string($_POST['story_name']); 
$story  = mysql_real_escape_string($_POST['story']); 

$sql= sprintf(" 
INSERT INTO stories (author, author_id, story_name, story) 
VALUES ('%s', '%s', '%s', '%s') 
", $author, $author_id, $story_name, $story); // %s accepts the value to be a string. %d accepts a decimal for example. 
+0

ユーザーデータを要求で送信しないでください。操作できるためです。誰でもブラウザから隠しフィールドを編集して、誰か他の人として投稿することができます。 – Richard

+0

あなたは正しいです。正確には、私は上記の第4行目に飾られていますが、編集されていないのは第2コードブロックです。 – user1204156

1

は、巨大なセキュリティ上の脅威です。誰でもその値を変更することができます。 ChromeのインスペクタまたはFireBug誰かがログインしているとき。少なくともあなたのuser_idをセッションに格納する必要があります。セッションにさらに情報を格納することもできます。これにより、すべてのリクエストに対してデータベースを照会する必要がなくなります。ログインしたユーザーのユーザー名をページのどこかに表示します。

現時点でどのようにログインを処理しているのか分かりません。$loggedInUserがどのように設定されているのかわかりませんが、セッション変数にする必要があります。 $_SESSION['user']['id']。そうすれば、フォームを介してデータを送信することなく、ユーザーが誰であるかを常に知ることができます。それは本物ではありません。

各ページの上部にsession_start()があることを確認してください。テンプレートを使用するのが理想的です。index.phpの先頭にsession_start()を追加するだけです。

そして

$sql= " 
INSERT INTO stories (author, author_id, story_name, story) 
VALUES ('$author', '$author_id','$story_name', '$story') 
"; 

は少なくとも

$sql= " 
INSERT INTO stories (author, author_id, story_name, story) 
VALUES ('". $author ."', '". $author_id ."', '". $story_name ."', '". $story ."') 
"; 

する必要があり、私は個人的にお勧めします:

$q = " 
INSERT INTO stories 
     SET author_id = ". $_SESSION['user']['id'] ." # This is an integer (I assume) so don't use apostrophe's 
      , story_name = '". mysql_real_escape_string($_POST['story_name']) ."' 
      , story = '". mysql_real_escape_string($_POST['story']) ."' 
"; 

は、テーブルからフィールドauthorを削除します。テーブル参照のためにauthor_idを使用してください。そうしないと、重複したデータを保存することになり、誰かが著者名を変更すると、ストーリーの著者名は古いものになります。

+0

私の回答を更新しました – Richard

+0

これは問題をソートしましたか? p.s.あなたのコードでは、 'mysql_close($ con)'の行末にセミコロンがないことがわかります。 PHPが閉じる前の最後の行の後のセミコロンはオプションですが、以下のコードを追加するとエラーになります:-) – Richard

関連する問題