Un peu d’arrière-plan : j’essaie de déboguer un composant (JoomShopping) qui ne fonctionne pas correctement après la migration de la version 2.5 à la version 3.7 (j’ai suivi les instructions ne rencontrez aucun problème pendant le processus de mise à niveau, mais lorsque je vais à une certaine page, il y a une erreur de base de données 1054)
Question: Dans mes expériences passées, je peux mettre var_dump n'importe où pour voir la valeur d'une variable. Mais cette fois, il ne sort rien. Par exemple, j'essaye de déboguer le troisième élément de l'image ci-dessus (attribut.php):
class JshoppingModelAttribut extends JshoppingModelBaseadmin{
protected $tableFieldOrdering = 'attr_ordering';
public function getNameAttribut($attr_id) {
$db = JFactory::getDBO();
$lang = JSFactory::getLang();
$query = "SELECT `".$lang->get("name")."` as name FROM `#__jshopping_attr` WHERE attr_id = '".$db->escape($attr_id)."'";
$db->setQuery($query);
return $db->loadResult();
}
public function getAllAttributes($result = 0, $categorys = null, $order = null, $orderDir = null){
$lang = JSFactory::getLang();
$db = JFactory::getDBO();
$ordering = "A.attr_ordering asc";
if ($order && $orderDir){
$ordering = $order." ".$orderDir;
}
$query = "SELECT A.attr_id, A.`".$lang->get("name")."` as name, A.attr_type, A.attr_ordering, A.independent, A.allcats, A.cats, G.`".$lang->get("name")."` as groupname
FROM `#__jshopping_attr` as A left join `#__jshopping_attr_groups` as G on A.`group`=G.id
ORDER BY ".$ordering;
extract(js_add_trigger(get_defined_vars(), "before"));
$db->setQuery($query);
var_dump($db); //debug
$list = $db->loadObjectList();
.......
Var_dump ne génère rien. Pourquoi est-ce?
Aussi, je veux demander pourquoi cette erreur 1054 n'est pas enregistrée dans error_log de PHP? Plus important encore, comment puis-je déboguer efficacement ce composant? (Je poste une question dans le forum du composant, mais je doute que j'aurais beaucoup d'aide par là)
Parfois, des actions ultérieures suppriment le focus sans afficher l'instruction var_dump. Il existe deux manières pour afficher les informations de débogage dans ces conditions. Tout d'abord, vous pouvez suivre votre instruction var_dump avec une instruction exit (). Incluez une chaîne si vous avez besoin de savoir quelle instruction de sortie a été utilisée (par exemple: exit ('here'). L'autre option consiste à afficher la variable dans un message Joomla à la place:
JFactory::getApplication()->enqueueMessage(JText::_('SOME_ERROR_OCCURRED'), 'error');
Entre ces deux solutions (et var_dump et echo), vous pouvez toujours obtenir les informations de débogage dont vous avez besoin.
Avez-vous essayé de faire écho à quelque chose à la place du var_dump
? Par exemple, vous pouvez avoir quelque chose comme echo('here');
ou die('here');
.
Je pense que le problème probable est que votre code n'atteint même pas la ligne var_dump
, Et c'est pourquoi il n'imprime pas la variable.
comment puis-je déboguer efficacement ce composant?
Utilisez les blocs try{}catch{}
Et incluez $e->getMessage()
, dump()
et les contrôles d'ensemble de résultats. L'utilisation de méthodes de requête Joomla est également une bonne idée.
public function getNameAttribut($attr_id) {
$db = JFactory::getDBO();
$lang = JSFactory::getLang();
try {
$query = $db->getQuery(true)
->select($db->qn($lang->get("name")) . " AS name")
->from($db->qn("#__jshopping_attr"))
->where("attr_id = " . (int)$attr_id); // assuming attr_id is an integer
echo $query->dump(); // never show query to the public
$db->setQuery($query);
if (($result = $db->loadResult()) === null) {
echo "Null Resultset - Possible Query Logic Error @ getNameAttribut()";
}
return $result;
} catch (Exception $e) {
echo "Syntax Error", $e->getMessage(); // never show error messages to the public
return false;
}
}
et
public function getAllAttributes($result = 0, $categorys = null, $order = null, $orderDir = null) {
if (!$order) {
$order = 'a.attr_ordering';
}
if ($orderDir != 'DESC') {
$orderDir = 'ASC';
}
$lang = JSFactory::getLang();
$db = JFactory::getDBO();
try {
$query = $db->getQuery(true)
->select(
array(
"a.attr_id",
"a." . $db->qn($lang->get("name")) . " AS name",
"a.attr_type",
"a.attr_ordering",
"a.independent",
"a.allcats",
"a.cats",
"G." . $db->qn($lang->get("name")) . " AS groupname"
)
)
->from($db->qn("#__jshopping_attr", "a"))
->leftJoin($db->qn("#__jshopping_attr_groups") . " G ON " . $db->qn("a.group") . " = G.id")
->order($db->qn($order) . " " . $orderDir);
//extract(js_add_trigger(get_defined_vars(), "before"));
echo $query->dump(); // never show query to the public
$db->setQuery($query);
if (!$result = $db->loadObjectList()) {
echo "Null Resultset - Possible Query Logic Error @ getAllAttributes()";
}
return $result;
} catch (Exception $e) {
echo "Syntax Error", $e->getMessage(); // never show error messages to the public
return false;
}
}
Je n'approuve pas l'utilisation de extract()
. Je n'ai jamais eu une bonne raison de l'utiliser dans aucun de mes projets. Son appel comporte le risque de pouvoir écraser les variables globales ET cela inondera généralement le pool de variables globales. Je ne sais pas ce que cela signifie dans ce code, mais je vous exhorte à trouver un autre moyen.
Je n'ai pas testé les blocs de code ci-dessus, donc si quelqu'un découvre une faute de frappe, faites-le moi savoir et je le corrigerai.
p.s. Il semble que votre valeur $lang
Ne soit pas rendue, car la colonne non trouvée s'appelle name_en-GB
. Je pense que la première chose à explorer est la valeur $lang
.