首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql更新错误

Mysql更新错误
EN

Stack Overflow用户
提问于 2014-07-21 16:14:17
回答 3查看 76关注 0票数 0

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

代码语言:javascript
复制
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错误:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-21 16:25:28

问题在于$note_id$user_id,您有数字值,如果不张贴,您将离开空。试试这个(注意,我修正了你在$note_id之后的一个错误

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2014-07-21 16:27:00

你在这里有个错误:

代码语言:javascript
复制
note_id = ' . $note_id;
' AND user_id = ' . $user_id;

分号应该是一个连接期:

代码语言:javascript
复制
note_id = ' . $note_id .
' AND user_id = ' . $user_id;

不过,这并不是SQL错误的原因。最有可能的是,$note_id没有在$_POST中设置,而是被初始化为一个空字符串,这将导致$_POST中的一个错误。如果$note_id应该是字符串,则需要用引号括起来,就像标题、note_text等所做的那样:

代码语言:javascript
复制
note_id = "' . $note_id . '" AND user_id = ' . $user_id;

如果它应该是一个整数,您可以将它初始化为0或顶部的什么东西.但是最有可能的是,如果$_POST‘’note_id‘还没有设置,那么您应该重新评估您的逻辑:

代码语言:javascript
复制
if($note_id != '') {
  //do my code
} else {
  //do some error handling
}

对@Majix的更多澄清

代码的第2行如下:

代码语言:javascript
复制
$note_id=(isset($_POST['note_id'])) ? $_POST['note_id'] : '';

这意味着"Set $note_id等于通过表单在'note_id‘字段中发布的内容,但是如果没有通过该字段,则将$note_id设置为空(或空白)字符串。当您到达代码的SQL部分时,如果这个$note_id变量是一个空字符串,那么您的SQL将读取(为了清晰起见缩短):

代码语言:javascript
复制
UPDATE nbk_notes SET title = 'Some Title', note_text = 'Text' WHERE note_id =

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

代码语言:javascript
复制
UPDATE nbk_notes SET title = 'Some Title', note_text = 'Text' WHERE note_id = ''

在这里,它知道您正在检查note_id是否等于空字符串。然而,note_id很可能是一个整数,而您的代码的问题是您应该在“note_id”字段中有一个数字,但是无论出于什么原因,您都不需要。

代码语言:javascript
复制
UPDATE nbk_notes SET title = 'Some Title', note_text = 'Text' WHERE note_id = 5

但$note_id对你来说不是一个数字。“note_id”要么是作为空字符串通过表单提交的,要么是根本没有通过表单提交,而是在前面的第2行中设置为空字符串。也许您可以发布生成自身的代码,这样我们就可以知道为什么note_id不能正常运行?

尽管如此,我知道您是个初学者,只想让这段代码正常工作,但是您应该阅读第一个注释中发布的链接@esqew,然后迁移到mysql_*函数之外。

票数 0
EN

Stack Overflow用户

发布于 2014-07-21 16:46:54

我重写了您的sql查询:

代码语言:javascript
复制
$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'";

希望它对你有用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24869762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档