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
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);
à partir de> = 2.1.4
echo $select->getSqlString()
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.
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).
Maintenant sur Zend2:
$select->getSqlString();
vous pouvez imprimer ..
print_r($select->assemble());
$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;
encore plus court:
echo $select->__toString()."\n";
et plus plus court:
echo $select .""; die;
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 :)
Utilisez ceci:-
echo $select->query();
ou
Zend_Debug::dump($select->query();
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.
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.
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();