-3

サイトの編集投稿機能を作成していますが、これで行き詰まっています。これは私のコードです:

$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. 明らかに、DB 内のすべての投稿を同じものに変更したくないので、投稿 ID を見つけて、$postその特定の DB 項目だけの情報を変更する必要があります。

4

5 に答える 5

9

INSERT は新しいレコード用です。レコードを変更する場合は UPDATE を使用する必要があります。

于 2012-04-26T12:44:07.020 に答える
2

SQL インジェクションに加えて、@ThiefMaster と @djdy が反対したように (そしてそれは切迫しています)、既存のエントリを更新 (編集) するために UPDATE クエリを使用する方がはるかに優れています (INSERT は新しいエントリの挿入にのみ使用する必要がある INSERT IGNORE ではありません)。 .

クエリは次のようになります。

$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;";

などの MySQL の予約語はid、逆引用符を使用してエスケープする必要があります。またmysql_real_escape_string()、クエリに渡されるすべての値で a を使用することは、非常に良い習慣です。

于 2012-04-26T12:51:09.160 に答える
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を参照してください。

于 2012-04-26T12:53:50.857 に答える
1

INSERT 構文の代わりに REPLACE を試すことができます:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 

このサイトを参照してくださいhttp://dev.mysql.com/doc/refman/5.0/en/replace.html

于 2012-04-26T12:55:19.333 に答える
0

error_reporting機能を使用して、エラーの説明を取得する必要があります。だから、どこが間違っているかを検出することができます。

また、レコードを編集するには、次のようなものを使用する必要があります

update posts set title = 'new title', content = 'new content' where post_id = <your_post_id>

そのため、一意の投稿 ID を検出 (提供) する機能を実装する必要があります。

于 2012-04-26T12:50:13.610 に答える