2 votes

CodeIgniter contexte num_rows et affected_rows

C'est peut-être une question un peu stupide, mais je ne comprends pas :

J'ai ces 2 fonctions dans mon modèle

public function count()
{
    return $this->db->num_rows();
}

public function changes()
{
    return $this->db->affected_rows();
}

Quand j'appelle changes(); dans mon contrôleur, il affiche les lignes affectées pour la dernière requête (mise à jour). Lorsque j'utilise count(); Cependant, pour afficher les lignes de la dernière requête (select), j'obtiens une erreur .

Le code dans le contrôleur est comme ceci :

if (!$this->synchronization_model->get_contact_knowledge($contact['account_id'], SERVER_LOCATION_ID)) {
                        throw new Exception("Failed to update knowledge");
                    }

                    if( $this->synchronization_model->count() == 0) {
                        $this->synchronization_model->insert_knowledge($contact['account_id'], $contact_server_time);
                    }

Y a-t-il un moyen de corriger ou de contourner ce problème ?

1voto

raidenace Points 8126

num_rows() n'est pas une méthode de la db la classe. Elle doit être appelée contre la classe resultset objet.

$query = $this->db->query('SELECT * FROM my_table');
echo $query->num_rows();

Comme vous le voyez ici, nous n'appelons pas $this->db->num_rows() au lieu de cela, nous appelons $query->num_rows();

Pour contourner ce problème, vous pouvez passer l'objet de requête à la fonction count() de la manière suivante :

public function count($query)
{
    return $query->num_rows();
}

UPDATE :

Sur la base de votre code mis à jour, je suggère ce qui suit :

Je suppose que la requête est exécutée dans synchronization_model . Dans ce cas, ce que vous devez faire est. Avoir une variable dans synchronization_model dites row_count . Et mettre la valeur de ce que num_rows() dans cette variable. Le dans le count() renvoie simplement cette variable. Ce sera donc quelque chose comme :

À l'intérieur de synchronization_model :

......
$query = $this->db->query('SELECT * FROM my_table');
$this->row_count = $query->num_rows();
......    
public function count()
{
    return $this->row_count;
}
......

1voto

edwardmp Points 1962

Voici comment je l'ai réparé correctement.

Au lieu de cette fonction :

public function check_account_already_exists($email_address)
{
    if ($query = $this->db->query('SELECT * FROM account WHERE email_address = ?', array($email_address)))
    {
        return true;
    }
}

J'ai cette fonction :

public function check_account_already_exists($email_address)
{
    if ($query = $this->db->query('SELECT * FROM account WHERE email_address = ?', array($email_address)))
    {
        return $query;
    }
}

Donc quand je l'appelle dans mon contrôleur :

 // Check whether the e-mail address has not already been taken
        if (!($count = $this->account_model->check_account_already_exists($email_address))) {
          throw new Exception("Failed to fetch account");
        }

       $this->account_model->count($count);

Je peux l'utiliser comme ça De cette façon, l'instruction if au-dessus fonctionnera toujours de la même manière.

0voto

tomexsans Points 3497
$this->db->num_rows();

renvoie le nombre de lignes que le résultat a récupéré lors de la sélection, vous devrez l'utiliser en tant que

   $query = $this->db->get('table');

             OR           

   $query = $this->db->query('select * from table');
   $query->num_rows();

return $this->db->affected_rows();

renvoie les lignes affectées lorsque vous mettez à jour, supprimez ou insérez des données.

et où se trouve le code correspondant pour que nous puissions le voir.

0voto

keithhatfield Points 3263

Dans CodeIgniter, le num_rows() est une méthode de l'objet requête, et non de l'objet base de données ... voir http://ellislab.com/codeigniter/user-guide/database/results.html

Par exemple, vous utiliserez num_rows() de la manière suivante :

$query = $this->db->query("SELECT * FROM some_table WHERE some_col = 'blah'");

if($query->num_rows()){
    //yay, data!
} else {
    //no data for you
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X