web-dev-qa-db-fra.com

Méthodes correctes pour vérifier que la requête de mise à jour a réussi dans certaines conditions

J'essayais de trouver des moyens corrects pour vérifier que la requête de mise à jour de base de données réussissait, mais quelques problèmes que je récupérais. Même si la requête de mise à jour ($db->execute()) n'est pas terminée/la ligne n'existe pas .... mais renvoie la valeur true, ce qui signifie qu'elle a réussi, ce qui est incorrect. La méthode $db->getaffectedrows() a des résultats incomplets (uniquement o et 1). J'ai trouvé un moyen de déboguer le code joomla, c'est qu'il existe une propriété info dans un objet de connexion dans un objet de base de données ($db = jfactory:getdbo()), cette propriété indique si une ligne correspond à (la ligne de données trouvée dans la table) par la requête de mise à jour. et si une ligne a été modifiée (mise à jour avec la nouvelle valeur) ou non. Donc, y a-t-il de meilleurs moyens/requêtes pour savoir si la mise à jour a bien été effectuée compte tenu de toutes les conditions dans lesquelles des lignes ont été trouvées, mais aucune valeur de colonne n'a été modifiée, et la valeur de la ligne trouvée et de la colonne a changé ... sous le framework joomla cms?

2
dev-m

Voici une structure de base pour isoler chaque résultat.

$id = 2286;    // you can jinput this or whatever
$found = 0;    // establish default value
$affrows = 0;  // establish default value
$db = JFactory::getDBO();
try {
    $select_query = $db->getQuery(true)
                       ->select("COUNT(*)")
                       ->from("#__users")
                       ->where("id = " . (int)$id);
    $db->setQuery($select_query);
    if ($found = $db->loadResult()) { // if a positive count
        $update_query = $db->getQuery(true)
                           ->update("#__users")
                           ->set("block = 1")
                           ->where("id = " . (int)$id);
        $db->setQuery($update_query);
        $db->execute();
        if ($affrows = $db->getAffectedRows()) {  // if a positive count
            JFactory::getApplication()->enqueueMessage("Update Successful: Found: $found; Updated: $affrows");
        } else {
            JFactory::getApplication()->enqueueMessage("Fruitless Update (No Changes): Found: $found; Updated: $affrows", "notice");
        }
    } else {
        JFactory::getApplication()->enqueueMessage("Update Ignored - No Qualifying Rows: Found: $found; Updated: $affrows", "notice");
    }
} catch (Exception $e) {
    JFactory::getApplication()->enqueueMessage('Query Syntax Error (Select or Update Failed): Found: $found; Updated: $affrow', 'error');
    // $query->dump() . "<br>" . $e->getMessage()  // <-- not to be displayed publicly
}

Ce qui précède n’utilise pas d’appel $db->qn() ni $db->q(), car le nom de la table et les colonnes sont des mots uniques et non des mots-clés mysql "réservés" ET la valeur $id Est un entier pouvant être hardcast avec (int) pour des raisons de sécurité.

Cela suppose que vous ne souhaitiez pas effectuez une INSERT lorsque la ligne n'existe pas et vérifiez ces résultats.

2
mickmackusa