Requête exécutée seulement si je place die() dans le code

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Requête exécutée seulement si je place die() dans le code

    Bonjour tout le monde,

    Sur un composant que je développe, une requête est exécutée seulement si je place la fonction die juste après.
    Le problème se fait en backoffice, tout marche bien en front.

    Cette requête sert, lors de l'enregistrement, à pouvoir modifier l'ordre des images.
    J'enregistre le nom des images séparées par une virgule, dans un champ caché (ordreImg), que je récupère

    Voici mon code :
    Code:
    $ordreImg = explode(',', $array['ordreImg']);
    					
    $images = '';
    foreach ($ordreImg as $i => $img) {
    	if ($i != 0) {
    		$images .= ', ';
    	}
    	$tmp = $i + 1;
    	$images .= "image$tmp='". $img ."'";
    }
    
    $db = JFactory::getDbo();
    $query = "UPDATE #__ads_properties SET $images WHERE id=$id;";
    $db->setQuery($query);
    $db->execute();
    					
    // echo $query;
    // die;
    Lorsque je l'affiche, la requête est bonne et s'exécute :
    UPDATE #__ads_properties SET image1='3.jpg', image2='2.jpg', image3='1.jpg' WHERE id=18;

    Mais dès que je commente le die, plus rien ne se passe.
    Je précise que l'enregistrement en back ou en front utilise le même fichier, et qu'en front ça marche très bien.

    Quelqu'un aurait-il une idée d'où est-ce que ça peut coincer ?
    Dernière édition par fab06 à 21/07/2014, 16h39

  • #2
    Re : Requête exécutée seulement si je place die() dans le code

    Bonsoir,

    Il faut utiliser la méthode $db->quote() quand tu ajoute du texte, car en fonction du type de base de donnée (mysql, postgresql...) et pareil il faudrait utiliser JDatabaseQuery : http://docs.joomla.org/Selecting_data_using_JDatabase

    As-tu essayé la chose suivante :

    Code:
    $db = JFactory::getDbo();
    
    $ordreImg = explode(',', $array['ordreImg']);
    					
    $images = '';
    foreach ($ordreImg as $i => $img) {
    	if ($i != 0) {
    		$images .= ', ';
    	}
    	$tmp = $i + 1;
    	$images .= "image$tmp = $db->quote($img);
    }
    
    $query = "UPDATE {$db->quoteName('#__ads_properties')} SET {$images} WHERE id={$id};";
    $db->setQuery($query);
    $db->execute();
    ?
    Dernière édition par xillibit à 20/07/2014, 16h54
    Développeur de l'extension Kunena : https://github.com/Kunena/Kunena-Forum

    Commentaire


    • #3
      Re : Requête exécutée seulement si je place die() dans le code

      Bonjour xillibit et merci pour ton aide.
      Ton code marche bien et est plus sécurisé mais le problème persiste.

      Je me rend compte que je n'ai pas donné beaucoup d'explications...

      J'ai donc développé un composant d'annonces de propriétés.
      En base de données, il y a une table #__ads_properties pour stocker les propriétés entrées.
      Il y a tout un tas de champs concernants les caractéristiques (surface, année de construction, lieux, vente ou location... ) et des champs pour les images.
      On peut mettre 10 photos par propriété et chaque photo est enregistrée dans un champ (image1, image2...).
      Une fois enregistrées, on peut changer l'ordre des photos avec un drag and drop et chaque fois que l'ordre est modifié, on l'enregistre dans un champ caché : <input type="hidden" value="photo2.jpg,photo3.jpg,photo1.jpg" />

      Dans le code que j'ai mis dans mon précédent message, on récupère l'ordre des images séparé par une virgule ( $ordreImg = explode(',', $array['ordreImg']) ) et on met à jour la table.
      On a donc une requête du type : UPDATE #__ads_properties SET image1='3.jpg', image2='2.jpg', image3='1.jpg' WHERE id=18;

      On peut modifier une annonce en front et en backoffice.
      J'ai commencé par le faire en front et le code marche sans problème lorsqu'un utilisateur modifie l'ordre de des images de son annonce.

      Mais au moment de l'adapter en administration, ça ne marche pas et l'ordre n'est pas modifié.

      J'ai voulu stopper l'exécution du code et afficher la requête pour voir s'il y avait une quelconque erreur.
      Ce qui m'étonnait puisque au moment de l'enregistrement, que ce soit en front ou en backoffice, c'est le même fichier qui est appelé (administrator/components/com_ads/tables/propriete.php).
      Et là, je me suis aperçu que l'ordre était bien modifié !?
      Après avoir fait plusieurs essaies, je me rend compte que la requête ne s'exécute que lorsque j'affiche la requête et que je stoppe le code juste après.

      J'aimerais donc avoir une piste pour comprendre d'où peut venir le problème...

      As-tu une idée d'où est-ce que ça peut venir ?

      Commentaire


      • #4
        Re : Requête exécutée seulement si je place die() dans le code

        C'est difficile à dire d’où le problème peut venir, si cela se trouve c'est le code qui se situe après le die() qui pose problème. As-tu regardé dans les logs apache ou php si tu as une erreur correspondante au moment ou tu exécute la page ?

        Tu peux faire un try catch pour récupérer une exception en cas d'erreur sur la requête SQL comme ceci, dans ce cas là l'erreur sera enregistré dans un fichier sous /logs :

        Code PHP:
        $db JFactory::getDbo();

        $ordreImg explode(','$array['ordreImg']);
                            
        $images '';
        foreach (
        $ordreImg as $i => $img) {
            if (
        $i != 0) {
                
        $images .= ', ';
            }
            
        $tmp $i 1;
            
        $images .= "image$tmp = $db->quote($img);
        }

        $query = "UPDATE {$db->quoteName('#__ads_properties')} SET {$imagesWHERE id={$id};";
        $db->setQuery($query);

        try
        {
            
        $db->execute();
        }
        catch (Exception 
        $e)
        {
            JLog::add(
        $e->getMessage(), JLog::ERROR, 'com_mycom');
            return false;

        Développeur de l'extension Kunena : https://github.com/Kunena/Kunena-Forum

        Commentaire


        • #5
          Re : Requête exécutée seulement si je place die() dans le code

          Le try catch ne donne pas d'erreur et les logs php, apache ou mysql n'ont pas d'erreur correspondante non plus.

          Ca ne vient pas du code après le die() commenté dans le fichier puisqu'il s'agit d'un script d'upload des images, donc si je ne fait que changer l'ordre, il n'est pas sensé rentrer dedans. Je l'ai commenté pas acquis de conscience mais ça ne change rien et l'ordre n'est pas modifié.

          Ca doit effectivement venir de mon code je pense pas mais je dois avancer et puisque ça marche en front, je vais laisser ça de côté un moment :-/

          Merci pour ton aide.

          Commentaire

          Annonce

          Réduire
          Aucune annonce pour le moment.

          Partenaire de l'association

          Réduire

          Hébergeur Web PlanetHoster
          Travaille ...
          X