我在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'.
Run Code Online (Sandbox Code Playgroud)
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"> (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>
Run Code Online (Sandbox Code Playgroud)
要插入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());
}
}
?>
Run Code Online (Sandbox Code Playgroud)
这个错误意味着什么,我做错了什么?
Cod*_*ian 12
在$submitsubject或中有一个单引号$submit_message
为什么这是个问题?
单引号char终止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;
Run Code Online (Sandbox Code Playgroud)
相反,您需要正确清理您的价值观.
在最低限度你必须运行每个值,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']);
Run Code Online (Sandbox Code Playgroud)