Javascript post方法不发送全文
我有一个存储过程,可以同时向数据库发送和获取博客数据:Javascript post方法不发送全文,javascript,php,jquery,mysql,ajax,Javascript,Php,Jquery,Mysql,Ajax,我有一个存储过程,可以同时向数据库发送和获取博客数据: 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) VALU
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);
}
});
});
这条线
$answer=$\u POST['answer\u body']
只包含比实际文本小得多的部分文本,而不是全文。因此,数据库中存储的文本较少
这个问题的一个例子是
我将此数量的文本发送到数据库中存储
但我只在DB中存储了这几行文本
祝贺Mathematics SE成为第一个解锁的站点
这顶帽子,活动开始不到18小时!也要进行代码审查
从技术上讲,Blender SE只需要三个用户即可获得
此帽子,即在获得帽子时,一个用户拥有16个或更多
更多的帽子,另外两个用户的帽子足够第一个用户使用
没有
几乎没有什么选择 撇号可能是SQL语句的结尾。你需要逃离它 您试图存储数据的字段太小
您没有在Javascript代码中正确编码POST数据。不要连接字符串,而是将data:选项设置为一个对象,jQuery将正确编码它
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; ?>
};
问题
正如其他人所提到的,这个问题是由答案主体中的特殊字符引起的。当前存储答案的方式会导致特殊字符干扰SQL命令,并使您容易受到SQL注入的影响
解决方案1
您可以在PHP中使用mysqli\u real\u escape\u字符串
mysqli_real_escape_string-将字符串中的特殊字符转义为
在SQL语句中使用,并考虑
连接
解决方案2更好
通过使用带绑定参数的预处理语句,可以解决问题并防止SQL注入。检查其他字段以了解更多信息。确保您的字段可以容纳更多字符,这可能就是它被截断的原因。如果点1==true,则该字段的数据类型为Longtext,这是否意味着他容易受到SQL注入的攻击?你能告诉我这个问题在哪一行吗?找不到it@AL-zami总是转义字符串中的特殊字符,以便在SQL语句中使用$answer=mysqli_real_escape_string$_POST['answer_body']@barts最有可能,但可能不是,因为他使用的是存储过程。@Al zami我会用更小的数据再试一次,但在那里保留一个撇号。尝试发送这是一个“测试”,看看存储了什么。如果它在撇号之前再次结束,那么您的问题是撇号。但是正如您所看到的,我的查询是参数化的调用login.post_和_fetch_ans。在将其发送到数据库之前,我将值绑定到它。那么问题是什么呢?如果我使用它,它可以使用引号存储数据,但作为响应,我得到一个错误:SyntaxError:JSON.parse:在我的ajax响应中,JSON数据的第1行第1列出现意外的数据结尾,这意味着您没有返回正确的JSON。确保脚本在回显json_encode$result之前或之后不会生成任何其他输出。您可以使用浏览器控制台的“网络”选项卡查看完整的AJAX响应,并查看返回的内容。
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; ?>
};