我正在为我的网站制作编辑帖子功能,但我坚持这一点。这是我的代码:
$post = htmlspecialchars($_GET["story"]);
mysql_select_db("xxxxxx", $con);
$sql="INSERT IGNORE INTO tool WHERE id=$post (title, details, author)
VALUES
('$_POST[title]','$_POST[details]','$_SESSION[Username]')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "The story<b> " . $_POST[title] . " </b>has been edited.";
mysql_close($con)
我知道错误与INSERT IGNORE INTO tool WHERE id=$post
有关。我显然不想将数据库中的每个帖子更改为相同的内容,因此我需要它来查找帖子ID,即$post
,然后更改该特定数据库项目的信息。
答案 0 :(得分:9)
INSERT用于新记录,如果要更改记录,则需要使用UPDATE。
答案 1 :(得分:2)
除了SQL注入之外,由于@ThiefMaster和@djdy反对(并且很明显),使用UPDATE查询来更新(编辑)现有条目(而不是INSERT IGNORE,其中INSERT只应用于插入)新条目)。
您的查询应该是:
$sql="
UPDATE `tool` SET
`title` = '".mysql_real_escape_string($_POST['title'])."',
`details` = '".mysql_real_escape_string($_POST['details'])."',
`author` = '".mysql_real_escape_string($_SESSION['Username'])."'
WHERE `id` = $post;";
你必须使用反引号来转义像id
等MySQL保留字。对于传递给查询的每个值也使用mysql_real_escape_string()
是一个非常好的习惯。
答案 2 :(得分:1)
哇,你有几个重大错误:
$post = mysql_real_escape_string($_GET["story"]); // why are you mixing $_POST and $_GET?
$title = mysql_real_escape_string($_POST["title"]); // always escape user-generated input that's being put into a SQL query statement
$detai = mysql_real_escape_string($_POST["details"]);
$author = mysql_real_escape_string($_SESSION["Username"]);
$sql = "UPDATE `tool` SET `title` = '$title', `details` = '$details', `author` = '$author' WHERE `id` = '$post'"; // correct syntax for an UPDATE query
请参阅http://dev.mysql.com/doc/refman/5.5/en/update.html和http://php.net/manual/en/function.mysql-real-escape-string.php
答案 3 :(得分:1)
您可以尝试使用REPLACE而不是INSERT语法:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
答案 4 :(得分:0)
您必须使用error_reporting functionality并获取错误说明。所以你可以发现你错在哪里。
同样要编辑记录,您必须使用
之类的内容update posts set title = 'new title', content = 'new content' where post_id = <your_post_id>
因此,您必须实现检测(提供)唯一帖子ID的功能。