IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Datatable pas de resultat sur trie colonne 0


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 20
    Par défaut Datatable pas de resultat sur trie colonne 0
    Bonjour à tous
    Je rencontre une difficulté et je demande votre aide.

    J'affiches les données d'une requête avec datatable. J'autorise le trie sur la première et la seconde colonne uniquement. Mes données s'affichent correctement mais lorsque je trie sur la première colonne, je n'ai pas de résultat, aucune donnée dans le tableau. Cependant sur la colonne 2 ça marche sans soucis.
    Je cherche en vain sans comprendre d'où viens le problème.

    Pouvez vous m'aider s'il vous plait?

    La code fetch_test
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    include('db.php');
    include('function.php');
    $query = '';
    $output = array();
    $query .= "SELECT * FROM tbl_test ";
    if(isset($_POST["search"]["value"]))
    {
    	$query .= 'WHERE col1 LIKE "%'.$_POST["search"]["value"].'%" ';
    }
    if(isset($_POST["order"]))
    {
    	$query .= 'ORDER BY '.$_POST['order']['0']['column'].' '.$_POST['order']['0']['dir'].' ';
    }
    else
    {
    	$query .= 'ORDER BY id DESC ';
    }
    if($_POST["length"] != -1)
    {
    	$query .= 'LIMIT ' . $_POST['start'] . ', ' . $_POST['length'];
    }
    $statement = $connection->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();
    $data = array();
    $filtered_rows = $statement->rowCount();
    foreach($result as $row)
    {
    	$sub_array = array();
    	$sub_array[] = $row["col1"];
    	$sub_array[] = $row["col2"];
    	$sub_array[] = $row["col3"];
    	$data[] = $sub_array;
    }
    $output = array(
    	"draw"			=>	intval($_POST["draw"]),
    	"recordsTotal"		=> 	$filtered_rows,
    	"recordsFiltered"  	=>	get_total(),
    	"data"			=>	$data
    );
    echo json_encode($output);

    Le html du tableau :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <div class="table-responsive">
    	<table id="test_data" class="table table-bordered table-sm table-striped table-hover" style="width: 100%">
    		<thead>
    			<tr class="text-center">
    				<th>col1</th>
    				<th>col2</th>
    				<th>col3</th>
    			</tr>
    		</thead>
    	</table>
    </div>


    Le script au besoin :

    Code script : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    var dataTable = $('#test_data').DataTable({
    	"processing":true,
    	"serverSide":true,
    	"order":[],
    	"ajax":{
    		url:"fetch_test.php",
    		type:"POST"
    	},
    	"columnDefs":[
    		{
    			"targets":[2],
    			"orderable":false,
    		},
    		{
    			"targets":[0, 1, 2],
    			"className":"text-center",
    		},
    	],
    });

    Merci d'avance

    Salutation

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Bonjour
    Je ne vois pas de pb.
    Si la condition
    WHERE col1 LIKE "%'.$_POST["search"]["value"].'%"
    sql va t'afficher les enreg. qui correspondent dans la col1
    Et idem pour le col2 à condition que value se trouve dans la col1 ou col2 (à faire dans 2 requêtes différentes)

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 20
    Par défaut
    Bonjour resus
    Mon problème ne vient pas du filtre mais plutôt des tries. Le trie marche sur toutes les colonnes sauf la première colonne. Quand je trie sur la première colonne, mon tableau n'affiche rien.

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    Bonsoir,
    C'est normal parce que tu ne peux pas mettre order by 0, et si tu as une colonne avant "col1" eh ben sache que ton trie n'est pas correcte, parce que 1 vaut à la première colonne et 2 au deuxième...

    Pour résoudre ce problème, gères l'ordre avec les noms de colonnes :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if(isset($_POST["order"]))
    {
    	$order=$_POST['order'];
    	$column=$order[0]['column'];
    	$dir=$order[0]['dir'];
     
    	if($column==0||$column==1){
    		$ord=($column==0?'col1':'col2')." ".$dir." ";
    	}
     
    	$query .= 'ORDER BY '.$ord;
    }

    Après je pense que tu as inversé le code dans recordsTotal et recordsFiltered, vu que la fonction get_total() qui récupère le nombre total d'enregistrements :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "recordsTotal"		=> 	get_total(),//ici et pas après
    "recordsFiltered"  	=>	$filtered_rows

    Et n'oublis pas aussi que tu prépares mal ta requête, ça risque d'injections sql...

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 20
    Par défaut
    Bonjour
    Je vous remercie pour la solution, ça fonctionne.
    Pour la préparation de la réquête, j'aimerai bien l'améliorer mais je ne sais pas trop comment le faire sur une requête avec des arguments dynamiques comme ici. J'ai d'autre requêtes dont le nombre d'argument varie en fonction de selection et ça m'aiderai. Pouvez vous me montrer comment le faire s'il vous plais?
    Je vous remercie

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    Bonjour,

    Avant de passer à ta question, il faut corriger ton script, parce qu'avec le code actuel la pagination n'est pas correcte, tu n'obtiendra qu'une seule page parce que tu as ajouté la clause limit dans la requête des lignes filtrés, ce qu'il ne faut pas.

    Il y'a 3 requêtes qui doivent s'exécuter :
    • la première qui sélectionne le nombre total des enregistrements avec count(*) et SANS les clauses where et limit.
    • la deuxième qui sélectionne le nombre des enregistrements filtrés sans limit et toujours avec count(*) et where en fonction de $_POST['search']['value'] ou d'autres variables...
    • la troisième est la requête principale qui récupère les enregistrements avec les clauses where et limit.


    Et pour ta question, la préparation d'une requête est simple lorsqu'il s'agit seulement des variables simples, mais pas le cas avec les noms de colonnes ou de tables dans les clauses select, where,order by, group by et limit.

    En gros ton script doit être comme ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    <?php 
    include('db.php');
    include('function.php');
    $query = "SELECT * FROM tbl_test WHERE col1 LIKE :search ";//note bien les deux points : avant search dans la requête principale";
    $queryFiltered='select count(*) from tbl_test where col1 like :search ';//faire la même chose pour la requête des enreg filtrés mais seulement avec count()
    $exec=[];//on crée un tableau qu'on passera dans execute()
    $start=intval($_POST['start']);
    $length=intval($_POST['length']);
    $exec[':search']='%'.$_POST["search"]["value"].'%';//on remplit l'index ":search" dans le tableau $exec
     
    //$_POST['search'] est toujours disponible, pas la peine de faire une condition if(isset($_POST['search']['value'])) ici 
     
    if(isset($_POST["order"]))//pour éviter cette condition comme $_POST['search'], remplace l'option order d'ajax par order:[0,"asc"], et pas seulement un tableau vide. 
    {
    	$order=$_POST['order'];
    	$column=$order[0]['column'];
    	$dir=$order[0]['dir'];
    	if($column==0||$column==1){
    		//on ne peut pas utiliser $exec ici, car ça donnera order by 'col1/col2' 'desc/asc' avec les quottes ce qui est faux.
    		$query .='ORDER BY '.($column==0?'`col1`':'`col2`')." ".$dir;
    	}
     
    }
    else
    {
    	$query .= 'ORDER BY id DESC ';
    }
    $filteredStmt=$connection->prepare($queryFiltered);
    $filteredStmt->execute($exec);//passer le tableau $exec en paramètre et Exécuter la requête de filtrage
    $filteredRows=$filteredStmt->fetchColumn();//récupérer seulement le nombre des enregistrements filtrés.
     
    if(is_numeric($start) && is_numeric($length)){//si start et length sont numériques 
    	if($start != -1 && $length != -1)
    	{
    		$query .= ' LIMIT :start , :length ';
    		//on remplit les index ":start" et ":length" dans $exec, mais cela ne fonctionnera pas si l'option ATTR_EMULATE_PREPARES du PDO n'est pas false.
    		$exec[':start']=$start;
    		$exec[':length']=$length;
    	}
    }
    else{
    	exit();//quitte le script
    }
     
     
    $statement = $connection->prepare($query);
    $statement->execute($exec);//passer le tableau $exec en paramètre et exécuter la requête principale
    $result = $statement->fetchAll();
    $data = array();
    foreach($result as $row)
    {
    	$sub_array = array();
    	$sub_array[] = $row["col1"];
    	$sub_array[] = $row["col2"];
    	$sub_array[] = $row["col3"];
    	$data[] = $sub_array;
    }
    $output = array(
    	"draw"			=>	intval($_POST["draw"]),
    	"recordsTotal"		=> 	get_total(),
    	"recordsFiltered"  	=>	$filteredRows,
    	"data"			=>	$data
    );
    echo json_encode($output);

    N'oublis surtout pas d'ajouter l'option PDO::ATTR_EMULATE_PREPARES de PDO et la mettre à false :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $connection = new PDO('mysql:host=localhost;dbname=....', '....', '....',[
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ,PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
        ,PDO::ATTR_EMULATE_PREPARES => false//celle-ci
      ]);

    Et comme je l'ai mentionné dans le code, si tu veux éviter la condition if(isset($_POST["order"])) il faut mettre les bonnes valeurs dans l'option order et pas seulement un tableau vide.

    Et vu que tu cherches à mettre la colonne 0 comme colonne de trie par défaut au premier chargement de la page, tu peux même supprimer l'option order, parce que le plugin DataTable s'il ne trouve pas l'option order, il récupère la première colonne et la met comme colonne de trie par défaut. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var dataTable = $('#test_data').DataTable({
    	"processing":true,
    	"serverSide":true,
    	"order":[0,"asc"],//mettre la colonne 0 "col1" comme colonne de trie par défaut, ou bien supprime l'option et laisse le plugin s'en charger...
            ....
         })

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Autocomplete avec resultat sur plusieurs colonnes
    Par Slayes dans le forum jQuery
    Réponses: 0
    Dernier message: 21/07/2013, 10h47
  2. [MySQL] Affichages des resultat sur X colonnes
    Par l_nico dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/03/2010, 12h43
  3. Réponses: 3
    Dernier message: 16/04/2009, 22h17
  4. Font qui ne se répète pas en vertical sur des colonnes
    Par GregBond007 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/10/2007, 18h52
  5. doublon et trie sur autre colonne
    Par Force59 dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/04/2004, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo