4

我在 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 2'.

HTML 代码:

<form action="read_message.php" method="post">
  <table class="form_table">
    <tr>
      <td style="font-weight:bold;">Subject:</td>
      <td><input style=" width:300px" name="form_subject"/></td>
      <td></td>
    </tr>
    <tr>
      <td style="font-weight:bold;">Message:</td>
      <td id="myWordCount">&nbsp;(300 words left)</td>
      <td></td>
    </tr>
    <tr>
      <td><input type="hidden" name="sender_id" value="<?php echo $sender_id?>"></td>
      <td><textarea cols="50" rows="4" name="form_message"></textarea></td>
      <td valign="bottom"><input type="submit" name="submit_message" value="send"></td>
    </tr>
  </table>
</form>

插入mysql表的代码:

<?php
  include_once"connect_to_mysql.php";
  //submit new message
  if($_POST['submit_message']){

    if($_POST['form_subject']==""){
      $submit_subject="(no subject)";
    }else{
      $submit_subject=$_POST['form_subject'];   
    }
    $submit_message=$_POST['form_message'];
    $sender_id = $_POST['sender_id'];
    if($shortMessagesLeft<1){
      $form_error_message='You have left with '.$shortMessagesLeft.' Short Message. Please purchase it from the <a href="membership.php?id='.$id.'">shop</a>.';
    }
    else if($submit_message==""){
      $form_error_message = 'Please fill in the message before sending.';
    }
    else{
      $message_left = $shortMessagesLeft-1;
      $update_short_message = mysql_query("UPDATE message_count SET short_message = '$message_left' WHERE user_id = '$id'");
      $sql = mysql_query("INSERT INTO private_messages (to_id, from_id, time_sent, subject, message) 
        VALUES('$sender_id', '$id', now(),'$submit_subject','$submit_message')") or die (mysql_error());
    }
  }

?>

错误是什么意思,我做错了什么?

4

5 回答 5

14

$submitsubject在or中有一个单引号$submit_message

为什么这是个问题?

单引号字符终止 MySQL 中的字符串以及所有被视为 sql 命令的内容。你真的不想那样写你的sql。充其量,您的应用程序会间歇性中断(正如您所观察到的),而在最坏的情况下,您刚刚引入了一个巨大的安全漏洞。

想象一下,如果有人'); DROP TABLE private_messages;在提交消息中提交。

您的 SQL 命令将是:

INSERT INTO private_messages (to_id, from_id, time_sent, subject, message) 
        VALUES('sender_id', 'id', now(),'subjet','');

DROP TABLE private_messages;

相反,您需要正确清理您的价值观。

至少,您必须运行每个值,mysql_real_escape_string()但您确实应该使用准备好的语句。

如果您使用的是mysql_real_escape_string()您的代码,则如下所示:

if($_POST['submit_message']){

if($_POST['form_subject']==""){
    $submit_subject="(no subject)";
}else{
    $submit_subject=mysql_real_escape_string($_POST['form_subject']); 
}
$submit_message=mysql_real_escape_string($_POST['form_message']);
$sender_id = mysql_real_escape_string($_POST['sender_id']);

这是一篇关于准备好的陈述和 PDO 的精彩文章。

于 2012-06-19T02:36:56.843 回答
4

这称为 SQL 注入。'尝试在 mysql 查询中打开/关闭字符串。您应该始终转义进入查询的任何字符串。

例如,

而不是这个:

"VALUES ('$sender_id') "

做这个:

"VALUES ('". mysql_real_escape_string($sender_id)  ."') "

(或等效的,当然)

但是,最好使用 PDO、命名参数、预准备语句或许多其他方式自动执行此操作。关于这个和 SQL 注入的研究(这里你有一些技术)。

希望能帮助到你。干杯

于 2012-06-19T02:37:54.243 回答
0

请确保您已完全下载 sqldump,当我们尝试导入一半/不完整下载的 sqldump 时,此问题很常见。请检查您的 sqldump 文件的大小。

于 2015-05-20T09:36:08.900 回答
0

当我使用此代码更新记录时,我遇到了同样的错误:

@mysqli_query($dbc,$query or die()))

删除后or die,它开始正常工作。

于 2016-08-17T21:30:30.937 回答
0

我之前遇到过这个问题,原因很简单:检查你的变量,如果有字符串,所以把它放在引号 '$your_string_variable_here' 中,如果是数字,不要加引号。例如,如果我有这些数据: $name(它将是字符串)$phone_number(它将是数字)所以,它将是这样的:

$query = "INSERT INTO users( name, phone) VALUES ('$name', $phone)"; 就这样,它会被修复的^_^

于 2016-08-30T17:05:06.617 回答