簡體   English   中英

在DB中發布信息的更好方法?

[英]Better Way to Post Info in DB?

目前,我在HTML端的代碼如下所示:

<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是巨大的安全威脅。 任何人都可以使用Chrome的檢查器或FireBug更改該值。 當有人登錄時; 您必須在會話中至少存儲他們的user_id。 您還可以在會話中存儲更多信息,從而不必在每次請求時都查詢數據庫,例如在頁面上的某處顯示已登錄用戶的用戶名。

我目前不知道您如何處理登錄,也不知道$loggedInUser的填充方式,但是它應該是會話變量,例如$_SESSION['user']['id'] 這樣,您總是知道用戶是誰,而不必通過表單發送數據。 那是真正的不行。

確保在每個頁面的頂部都有session_start() ,理想情況下,您將使用模板,而只需將session_start()添加到index.php的頂部。

$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進行表引用,否則您將存儲重復的數據,並且當某人更改其作者姓名時,故事中的作者姓名已過時/不正確/過時。

檢查是否設置了用戶,如果用戶對象有效,則僅顯示該表單。 就在使用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()將變量添加到查詢中:

$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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM