Signaler

Like Dislike rating system with jQuery, Ajax and PHP [Résolu]

Posez votre question placi2 1Messages postés samedi 15 octobre 2016Date d'inscription 15 octobre 2016 Dernière intervention - Dernière réponse le 17 oct. 2016 à 10:27
Bonjour,

je telecharge le tuto Like Dislike rating system with jQuery, Ajax and PHP dans le site codexworld.
mais quand je lance le project il y a deux erreus que je ne parviens pas a corriger:


1. Notice: Undefined variable: data in C:\xampp\htdocs\like_dislike_jquery_ajax_php\tutorial.php on line 30
<?php
class Tutorial{
 
 function __construct(){
  //db details
  $db_host = 'localhost';
  $db_user = 'root';
  $db_pass = '';
  $db_name = 'codexworld';
  
  //connect db
  $con = mysql_connect($db_host, $db_user, $db_pass);
  
  //select db
  mysql_select_db($db_name, $con);
 }
 
 function get_rows($id = ''){
  if($id != ''){
   //fetch single row
   $query = mysql_query("SELECT * FROM tutorials WHERE id = $id");
   $data = mysql_fetch_assoc($query);
  }else{
   //fetch all rows
   $query = mysql_query("SELECT * FROM tutorials");
   while($row = mysql_fetch_assoc($query)){
    $data[] = $row;
   }
  }
  return $data;
 }
 
 function insert($data = array()){
  $data_array_num = count($data);
  $columns = "";
  $values = "";
  $i=0;
  foreach($data as $key=>$val){ 
   $i++;
   $sep = ($i == $data_array_num)?"":", ";
   $columns .= $key.$sep;
   $values .= $val.$sep;
  }
  $insert = mysql_query("INSERT INTO tutorials ($columns) VALUES ($values)");
  return $insert?TRUE:FALSE;
 }
 
 function update($data = array(), $conditions = array()){
  $data_array_num = count($data);
  $cols_vals = "";
  $condition_str = "";
  $i=0;
  foreach($data as $key=>$val){
   $i++;
   $sep = ($i == $data_array_num)?'':', ';
   $cols_vals .= $key."='".$val."'".$sep;
  }
  foreach($conditions as $key=>$val){
   $i++;
   $sep = ($i == $data_array_num)?"":" AND ";
   $condition_str .= $key."='".$val."'";
  }

  $update = mysql_query("UPDATE tutorials SET $cols_vals WHERE $condition_str");
  return $update?TRUE:FALSE;
 }
}
?>

2. Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\like_dislike_jquery_ajax_php\index.php on line 69
<?php
include_once("tutorial.php");
$tutorial = new Tutorial();
$trows = $tutorial->get_rows();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Like and Dislike using jQuery, Ajax and PHP</title>
<link type="text/css" rel="stylesheet" href="css/bootstrap.min.css"/>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<style type="text/css">
.row{ margin:20px 20px 20px 20px;}
.ratings{ font-size:25px !important;}
.thumbnail img {
    width: 100%;
}

.ratings {
    padding-right: 10px;
    padding-left: 10px;
    color: #d17581;
}

.thumbnail {
    padding: 0;
}

.thumbnail .caption-full {
    padding: 9px;
    color: #333;
}
.glyphicon-thumbs-up:hover{ color:#008000; cursor:pointer;}
.glyphicon-thumbs-down:hover{ color: #E10000; cursor:pointer;}
.counter{ color:#333333;}
.thumbnail img{height:200px;}
</style>

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
/**


* Function Name: cwRating()

* Function Author: CodexWorld

* Description: cwRating() function is used for implement the rating system. cwRating() function insert like or dislike data into the database and display the rating count at the target div.

* id = Unique ID, like or dislike is based on this ID.

* type = Use 1 for like and 0 for dislike.

* target = Target div ID where the total number of likes or dislikes will display.

**/
function cwRating(id,type,target){
 $.ajax({
  type:'POST',
  url:'rating.php',
  data:'id='+id+'&type='+type,
  success:function(msg){
   if(msg == 'err'){
    alert('Some problem occured, please try again.');
   }else{
    $('#'+target).html(msg);
   }
  }
 });
}
</script>
</head>

<body>
<div class="row">
 <?php foreach($trows as $trow){ ?>
    <div class="col-sm-4 col-lg-4 col-md-4">
        <div class="thumbnail">
            <img src="<?php echo 'images/'.$trow['image']; ?>" alt="" />
            <div class="caption">
                <h4><a href="javascript:void(0);" rel="nofollow noopener noreferrer" target="_blank"><?php echo $trow['title']; ?></a></h4>
                <p><?php echo $trow['details']; ?></p>
            </div>
            <div class="ratings">
                <p class="pull-right"></p>
                <p>
                    <!-- Like Icon HTML -->
                    <span class="glyphicon glyphicon-thumbs-up" onClick="cwRating(<?php echo $trow['id']; ?>,1,'like_count<?php echo $trow['id']; ?>')"></span> 
                    <!-- Like Counter -->
                    <span class="counter" id="like_count<?php echo $trow['id']; ?>"><?php echo $trow['like_num']; ?></span>   
                    
                    <!-- Dislike Icon HTML -->
                    <span class="glyphicon glyphicon-thumbs-down" onClick="cwRating(<?php echo $trow['id']; ?>,0,'dislike_count<?php echo $trow['id']; ?>')"></span> 
                    <!-- Dislike Counter -->
                    <span class="counter" id="dislike_count<?php echo $trow['id']; ?>"><?php echo $trow['dislike_num']; ?></span>
                </p>
            </div>
        </div>
    </div>
    <?php } ?>
</div>
</body>
</html>


Merci.

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
"
Afficher la suite 
Utile
+0
moins plus
Bonjour,

Première erreur
 function get_rows($id = ''){
  if($id != ''){
   //fetch single row
   $query = mysql_query("SELECT * FROM tutorials WHERE id = $id");
   $data = mysql_fetch_assoc($query);
  }else{
   //fetch all rows
   $query = mysql_query("SELECT * FROM tutorials");
   while($row = mysql_fetch_assoc($query)){
    $data[] = $row;
   }
  }
 // Si $data existe et n'est pas vide on retourne $datas sinon on retourne NULL
  return !empty($data) ? $data :NULL;
 }

NB: Si la requête ne retourne aucun résultat ... $data est vide... et vu que tu ne l'as pas initialisé avant.. le code t'indique qu'il est "undefined".
Avec l'écriture ternaire et le !empty tu t'assures qu'il existe avant de t'en servir.


La seconde erreur est du même genre et fait suite à la première...
Tu essaies de faire :
 <?php foreach($trows as $trow){ ?>

Sauf que $trows est le retour de la fonction get_rows ...
Vu que ta fonction ne retourne rien.... la variable ne contient rien !
Donc avant de boucler... on vérifie que la variable existe et n'est pas vide
<?php
 if(!empty($trows)){
    foreach($trows as $trow){
       // le reste du code de la boucle

    } // fin du foreach
 }// fin du if
?>
   
?>



Par contre je ne comprend pas l'interet de mettre du php dans ta page HTML si ton but est de le faire en AJAX....






Cordialement, 
Jordane                                                                 
jordane45 15436Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 8 décembre 2016 Dernière intervention - 15 oct. 2016 à 18:14
Je précise également que tu utilises l'extension : "MYSQL" considérée comme obsolète.
Je t'invite vivement à passer à mysqli ou à la PDO.
http://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

Voici un exemple d'ajax utilisant JQUERY + PDO
http://www.commentcamarche.net/forum/affich-33258760-remplir-un-formulaire-dynamiquement-en-fonction-d-une-combobox#2
Répondre
placi2- 17 oct. 2016 à 09:48
Merci Jordan, maintenat ca marcher
mais je trouve que l'utilisateur peut vote autant de fois comment je peux controle le vote apartir de login
Répondre
jordane45 15436Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 8 décembre 2016 Dernière intervention - 17 oct. 2016 à 10:27
Si tu enregistres le login avec le vote ... il te suffit de contrôler si un vote avec ce login existe déjà.
(une simple requête de type SELECT WHERE )
Tu peux le faire au moment du vote ou avant le vote (via un AJAX par exemple).
Ceci étant une nouvelle question... je t'invite, SI TU N'Y ARRIVES PAS, à ouvrir une nouvelle discussion sur le forum.
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !