2012-02-11 54 views
0

目前,我在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; ? 
>"/> 

这样人们就可以轻松编辑和发布任何用户,但我不确定一个好方法。用户标识也一样。

帮助表示赞赏!

+6

如果用户已登录,请使用会话存储其ID并将其插入数据库。 – 2012-02-11 20:24:35

+2

查找PDO,而不要在你使用mysql_ *函数时使用它。 – 2012-02-11 20:37:47

+0

不要以形式发送userdata ..使用'$ _SESSION'数据进行身份验证 – Richard 2012-02-11 20:42:40

回答

-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()查询:

$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

您不应在请求中发送userdata,因为它可以被操纵。任何人都可以在浏览器中编辑隐藏字段并将其作为其他人发布。 – Richard 2012-02-11 20:44:06

+0

你说得对。在第二行代码块中,我在上面的第4行进行了编辑,但没有进行编辑。 – user1204156 2012-02-11 21:14:17

1

通过隐藏的输入字段的形式发送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进行表引用,否则您将存储重复数据,并且当有人更改其作者姓名时,故事中的作者姓名是过时/不正确/过时。

+0

更新了我的回答 – Richard 2012-02-11 21:32:24

+0

这样排序是否存在问题?附:我在你的代码中看到'mysql_close($ con)'在行尾没有分号。在PHP关闭之前的最后一行之后的分号是可选的,但如果您决定在下面添加更多代码,则会导致错误:-) – Richard 2012-02-11 22:11:41

相关问题