jQuery ajax帖子并不总是适用于长文本

时间:2016-02-06 18:32:30

标签: php jquery ajax

由于某些原因,当帖子包含很长的文本(即超过200个字左右)时,长帖子不会插入到数据库中。但是,这个问题非常模糊,因为其中一些长文本被插入到数据库中(例如,插入一个大的lorum ipsum文本没有任何问题)。首先我认为它与标点符号有关,但这不是问题。此外,文本中断等不是问题的原因。此外,我检查了数据库中注释部分的数据结构(如下所示分配了一个textarea),在那里我看到它已经被赋予了一个长文本作为一种类型。因此,字符限制也不是问题所在。因此,奇怪的是它只发生在"一些"长篇文章。大约200个单词的短文本没问题,插入完美。

我的代码如下。首先是HTML部分:

    <div class="new-com-bt">
    <span>Schrijf hier uw bericht ....</span>
</div>
<div class="new-com-cnt">
    <input type="text" id="name-com" name="name-com" value="" placeholder="Uw naam" />
    <input type="text" id="mail-com" name="mail-com" value="" placeholder="Uw e-mail adres" />
    <input type="text" id="code-com" name="code-com" value="" placeholder="Viercijferige code..." />
    <textarea class="the-new-com"></textarea>

    <span class="rating2">Beoordeel ons:&nbsp;
        <input type="radio" class="rating-input"
            id="rating-input-2-1" name="example" value="5">
        <label for="rating-input-2-1" class="rating-star"></label>
        <input type="radio" class="rating-input"
            id="rating-input-2-2" name="example" value="4">
        <label for="rating-input-2-2" class="rating-star"></label>
        <input type="radio" class="rating-input"
            id="rating-input-2-3" name="example" value="3">
        <label for="rating-input-2-3" class="rating-star"></label>
        <input type="radio" class="rating-input"
            id="rating-input-2-4" name="example" value="2">
        <label for="rating-input-2-4" class="rating-star"></label>
        <input type="radio" class="rating-input"
            id="rating-input-2-5" name="example" value="1">
        <label for="rating-input-2-5" class="rating-star"></label>
    </span>

    <div class="bt-add-com">Plaats bericht</div>
    <div class="bt-cancel-com">Annuleer</div>
</div>

现在是JQuery部分:

<script type="text/javascript">
  $(function(){ 
    //alert(event.timeStamp);
              $('.new-com-bt').click(function(event){    
              $(this).hide();
              $('.new-com-cnt').show();
               $('#name-com').focus();
    });

    /* when start writing the comment activate the "add" button */
    $('.the-new-com').bind('input propertychange', function() {
       $(".bt-add-com").css({opacity:0.6});
       var checklength = $(this).val().length;
       if(checklength){ $(".bt-add-com").css({opacity:1}); }
    });

    /* on clic  on the cancel button */
    $('.bt-cancel-com').click(function(){
        $('.the-new-com').val('');
        $('.new-com-cnt').fadeOut('fast', function(){
            $('.new-com-bt').fadeIn('fast');
        });
    });

    // on post comment click 
    $('.bt-add-com').click(function(){
        var theCom = $('.the-new-com');
        var theName = $('#name-com');
        var theMail = $('#mail-com');
        var theCode = $('#code-com');
        var theRating = $('input[name=example]:checked');

        if( !theCom.val()){ 
            alert('U moet een bericht schrijven'); 
        }else if(theCode.val() != '7624'){
            alert('Vul de viercijferige code in die u heeft gekregen tijdens de ceremonie')
        }else{
            $.ajax({
                type: "POST",
                url: "ajax/add-comment.php",
                data: 'act=add-com&id_post='+<?php echo $id_post; ?>+'&name='+theName.val()+'&email='+theMail.val()+'&comment='+theCom.val()+'&rating='+theRating.val(),
                success: function(html){
                    theCom.val('');
                    theMail.val('');
                    theName.val('');
                    theRating.val('');
                        setTimeout(function(){
                            //fade back
                            $('.new-com-cnt').html("Dank u wel voor uw bericht. Deze zal zo spoedig mogelijk op de site verschijnen!");
                        }, 0);
                    }  
            });
        }
    });

});

