我有一个存储过程,可以同时向数据库发送和获取博客数据:
CREATE DEFINER=`root`@`localhost` PROCEDURE `post_and_fetch_ans`(
IN answerbody longtext,
IN postid int,
IN answerer int)
BEGIN
INSERT INTO `login`.`answers` (answer_body,userpost_post_id,users_user_id) VALUES (answerbody,postid,answerer);
SELECT * FROM `login`.`answers` WHERE userpost_post_id = postid ORDER BY answer_date DESC LIMIT 1;
END
但我的问题是我在文本编辑器上写的文本数据量,只有几行被发送并存储到数据库。我使用ajax将数据发送到php页面,将其存储到数据库。
$('#answerform').submit(function(event){
event.preventDefault();
var data='answer_body='+CKEDITOR.instances.content.getData()+'&userpost_post_id=<?php echo $contents[0]->post_id;?>&users_user_id=<?php echo $userdata->user_id; ?>';
alert(data);
$.ajax('../includes/verifyanswer.php',{
data:data,
type:"POST",
datatype:'json',
success:function(response){
alert(response);
var obj=$.parseJSON(response);
$('#mainanswer').hide();
$('#answerform').hide();
$('#answerthisquestion').show();
var str="<div class='styleanswer' >"+obj[0]['answer_body']+'</div><hr>';
$('#answerwrapper').append(str);
$('#answerwrapper pre code').each(function(i, block) {
hljs.highlightBlock(block);
});
},
error:function(response){
alert(response);
}
});
});
和verifyanswer.php页面是:
require_once '../core/init.php';
$answer=$_POST['answer_body'];
$post_id=$_POST['userpost_post_id'];
$answerer=$_POST['users_user_id'];
if(isset($answer,$post_id,$answerer)){
if(!empty($answer) && !empty($post_id) && !empty($answerer)){
$db = DB::getInstance();
$result = $db->post_and_fetch("CALL login.post_and_fetch_ans(?,?,?)",array($answer,$post_id,$answerer))->result();
echo json_encode($result);
}
}
此行
$回答= $ _ POST [ 'answer_body'];
仅包含部分(非常少于实际文本)文本,而不包含全文。因此,较少的文本存储在数据库中
问题的一个例子是
我发送此数量的文本以存储在DB
中但我只收到存储在DB
中的这几行文字祝贺数学SE成为第一个解锁的网站 这顶帽子,进入活动还不到18个小时!也适用于Code Review SE 和Blender SE技术上只需要三个用户 这顶帽子(即在帽子被挣到的时候,一个用户有16或者 更多的帽子,和其他两个用户有足够的帽子,第一个用户 没
答案 0 :(得分:4)
很少有选择。
撇号可能会结束您的SQL语句。你需要逃脱它。
您尝试存储数据的字段太小。
答案 1 :(得分:3)
正如其他人所提到的,问题是由答案体中的特殊字符引起的。您存储答案的当前方式会导致特殊字符干扰SQL命令,并使您容易受到 SQL注入的攻击。</ p>
您可以在PHP中使用mysqli_real_escape_string
。
mysqli_real_escape_string - 转义字符串中的特殊字符 在SQL语句中使用,考虑到当前的字符集 连接
您可以通过使用带有绑定参数的预准备语句来修复问题并阻止 SQL注入。查看其他SO answer了解详情。
答案 2 :(得分:1)
您未正确编码Javascript代码中的data:
数据。而不是连接字符串,将var data = {
answer_body: CKEDITOR.instances.content.getData(),
userpost_post_id: <?php echo $contents[0]->post_id;?>,
users_user_id: <?php echo $userdata->user_id; ?>
};
选项设置为对象,jQuery将对其进行正确编码。
phpbrew switch