web-dev-qa-db-fra.com

La requête de mise à jour MySQL ne fonctionne pas

Cette requête de mise à jour ne fonctionne pas et j'ai vérifié trois fois la syntaxe générale des requêtes de mise à jour dans Joomla via la documentation. Voici le code du côté du contrôleur:

public function approveAll() {
        $input = JFactory::getApplication()->input;
        $selectedEntries = $input->post->get('id', array(), 'array');

        JArrayHelper::toInteger($selectedEntries);

        $model = $this->getModel();
        $model->approveSelectedEntries($selectedEntries);
        $model->sendMeAnEmail('This is so broken');

        $this->setRedirect(JRoute::_('index.php?option=com_awardadmin', false));
    }

et voici le code du côté modèle:

public function approveSelectedEntries($idsToApprove)
    {
        $db = JFactory::getDBO();

        foreach ($idsToApprove as $currentID) {
            $query = $db->getQuery(true);

            $query->update('#__chronoforms_data_nominationForm');
            $query->set('approved = 1');
            //$query->set('approved = true');
            $query->where('id = '.$currentID);
            $db->setQuery($query);
            //$db->loadRow();
            $result = $db->execute();

            $this->sendNotificationEmail($currentID);
            sendMeAnEmail('IDs: '.$idsToApprove.'<br>ID: '.$currentID.'<br>Query: '.$query.'<br>DB: '.$db);
        }
    }

Mon expérience avec Joomla est limitée, mais aucune de mes méthodes sendMeAnEmail ne se déclenche, alors quelque chose se perd quelque part et je ne sais pas assez comment Joomla fonctionne pour le comprendre. Je ne connais que très bien la façon dont cela s’applique à MVC.

Toute aide serait appréciée.

Le remplacement pour getModel ():

public function getModel($name = 'Submission', $prefix = 'AwardAdminModel') 
    {
        $model = parent::getModel($name, $prefix, array('ignore_request' => true));
        return $model;
    }

J'ai essayé de changer la structure de la requête selon ce lien en:

 $fields = $db->quoteName('approved').' = true';
    $conditions = $db->quoteName('id').' = 443';
$query->update($db->quoteName('#__chronoforms_data_nominationForm'))->set($fields)->where($conditions);
    $db->setQuery($query);
    $db->query();

Mais cela n'a pas fonctionné ... même avec la clause hardcoded where.

1
Chase

Comme écrit dans les commentaires, il s'agissait d'un problème de noms de variables d'entrée incorrects. Lors du développement de formulaires, il est toujours judicieux de vérifier que les variables et les valeurs sont correctement récupérées côté serveur.

J'ai pu résoudre ce problème en examinant le source dans Chrome et en découvrant que les identifiants sélectionnés via la case à cocher se trouvaient dans un tableau appelé cid [], pas id []. La désignation de ce tableau n'est pas même trouvé dans ce composant particulier, ce qui est étrange. Vous avez raison de dire qu'il n'était pas lié à la requête mais à l'entrée.


Essayez de remplacer $db->execute(); par $db->query(); si vous utilisez joomla 2.5.x, la méthode execute a été introduite dans joomla 3.

Le problème peut également être lié à la façon dont vous chargez le modèle dans la fonction approuverAll, essayez de remplacer $model = $this->getModel(); en ajoutant le nom de modèle associé contenant les autres fonctions: $model = $this->getModel('ModelName');

0
Kitase88