这是add-comment.php脚本:

<?php
extract($_POST);
if($_POST['act'] == 'add-com'):
$name = htmlentities($name);
$email = htmlentities($email);
$comment = htmlentities($comment);
$rating = htmlentities($rating);

include('../config.php'); 

// Get gravatar Image 
// https://fr.gravatar.com/site/implement/images/php/
$default = "mm";
$size = 35;
$grav_url = "http://www.gravatar.com/avatar/" . md5( strtolower( trim( $email ) ) ) . "?d=" . $default . "&s=" . $size;

if(strlen($name) <= '1'){ $name = 'Guest';}
//insert the comment in the database
mysql_query("INSERT INTO comments (name, email, comment, id_post, rating, display)VALUES( '$name', '$email', '$comment', '$id_post', '$rating', 'nee')");
if(!mysql_errno()){
?>

<div class="cmt-cnt">
    <img src="<?php echo $grav_url; ?>" alt="" />
    <div class="thecom">
        <h5><?php echo $name; ?></h5><span data-utime="1371248446" class="com-dt"><?php echo date('d-m-Y H:i'); ?></span><span class="com-dt-rating"><span class="rating">
                <input type="radio" class="rating-input"
                    id="rating-input-1-1" value="5" disabled="disabled" <?php echo ($rating=='5')?'checked':'' ?> />
                <label for="rating-input-1-1" class="rating-star"></label>
                <input type="radio" class="rating-input"
                    id="rating-input-1-2" value="4" disabled="disabled" <?php echo ($rating=='4')?'checked':'' ?> />
                <label for="rating-input-1-2" class="rating-star"></label>
                <input type="radio" class="rating-input"
                    id="rating-input-1-3" value="3" disabled="disabled" <?php echo ($rating=='3')?'checked':'' ?> />
                <label for="rating-input-1-3" class="rating-star"></label>
                <input type="radio" class="rating-input"
                    id="rating-input-1-4" value="2" disabled="disabled" <?php echo ($rating=='2')?'checked':'' ?> />
                <label for="rating-input-1-4" class="rating-star"></label>
                <input type="radio" class="rating-input"
                    id="rating-input-1-5" value="1" disabled="disabled" <?php echo ($rating=='1')?'checked':'' ?> />
                <label for="rating-input-1-5" class="rating-star"></label>
            </span></span>
        <br/>
        <p>
            <?php echo $comment; ?>
        </p>
    </div>
</div><!-- end "cmt-cnt" -->

<?php } ?>

插入的长文本示例:

  

本文中描述的用于建模和形式化需求的技术称为FLAGS。 FLAGS   除了清晰的目标之外,还提供了模糊和正式化模糊目标的可能性。对这些有所区别   模糊目标是它们不能具体实现,而清晰的目标可以。相反,   这些目标的可实现性是模糊的,因此它们既不能满足也不能满足,但它们可以   在一定程度上满意。在驾驶汽车作为目标时节省燃料的想法。不清楚   是否具体实现了这一目标。帽子是,油耗只能很小,但事实并非如此   说明目标是否明确实现。相反,它只在一定程度上得到满足,   即当汽车只使用少量燃料时。他可以应用同样的思维方式   物理疗法通过模拟这些目标来评估运动的速度和正确性   由一个人实现,只有在FLAGS目标模型元素出现时才能正确完成   正式化。

     

为了应用FLAGS,需要执行几个步骤。这些步骤可以在附录A中找到   表1将通过描述应用程序的示例在本章中进一步阐述   被描述为学习机器人如何像人类一样移动。该示例涉及机器人   应用,因此描述了另一种情况,Pasquale等人的FLAGS元模型。 (2013)   扩展到本章所述的示例。他扩展的FLAGS元模型可以   在附录A中包含的图2中进行了咨询。此外,对于该示例,假设为   要求已经确定。

     

