0

我正在使用论坛类型系统让用户提出问题或说出他们的想法,但我遇到了与更新数据库信息相关的问题。我不知道这里出了什么问题,但我知道发生了什么。

有些帖子无法编辑。一切都会照常进行,但不会更新数据库。有些帖子的正文错误,但标题正确。

这没有意义,我会做一些测试来检查 mysql 是否正常工作.. 但在那之前,有什么想法吗?

更新:

此查询正在传递...但数据库未针对此特定行进行更新。只有这一个...

$new_body = $_POST['new_body'];
$old_body = $_POST['old_body'];
mysql_query("UPDATE questions SET body='".htmlspecialchars($new_body, ENT_QUOTES)."' WHERE body='".htmlspecialchars($old_body, ENT_QUOTES)."'") or die(mysql_error());

此外,如果有人能就 SQL 注入以及如何防止它们向我提供启发,我将不胜感激。

这些列是 id、pin、locked、body、date、numberofcomments(我知道我可以使用 php 来读取评论的数量,但我在学习之前这样做了)和视图。

更新:现在工作。将 WHERE 正文替换为 WHERE id。愚蠢的错误。不过,我仍然可以使用一些 sql 注入来启发!

4

2 回答 2

1

正如我在评论中提到的,首先在子句中使用主键WHERE来定位表中的特定记录,而不是使用body列。话虽如此,您的更新声明应该看起来像这样

UPDATE questions SET body = ? WHERE id = ?

现在为了防止 sql 注入使用 switch tomysqli_*PDOextension 并使用准备好的语句而不是插入查询字符串。

您使用准备好的语句的代码mysqli_*可能看起来像

$id = $_POST['id'];
$new_body = $_POST['new_body'];
$old_body = $_POST['old_body'];

//Do validation, sanitation, and encoding if necessary here before you put into database
...

$db = new mysqli('localhost', 'user', 'password', 'dbname');
if ($db->connect_errno) {
    die('Connection failed: %s\n' . $db->connect_error); //TODO better error handling
}

$sql = 'UPDATE questions SET body = ? WHERE id = ?';
$stmt = $db->prepare($sql);
if (!$stmt) {
    die('Can\'t prepare: ' . $db->error); //TODO better error handling
}
$stmt->bind_param('si', $new_body, $id);
$stmt->execute();

$stmt->close();
$db-close();

进一步阅读:

于 2013-10-01T00:15:56.073 回答
0

请使用 Mysqli 或 PDO。Mysql_* 已弃用且不安全。

您是否尝试过检查帖子是否存在?因为帖子不存在或找不到它似乎是一个问题。

您是否从 mysql获得任何 mysql_error 或任何输出?

您是否也尝试过使用 phpmyadmin 进行更新 - 看看它是否在那里输出任何错误?

$new_body = $_POST['new_body'];
$old_body = $_POST['old_body'];
mysql_query("UPDATE questions SET body='".htmlspecialchars($new_body, ENT_QUOTES)."' WHERE body='".htmlspecialchars($old_body, ENT_QUOTES)."'") or die(mysql_error());

我有一段时间没有使用 mysql_了,支持 PDO,所以这个语法可能不正确。但你可以试试这个:*

    $new_body = htmlentities($_POST['new_body']);
    $old_body = htmlentities($_POST['old_body']);
    $sql1=mysql_query("SELECT * FROM questions WHERE body='$old_body'") or die(mysql_error());
    if(mysql_num_rows($sql1)>"0")
    {
        $res=mysql_query("UPDATE questions SET body='$new_body'") or die(mysql_error());
        echo 'Updated';
    }
    else
    {
        //Insert.
    }
于 2013-10-01T00:16:09.370 回答