2016-04-10 9 views
0

Ich habe dieses Kommentar-System, das nicht gut funktioniert. Er fügt den Kommentar in die Datenbank ein, zeigt ihn jedoch erst nach dem Aktualisieren der Seite an. Ich möchte, dass es sofort nach dem Klicken auf "Senden" -Schaltfläche angezeigt wird und mit einem Gleiteffekt angezeigt wird.Ajax/PHP Kommentar System funktioniert nicht

Ich vermute, die $arr[$k] = mysql_real_escape_string($v); verursacht das Problem. Ich benutze jetzt PDO, also weiß ich, dass das nicht da sein muss, aber wenn ich es entferne, funktioniert der Code nicht mehr.

Mein Code ist unten.

<?php 
    class Comment{ 
     private $data = array(); 
     public function __construct($row){ 
      $this->data = $row; 
     } 
     public function markup(){ 
      $d = &$this->data; 
      $link_open = ''; 
      $link_close = ''; 
      if($d['url']){ 
       $link_open = '<a href="'.$d['url'].'">'; 
       $link_close = '</a>'; 
      } 
      $d['dt'] = strtotime($d['dt']); 
      $url = 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]); 
      return ' 
      <div class="comment"> 
       <div class="name">'.$link_open.$d['name'].$link_close.'</div> 
       <div class="date" title="Added at '.date('H:i \o\n d M Y',$d['dt']).'">'.date('d M Y',$d['dt']).'</div> 
       <p>'.$d['body'].'</p> 
      </div> 
      '; 
     } 
     public static function validate(&$arr){ 
      $errors = array(); 
      $data = array(); 
      if(!($data['email'] = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL))){ 
       $errors['email'] = '<div>Please insert your email</div>'; 
      } 
      if(!($data['url'] = filter_input(INPUT_POST,'url',FILTER_VALIDATE_URL))){ 
       $url = ''; 
      } 
      if(!($data['body'] = filter_input(INPUT_POST,'body',FILTER_CALLBACK,array('options'=>'Comment::validate_text')))){ 
       $errors['body'] = '<div>Please type your comment</div>'; 
      } 
      if(!($data['name'] = filter_input(INPUT_POST,'name',FILTER_CALLBACK,array('options'=>'Comment::validate_text')))){ 
       $errors['name'] = '<div>Please insert your name</div>'; 
      } 
      if(!empty($errors)){ 
       $arr = $errors; 
       return false; 
      } 
      foreach($data as $k=>$v){ 
       $arr[$k] = mysql_real_escape_string($v); 
      } 
      $arr['email'] = strtolower(trim($arr['email'])); 
      return true; 
     } 
     private static function validate_text($str){ 
      if(mb_strlen($str,'utf8')<1) 
       return false; 
       $str = nl2br(htmlspecialchars($str)); 
       $str = str_replace(array(chr(10),chr(13)),'',$str);  
       return $str; 
     } 
    } 
?> 

Und auch meine js-Datei:

<script>  
    $(document).ready(function(){ 
     var working = false; 
     $('#addCommentForm').submit(function(e){ 
      e.preventDefault(); 
      if(working) return false; 
       working = true; 
       $('#submit').val('working'); 
       $('span.error').remove(); 
      $.post('commenting/submit.php',$(this).serialize(),function(msg){ 
      working = false; 
      $('#submit').val('submit'); 
      if(msg.status){ 
     $(msg.html).hide().insertBefore('#addCommentContainer').slideDown(); 
       $('#body').val(''); 
      }else { 
       $.each(msg.errors,function(k,v){ 
        $('label[for='+k+']').append('<span class="error">'+v+'</span>'); 
        }); 
       } 
      },'json'); 
     }); 
    }); 
</script> 
+0

Damit sich das System wie gewünscht verhält, müssen Sie AJAX verwenden und ich sehe nicht, dass Sie es verwenden. – Erick

+0

Thx dafür, obwohl ich nicht viel Erfahrung in Javascript usw. habe, weiß ich, dass es so ohne Ajax arbeitete, änderte ich das ganze System zu PDO und die Hölle brach dann los, irgendwelche Vorschläge? –

+0

Ich habe die Formatierung verbessert und die Anweisungen "Bitte" und "Danke" entfernt, um den Community-Standards zu entsprechen. – CodeMouse92

Antwort

0

Was ist der obere Tag für:

<div class="comment"> 
     <div class="name">'.$link_open.$d['name'].$link_close.'</div> 
     <div class="date" title="Added at '.date('H:i \o\n d M Y',$d['dt']).'">'.date('d M Y',$d['dt']).'</div> 
     <p>'.$d['body'].'</p> 
    </div> 

Wenn Sie Ihre Kommentare im Inneren des commets Tag zeigen, zum Beispiel:

<div id="comments"> 
<div class="comment"> 
    <div class="name">'.$link_open.$d['name'].$link_close.'</div> 
    <div class="date" title="Added at '.date('H:i \o\n d M Y',$d['dt']).'">'.date('d M Y',$d['dt']).'</div> 
    <p>'.$d['body'].'</p> 
</div> 
</div> 

Dann bearbeiten Sie Ihre js wie folgt:

<script> 
    $(document).ready(function(){ 
     var working = false; 
     $('#addCommentForm').submit(function(e){ 
      e.preventDefault(); 
      if(working) return false; 
      working = true; 
      $('#submit').val('working'); 
      $('span.error').remove(); 
      $.post('commenting/submit.php',$(this).serialize(),function(msg){ 
       working = false; 
       $('#submit').val('submit'); 
       if(msg.status){ 
        $(msg.html).hide().insertBefore('#addCommentContainer').slideDown(); 
        $('.comment').val(''); 
        /// I added below code to show updated comments inside of comments tag 
        $('#comments').html(msg.html+$('#comments').html()); 

       }else { 
        $.each(msg.errors,function(k,v){ 
         $('label[for='+k+']').append('<span class="error">'+v+'</span>'); 
        }); 
       } 
      },'json'); 
     }); 
    }); 
</script> 
+0

thx für die Anstrengung, aber es hat es nicht behoben, ich denke immer noch das Problem ist das Freaking ** mysql_real_escape_string ($ v); **, irgendwelche Vorschläge dafür? –

+0

@Jman Verwenden Sie nicht mysql_real_escape_string, wenn Sie PDO verwenden. Es gibt keine Möglichkeit, die Gültigkeit von PDO zu verletzen. Sie müssen also nicht mysql_real_escape_string verwenden. Aber ich denke, Problem ist das nicht. – mertizci

+0

Kannst du diese Zeile '$ ('# comments') ändern html (msg.html + $ ('# comments'). Html());' mit dieser 'console.log (msg.html);' und überprüfe deine JS Konsole, sehen, was Drucke. – mertizci