更新时出现Mysql错误

时间:2014-07-21 16:14:17

标签: php html mysql forms

我已经编写了这个PHP脚本来通过表单更新表,但是MySQL给出了这个错误。我该怎么办?我的错在哪里?

case 'Save Changes':
    $note_id=(isset($_POST['note_id'])) ? $_POST['note_id'] : '';
    $title=(isset($_POST['title'])) ? $_POST['title'] : '';
    $note_text=(isset($_POST['note_text'])) ? $_POST['note_text'] : '';
    $color=(isset($_POST['color'])) ? $_POST['color'] : '' ;
    $remind_date=(isset($_POST['remind_date'])) ? $_POST['remind_date'] : '' ;
    $remind=(isset($_POST['remind'])) ? $_POST['remind'] : '' ;
    $user_id=(isset($_POST['user_id'])) ? $_POST['user_id'] : '';

    $sql = 'UPDATE nbk_notes SET
    title = "' . mysql_real_escape_string($title, $db) . '",
    note_text = "' . mysql_real_escape_string($note_text,$db) . '",
    color="'.$color.'",
    remind_date="'.$remind_date.'",
    remind="'.$remind.'",
    submit_date = "' . date('Y-m-d H:i:s') . '"
    WHERE
    note_id = ' . $note_id;
    ' AND user_id = ' . $user_id;

    mysql_query($sql, $db) or die(mysql_error($db));

    redirect('memory.php');
    break;

这是MySQL错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 9

3 个答案:

答案 0 :(得分:3)

问题在于$note_id$user_id,您有数值,如果没有发布,您将留空。试试这个(注意我修复了$note_id之后的拼写错误:

case 'Save Changes':
    $note_id=(isset($_POST['note_id'])) ? $_POST['note_id'] : '';
    $title=(isset($_POST['title'])) ? $_POST['title'] : '';
    $note_text=(isset($_POST['note_text'])) ? $_POST['note_text'] : '';
    $color=(isset($_POST['color'])) ? $_POST['color'] : '' ;
    $remind_date=(isset($_POST['remind_date'])) ? $_POST['remind_date'] : '' ;
    $remind=(isset($_POST['remind'])) ? $_POST['remind'] : '' ;
    $user_id=(isset($_POST['user_id'])) ? $_POST['user_id'] : '';

    if($note_id && $user_id) {
        $sql = 'UPDATE nbk_notes SET
        title = "' . mysql_real_escape_string($title, $db) . '",
        note_text = "' . mysql_real_escape_string($note_text,$db) . '",
        color="'.$color.'",
        remind_date="'.$remind_date.'",
        remind="'.$remind.'",
        submit_date = "' . date('Y-m-d H:i:s') . '"
        WHERE
        note_id = ' . $note_id . 
        ' AND user_id = ' . $user_id;

        mysql_query($sql, $db) or die(mysql_error($db));

        redirect('memory.php');
    } else {
        echo "No note ID or User ID.";
    }
    break;

其他几点,

  1. 为什么要转义标题和注释文本,而不是任何其他字符串字段。即使您认为自己知道输入内容,始终也会转义所有文本字段。或者甚至更好,使用预备语句(使用MySQLi / PDO,见下文),这样你就不需要逃避它们了。
  2. 停止使用 mysql _ * ,它已被折旧。了解MySQLiPDO

答案 1 :(得分:0)

你这里有一个错字:

note_id = ' . $note_id;
' AND user_id = ' . $user_id;

分号应该是一个连锁期:

note_id = ' . $note_id .
' AND user_id = ' . $user_id;

但这不是导致SQL错误的原因。最有可能的是,$ note_id未在$ _POST中设置,并且被初始化为空字符串,这将导致SQL中的错误。如果$ note_id应该是一个字符串,你需要将它括在引号中,就像你为title,note_text等所做的那样:

note_id = "' . $note_id . '" AND user_id = ' . $user_id;

如果它应该是一个整数,你可以将它初始化为0或顶部的东西...但最有可能的是,如果$ _POST ['note_id']你应该重新评估你想要继续的逻辑未设置:

if($note_id != '') {
  //do my code
} else {
  //do some error handling
}

@Majix的更多说明

代码的第2行说明了这一点:

$note_id=(isset($_POST['note_id'])) ? $_POST['note_id'] : '';

这意味着“Set $ note_id等于'note_id'字段中通过表单的POST发出的内容,但如果没有任何内容通过该字段,请将$ note_id设置为空(或空白)字符串。”当你到达代码的SQL部分时,如果$ note_id变量是一个空字符串,那么你的SQL将会读取(为了清楚起见缩短了):

UPDATE nbk_notes SET title = 'Some Title', note_text = 'Text' WHERE note_id =

看看=之后怎么没有? SQL抛出错误,因为这没有任何意义。 note_id =什么?如果note_id应该是一个字符串而不是一个数字,并且你真的想找到一个空的note_id,你可能希望你的SQL说:

UPDATE nbk_notes SET title = 'Some Title', note_text = 'Text' WHERE note_id = ''

这里它知道你正在检查note_id是否等于一个空字符串。但是,note_id很可能是一个整数,你的代码的问题是你应该在'note_id'字段中有一个数字,但无论出于何种原因,你都没有。你希望SQL说的是这样的(5只是一个例子):

UPDATE nbk_notes SET title = 'Some Title', note_text = 'Text' WHERE note_id = 5

但是$ note_id对你来说不是一个数字。 'note_id'通过表单作为空字符串提交,或者它根本没有通过表单提交,并且在前面的第2行中被设置为空字符串。也许您可以发布生成自身的代码我们知道为什么note_id没有正确通过?

所有这些都说,我知道你是初学者,只是想让这段代码正常工作,但是你应该阅读第一条评论中发布的链接@esqew并从mysql_ *函数中迁移出来。

答案 2 :(得分:0)

我已经重写了你的SQL查询:

$sql = "UPDATE nbk_notes SET
title = '". mysql_real_escape_string($title, $db) . "',note_text ='". mysql_real_escape_string($note_text,$db) . "',
color='$color',
remind_date='$remind_date',
remind='$remind',
submit_date = '". date('Y-m-d H:i:s') . "'
WHERE
note_id = '$note_id'
AND user_id = '$user_id'";

希望它适合你!