他的FLAGS元模型由几个描述FLAGS目标组成的类组成   模型在抽象的水平。它解释了要么是明确的目标(明确的目标),要么是模糊的目标(可以实现   具体程度)可以建模。此外,目标可以相互影响(受关系影响)   并且可以分解为子目标(按关系分解)。实现这些目标是   对于人和机器人都很重要。此外,域假设(条件)和   FLAGS元模型中采用了操作,并且一个人使用控制器来监视他或她   机芯可以响应这些运动

未插入文本的示例:

  

Mijn iboga ervaring bij iboga farm   Zeer mooie en rustige locatie en een heerlijke sfeer,goed verzorgd。   Geen haastigheid maar alles in ee relaxte flow。   Ik wist niet wat ik moest verwachten maar de jongens stellen je goed gerust,goede uitleg en er word goed rekening gehouden met je gezondheid toestand en eet gewoontes。   Alles是aanwezig wat men nodig heeft。 Eten,drinken,douche gelegenheid,slaap plek等   Mooie ceremonie voorafgaand。   Eerst krijg je een test dosis om vast te kunnen stellen of men allergisch is voor de substantie。   Iets wat veel andere niet doen。   Als het eenmaal werkt word de sessie begonnen terwijl je boven op een comfortabel bed ligt,   Met een spiritueel muziekje op de achtergrond。   Toen het eenmaal goed werkte ervaarde ik een soort van ijl achtige droomstaat trip waarbij er visioenen tevoorschijn komen。   Ik persoonlijk heb vorige levens en voorouders gezien en gevoeld。   Ondertussen word er zeer goed op je gelet en je word uitstekend verzorgd,je zal niks tekort komen gedurende de iboga reis。   Als男人het厕所nodig heeft wel甚至om assistentie vragen想要het lopen gaat wat moeilijk。   Tijdens de reis zal het voor ieder andere anders zijn want het zijn allemaal persoonlijke kwesties die verwerkt worden。   Ondertussen de sessie merk je al dat er veel dwars liggende emotie&#39; s en gewoontes verdwijnen uit je systeem,en

2 个答案:

答案 0 :(得分:1)

示例1没有单引号。示例2有一个引号,因此您的数据库会抛出1064错误。使用mysql_errno()时,如果有错误,您应该对错误执行某些操作。所以在结束时

} else {
    echo mysql_errno() . ": " . mysql_error();
}

错误发生在emotie's,因为'关闭了SQL字符串,然后剩下的文本SQL不知道如何处理。这也是SQL注入的工作原理。恶意使用',然后传入SQL命令。使用mysql_函数,您必须使用转义函数来防止这种情况。您应该真正更新到mysqli_PDO。然后,您可以使用参数化查询,其中驱动程序处理引用。

所以要分配你的变量,它们应该是:

$name = mysql_real_escape_string(htmlentities($name);
$email = mysql_real_escape_string(htmlentities($email));
$comment = mysql_real_escape_string(htmlentities($comment));
$rating = mysql_real_escape_string(htmlentities($rating));

另请注意手册页面上的警告这不是最好的方法,但这是使用mysql_驱动程序的最佳方法。 http://php.net/manual/en/function.mysql-error.php

有关该主题的更多信息,请参阅:
How can I prevent SQL injection in PHP? {
{3}}

答案 1 :(得分:0)

您需要使用准备好的SQL语句,以便不会出现sql注入问题,并且用户输入中的撇号不会导致插入操作。

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

您的代码应与此类似

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$databasename = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $databasename);

// Was there a connection error?
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO comments (name, email, comment) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $name, $email, $comment);

// set parameters and execute
$name = "John";
$email = "john@example.com";
$comment = "TEST";
$stmt->execute();