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

Technupe
la source

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

Novo
la source
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(); 
pedro
la source
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;
Programmeur
la source
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];
Christian Dechery
la source
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();
Naveed
la source
4
Erreur fatale: appel à la méthode non définie CI_DB_mysql_driver :: get_compiled_select ()
itskawsar
9

Vous pouvez simplement l'utiliser à la fin.

echo $this->db->last_query();
Muhammad Sadiq
la source
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();
Laurence faire face
la source
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
Chanble
la source
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 ();

GN
la source
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.

uescamilla
la source
-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!

Mark Janssen
la source
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

user2049634
la source
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)
viral
la source