发布方法不发送全文

时间:2016-01-08 20:52:05

标签: 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) 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

enter image description here

但我只收到存储在DB

中的这几行文字
  

祝贺数学SE成为第一个解锁的网站   这顶帽子,进入活动还不到18个小时!也适用于Code Review SE   和Blender SE技术上只需要三个用户   这顶帽子(即在帽子被挣到的时候,一个用户有16或者   更多的帽子,和其他两个用户有足够的帽子,第一个用户   没

3 个答案:

答案 0 :(得分:4)

很少有选择。

  1. 撇号可能会结束您的SQL语句。你需要逃脱它。

  2. 您尝试存储数据的字段太小。

答案 1 :(得分:3)

问题

正如其他人所提到的,问题是由答案体中的特殊字符引起的。您存储答案的当前方式会导致特殊字符干扰SQL命令,并使您容易受到 SQL注入的攻击。<​​/ p>

解决方案1 ​​

您可以在PHP中使用mysqli_real_escape_string

  

mysqli_real_escape_string - 转义字符串中的特殊字符   在SQL语句中使用,考虑到当前的字符集   连接

mysqli_real_escape_string

解决方案2(更好)

您可以通过使用带有绑定参数的预准备语句来修复问题并阻止 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