【问题标题】:post method not sending full text发布方法不发送全文
【发布时间】:2016-04-13 15:44:28
【问题描述】:

我有一个存储过程可以同时向数据库发送和获取博客数据:

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);
    }
}

这一行

$answer=$_POST['answer_body'];

仅包含部分(比实际文本少得多)文本,而不是全文。因此数据库中存储的文本较少

问题的一个例子是

我将这么多的文本发送到数据库中存储

但我只得到存储在数据库中的这几行文本

恭喜数学 SE 成为第一个解锁的网站 这顶帽子,活动不到 18 小时!也适用于 Code Review SE 和 Blender SE,从技术上讲,每个用户只需要三个用户即可获得 这顶帽子(即在获得帽子时,一位用户有 16 或 更多的帽子,另外两个用户有足够的帽子,第一个用户 没有

【问题讨论】:

  • 确保您的字段可以容纳更多字符,这可能是它被切断的原因。
  • 它的数据类型为longtext

标签: javascript php jquery mysql ajax


【解决方案1】:

问题

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

解决方案 1

您可以在 PHP 中使用mysqli_real_escape_string

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

mysqli_real_escape_string

解决方案 2(更好)

您可以通过使用带有绑定参数的准备好的语句来解决您的问题并防止 SQL 注入。查看其他SO answer 了解更多信息。

【讨论】:

  • 但是你可以看到我的查询是参数化的 "CALL login.post_and_fetch_ans(?,?,?)" 。我在将它发送到数据库之前绑定了它的值。那么问题是什么?
【解决方案2】:

您没有正确编码 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; ?>
};

【讨论】:

  • 如果我使用它,它可以工作(使用引号存储数据),但作为响应,我收到一个错误:SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of JSON data in my ajax 响应
  • 这意味着您没有发回正确的 JSON。确保脚本在执行echo json_encode$result) 之前或之后不会产生任何其他输出。您可以使用浏览器控制台的“网络”选项卡查看完整的 AJAX 响应,您将看到返回的内容。
【解决方案3】:

想到的选项很少。

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

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

【讨论】:

  • 如果第 1 点 == true,是否意味着他容易受到 SQL Injection 的攻击?
  • 你能告诉我这个问题在哪一行吗?找不到它
  • @AL-zami 始终转义字符串中的特殊字符以用于 SQL 语句。 $answer= mysqli_real_escape_string($_POST['answer_body']);
  • @barts 很可能,但可能不是,因为他使用的是存储过程。
  • @Al-zami 我会用更小的数据再试一次,但要在其中保留一个撇号。尝试发送“这是一个'测试”并查看存储的内容。如果它在撇号之前再次结束,那么您的问题在于撇号。
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2012-01-04
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多