web-dev-qa-db-fra.com

Comment imprimer une instruction SQL dans un modèle codeigniter

J'ai une déclaration 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 php peut-il imprimer la déclaration SQL exacte envoyée à ma base de données? Et afficher que sur ma vue php, page

89
Technupe

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 de profileur affiche les résultats du test de performance, les requêtes que vous avez exécutées et les données $ _POST au bas de vos pages .

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

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

84
Novo

Vous pouvez utiliser ceci:

$this->db->last_query();

"Retourne la dernière requête exécutée (la chaîne de requête, pas le résultat)."

Reff: https://www.codeigniter.com/userguide3/database/helpers.html

224
chhameed

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

Avant que la requête ne s'exécute:

$this->db->_compile_select(); 

Et après avoir couru:

$this->db->last_query(); 
37
pedro

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;
16
Programmer

Après avoir essayé sans succès d'utiliser _compiled_select() ou get_compiled_select(), je viens d'imprimer l'objet db et vous pouvez voir la requête dans la propriété queries.

Essayez 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];
12

Vous pouvez simplement l'utiliser à la fin.

echo $this->db->last_query();
9
Muhammad Sadiq

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

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

last_query() et get_compiled_select() ne fonctionnent pas pour moi, donc un léger changement du code de pedro me convient parfaitement. N'incluez pas ->get() dans votre construction, cela doit être avant le -> get ()

 echo $this->EE->db->_compile_select();
2
Laurence Cope

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

Exemple:

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

// Ajoute cette ligne.

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

sortie();  

ou

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

1
1247p

J'essaie de répondre @ la réponse de Chumillas et la réponse de @ chhameed, mais cela ne fonctionne pas, car le sql est faux.Alors j'ai trouvé une nouvelle approche, comme ceci:  

  • Insérer echo $sql; flush(); exit; dans avant return $sql;_compile_select fonction de DB_active_rec.php
1
Chanble

J'ai eu exactement le même problème et j'ai finalement trouvé la solution. Ma requête est la suivante:

$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 je devais faire était de créer une variable ($ resultstring) avec exactement le même contenu que ma requête, puis de l'exécuter comme ceci: <?php echo $resultstring = 'SELECT * FROM clients WHERE ' . $sql_where . ' AND ' . $sql_where2 . ' ORDER BY acconame ASC '; ?>

Ça marche!

0
Mark Janssen

Vous avez plusieurs façons d’obtenir du SQL dans les requêtes.

Après exécution de la requête

Vous devriez utiliser ce qui suit: 

$sql = $this->db->last_query(); 

Avant l'exécution de la requête (méthodes d'instruction SQL spécifiques)

CodeIgnitier ne fournit pas de méthode généraliste pour obtenir le code SQL avant l'exécution, vous devez utiliser une méthode spécifique.

Obtenir une requête SELECT

$sql = $this->db->get_compiled_select()

Obtenir une requête INSERT

$sql = $this->db->get_compiled_insert()

Obtenir une requête UPDATE

$sql = $this->db->get_compiled_update()

Obtenir une requête DELETE

$sql = $this->db->get_compiled_delete()
0
jedema