Comment imprimer une instruction SQL dans le modèle Codeigniter


107

J'ai une instruction SQL dans mon modèle,

Je dis alors

$query = $this->db->query($sql, array(fields, fields1);

if ($query) {
    return true:
} else {
    echo "failed";
    return false;
}

Ma requête échoue toujours, comment puis-je obtenir php pour imprimer l'instruction SQL exacte envoyée à ma base de données? Et affichez-le sur ma page php, page

Réponses:


124

Pour afficher la chaîne de requête:

print_r($this->db->last_query());    

Pour afficher le résultat de la requête:

print_r($query);

La classe Profiler affichera les résultats du benchmark, les requêtes que vous avez exécutées et les données $ _POST au bas de vos pages. Pour activer le profileur, placez la ligne suivante n'importe où dans vos méthodes Controller:

$this->output->enable_profiler(TRUE);

Guide de l'utilisateur de profilage: https://www.codeigniter.com/user_guide/general/profiling.html


7
quand je fais print_r ($ query); rien ne s'imprime du tout
Technupe

1
Utilisez le profileur intégré CI, plus d'infos ici
Novo

2
tout ce que je veux faire est d'imprimer l'instruction SQL telle que transmise à la base de données, mais le profileur n'aide pas beaucoup non plus
Technupe

Visitez le lien du guide de l'utilisateur que j'ai publié, si cela ne fonctionne pas, dites-nous ce qui se passe à la place.
Novo

Eh bien, j'ai compris mon problème, oracle n'accepte pas mon format de date, j'ai essayé tous les formats que je pense, il n'acceptera que SYSDATE
Technupe


41

Vous pouvez afficher le SQL généré par ActiveRecord:

Avant l'exécution de la requête:

$this->db->_compile_select(); 

Et après son exécution:

$this->db->last_query(); 

4
quand j'utilise $ this-> db -> _ compile_select (); J'obtiens une erreur fatale: Appel à la méthode protégée CI_DB_active_record :: _ compile_select () de
Angelin Nadar

Le truc du profileur n'est pas bon pour moi, n'affiche pas la requête que je veux, c'est trop compliqué d'obtenir juste le SQL ... Cela fonctionne pour moi: - echo $ this-> EE-> db -> _ compile_select ();
Laurence Cope

3
Dans CI3, utilisez à la $this->db->get_compiled_select()place.
Nick Tsai

17

si vous avez besoin d'un test rapide sur votre requête, cela fonctionne très bien pour moi

echo $this->db->last_query(); die;

14

Après avoir essayé sans succès d'utiliser _compiled_select()ou get_compiled_select()j'ai simplement imprimé l' dbobjet, et vous pouvez voir la requête dans la queriespropriété.

Essayez-le vous-même:

var_dump( $this->db );

Si vous savez que vous n'avez qu'une seule requête, vous pouvez l'imprimer directement:

echo $this->db->queries[0];

9

Il existe une nouvelle méthode publique get_compiled_selectqui peut imprimer la requête avant de l'exécuter. _compile_selectest maintenant protégé et ne peut donc pas être utilisé.

echo $this->db->get_compiled_select(); // before $this->db->get();

4
Erreur fatale: appel à la méthode non définie CI_DB_mysql_driver :: get_compiled_select ()
itskawsar


2

Ni l'un last_query()ni l' autre ou ne get_compiled_select()fonctionne pour moi, donc un léger changement de code de pedro fonctionne très bien pour moi. N'incluez pas ->get()dans votre build, cela doit être avant le -> get ()

 echo $this->EE->db->_compile_select();

1

J'essaye de répondre à la réponse de @ Chumillas et de @ chhameed, mais cela ne fonctionne pas, car le sql est faux. J'ai donc trouvé une nouvelle approche, comme celle-ci:

  • Insérer echo $sql; flush(); exit;dans la return $sql; _compile_selectfonction avant deDB_active_rec.php

0

Ajoutez cette ligne juste après la requête que vous souhaitez imprimer.

Exemple:

$ query = $ this-> db-> query ('SELECT * FROM table WHERE condition');

// Ajoutez cette ligne.

var_dump ($ this-> db-> last_query ());

sortie();

ou

echo $ this-> db-> last_query ();


0

J'utilise xdebug pour regarder ces valeurs dans VSCode avec l'extension respective et CI v2.x. J'ajoute l'expression $this->db->last_query()dans la section watch, et j'ajoute un xdebugSettingsnœud comme ces lignes pour obtenir une valeur non tronquée dans le launch.json.

{
  "name": "Launch currently open script",
  "type": "php",
  "request": "launch",
  "program": "${file}",
  "cwd": "${fileDirname}",
  "port": 9000,
  "xdebugSettings": {
    "max_data": -1,
    "max_children": -1
  }
},

Et exécutez mon débogueur avec le point d'arrêt et enfin sélectionnez simplement mon expression et faites un clic droit> copier la valeur.


-1

J'ai eu exactement le même problème et j'ai finalement trouvé la solution. Ma requête s'exécute comme:

$result = mysqli_query($link,'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC ');

Pour afficher la commande sql, tout ce que j'avais à faire était de créer une variable ($ resultstring) avec exactement le même contenu que ma requête, puis de la faire écho, comme ceci:<?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Ça marche!


Ce n'est pas la manière CodeIgniter.
mickmackusa le

-1

utiliser get_compiled_select()pour récupérer la requête au lieu de la remplacer


Je suggère de montrer comment utiliser la fonction que vous proposez dans ce cas particulier, pas seulement de la mentionner. Meilleures salutations
YakovL

-2

J'ai lu toutes les réponses ici, mais je ne peux pas obtenir

echo $this->db->get_compiled_select();

pour travailler, cela m'a donné une erreur comme,

Appel à la méthode protégée CI_DB_active_record :: _ compile_select () à partir du contexte 'Welcome'in controllers on line xx

J'ai donc supprimé protectedde la ligne ci-dessous du fichier \system\database\DB_active_rec.phpet cela a fonctionné

protected function _compile_select($select_override = FALSE)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.