2

これは少しばかげた質問かもしれませんが、私はこれを理解していません:

モデルにこれらの2つの関数があります

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

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

コントローラを呼び出すchanges();と、最後の(更新)クエリの影響を受けた行が表示されます。count();ただし、最後の(選択)クエリの行を表示するために使用すると、エラーが発生します。

コントローラのコードは次のようになります。

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);
                    }

これを修正または回避する方法はありますか?

4

4 に答える 4

1

これが私がこれを適切に修正した方法です。

この関数の代わりに:

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

私はこの機能を持っています:

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

したがって、コントローラーで呼び出すと、次のようになります。

 // 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);

私はそれをそのように使うことができます..このように、それの上のifステートメントはまだ同じように機能します。

于 2013-01-25T16:28:53.463 に答える
1

num_rows()dbクラスのメソッドではありません。オブジェクトに対して呼び出す必要がありresultsetます。

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

あなたがここで見るように、私たちは電話をしていません$this->db->num_rows()代わりに私たちは電話をしています$query->num_rows();

回避策として、次のcount()ようにクエリオブジェクトをメソッドに渡すことができます。

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

アップデート:

更新されたコードに基づいて、次のことをお勧めします。

クエリはで実行されると思いますsynchronization_model。その場合、あなたがすべきことはです。たとえば、変数がありsynchronization_modelますrow_count。そして、num_rows()この変数に返すものの値を入れます。は、count() この変数を返すだけです。したがって、次のようになります。

内部synchronization_model

......
$query = $this->db->query('SELECT * FROM my_table');
$this->row_count = $query->num_rows();
......    
public function count()
{
    return $this->row_count;
}
......
于 2013-01-25T15:30:40.770 に答える
0
$this->db->num_rows();

は、選択時に結果がフェッチしたn個の行を返します。これは、次のように使用する必要があります。

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

             OR           

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

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

更新、削除、または挿入時に影響を受ける行を返します

そして、私たちがそれを見ることができるように、関連するコードはどこにありますか。

于 2013-01-25T15:23:00.200 に答える
0

CodeIgniterでは、num_rows()関数はデータベースオブジェクトではなく、クエリオブジェクトのメソッドです... http://ellislab.com/codeigniter/user-guide/database/results.htmlを参照してください

たとえばnum_rows()、次のように使用します。

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

if($query->num_rows()){
    //yay, data!
} else {
    //no data for you
}
于 2013-01-25T15:23:48.433 に答える