web-dev-qa-db-fra.com

Comment imprimer une requête SQL exacte dans zend framework?

J'ai le morceau de code suivant que j'ai pris du modèle,

    ...
                  $select = $this->_db->select()
                    ->from($this->_name)
                    ->where('shipping=?',$type)
                    ->where('customer_id=?',$userid);
                 echo  $select; exit; // which gives exact mysql query.
            .....

Quand j'utilise la requête de mise à jour dans zend comme, 

$up_value = array('billing'=> '0');
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']);      

Ici, je veux connaître la requête exacte mysql. Est-il possible d'imprimer la requête mysql dans zend? gentil conseil

66
mymotherland

Les objets sélectionnés ont une méthode __toString () dans Zend Framework.

Depuis le manuel de Zend Framework:

$select = $db->select()
             ->from('products');

$sql = $select->__toString();
echo "$sql\n";

// The output is the string:
//   SELECT * FROM "products"

Une autre solution consisterait à utiliser Zend_Db_Profiler .

$db->getProfiler()->setEnabled(true);

// your code
$this->update($up_value,'customer_id ='.$userid.' and address_id <> '.$data['address_Id']); 

Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQuery());
Zend_Debug::dump($db->getProfiler()->getLastQueryProfile()->getQueryParams());
$db->getProfiler()->setEnabled(false);

http://framework.zend.com/manual/en/zend.db.select.html

116
Mark Basmayor

à partir de> = 2.1.4

echo $select->getSqlString()
22
Whisher

J'ai parcouru des centaines de pages, beaucoup cherché sur Google mais je n'ai pas trouvé de solution exacte . Finalement, cela a fonctionné pour moi. Indépendamment de l'endroit où vous vous trouvez dans le contrôleur ou le modèle. Ce code a fonctionné pour moi partout. Il suffit d'utiliser cette

//Before executing your query
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$db->getProfiler()->setEnabled(true);
$profiler = $db->getProfiler();

// Execute your any of database query here like select, update, insert
//The code below must be after query execution
$query  = $profiler->getLastQueryProfile();
$params = $query->getQueryParams();
$querystr  = $query->getQuery();

foreach ($params as $par) {
    $querystr = preg_replace('/\\?/', "'" . $par . "'", $querystr, 1);
}
echo $querystr;

Finalement, cette chose a fonctionné pour moi.

14
Rajan Rawal

Vous pouvez utiliser Zend_Debug::Dump($select->assemble()); pour obtenir la requête SQL. 

Ou vous pouvez activer le profileur Zend DB FirePHP qui obtiendra toutes les requêtes dans un format ordonné dans Firebug (même les instructions UPDATE).

EDIT: Le profilage avec FirePHP fonctionne également dans F6.0 + (et non seulement dans FF3.0 comme suggéré dans le lien).

6
Christian P

Maintenant sur Zend2: 

$select->getSqlString();

Affichage du code SQL généré à partir de l'objet ZendDbSql

3
Walter Caraza

vous pouvez imprimer ..

print_r($select->assemble());
2
AvMishra
$statement = $this->sql->getSqlStringForSqlObject( HERE GOES Zend\Db\Sql\SelectSQL object );

echo "SQL statement: $statement";

Exemple:

$select = $this->sql->select();
...
$select->from(array( 'u' => 'users' ));
$select->join(...
$select->group('u.id');
...
$statement = $this->sql->getSqlStringForSqlObject($select);
echo $statement;
1
Username

encore plus court:

echo $select->__toString()."\n";

et plus plus court:

echo  $select .""; die;
0
Vladimir Ch

Celui-ci est issu de documentation Zend Framework

echo $update->getSqlString();

(Bonus) J'utilise celui-ci dans mes propres fichiers de modèle:

echo $this->tableGateway->getSql()->getSqlstringForSqlObject($select);

Bonne journée :)

0
KevDev

Utilisez ceci:-

echo $select->query();

ou

Zend_Debug::dump($select->query();
0
vascowhite

La requête renvoyée par le profileur ou l'objet de requête aura des espaces réservés si vous les utilisez.

Pour voir la requête exacte exécutée par mysql, vous pouvez utiliser le journal de requête général.

Ceci listera toutes les requêtes qui ont été exécutées depuis son activation. N'oubliez pas de désactiver ceci une fois que vous avez collecté votre échantillon. Sur un serveur actif; ce journal peut se remplir très rapidement.

Depuis un terminal mysql ou un outil de requête tel que MySQL Workbench, exécutez:

SET GLOBAL log_output = 'table';
SET GLOBAL general_log = 1;

puis lancez votre requête. Les résultats sont stockés dans la table "mysql.general_log".

SELECT * FROM mysql.general_log

Pour désactiver le journal de requête:

SET GLOBAL general_log = 0;

Pour vérifier qu'il est désactivé:

SHOW VARIABLES LIKE 'general%';

Cela m'a aidé à localiser une requête dans laquelle l'espace réservé n'était pas remplacé par zend db. Impossible de voir cela avec le profileur.

0
txyoji

Découvrez le Zend_Db_Profiler . Cela vous permet de consigner toute instruction SQL au fur et à mesure de sa préparation et de son exécution. Cela fonctionne pour les instructions UPDATE ainsi que pour les requêtes SELECT.

0
Bill Karwin

Je l'ai fait de cette façon 

$sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from('mock_paper');
        $select->columns(array(
            'is_section'
        ));
        $select->where(array('exam_id = ?' => $exam_id,'level_id = ?' => $level_id))->limit(1);



        $sqlstring = $sql->buildSqlString($select);
        echo $sqlstring;
        die();
0
Rajesh Patel