it-swarm-eu.dev

Modi corretti per verificare che la query di aggiornamento abbia esito positivo in determinate condizioni

Stavo cercando di scoprire modi corretti per verificare che la query di aggiornamento del db abbia esito positivo, ma sto riscontrando alcuni problemi. Anche se la query di aggiornamento ($db->execute()) non viene eseguita/la riga non esiste .... ma restituisce true, il che significa che ha avuto esito positivo, che è errato. Il metodo $db->getaffectedrows() ha risultati incompleti (solo o e 1). Ho trovato un modo durante il debug del codice joomla è che esiste una proprietà info nell'oggetto connessione nell'oggetto database ($db = jfactory:getdbo()), questa proprietà dice se una riga corrisponde (riga dati trovata nella tabella) dalla query di aggiornamento e se una riga è stata modificata (aggiornata con un nuovo valore) o meno. Quindi ci sono modi/domande migliori per scoprire se l'aggiornamento ha avuto davvero successo considerando tutte le condizioni in cui sono state trovate righe, righe trovate ma nessun valore di colonna modificato e riga trovata e valore di colonna modificati .... in joomla cms framework?

2
dev-m

Ecco una struttura di base per isolare ogni risultato.

$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
}

Sopra non utilizza chiamate $db->qn() o $db->q() perché il nome della tabella e le colonne sono parole singole e non parole "riservato" della parola chiave mysql E il valore $id È un numero intero che può essere hardcast con (int) per motivi di sicurezza.

Ciò presuppone che non si desideri eseguire un INSERT quando la riga non esiste e verificare tali risultati.

2
mickmackusa