PHP mysql_affected_rows () ile garip davranış

4 Cevap php

Ben onların çerezlerini veya değiştirmek silmek tarayıcı durumda kullanıcılar takip etmek user_ips adında bir tablo var. Neyse, aşağıdaki kod basit. Bu kullanıcının kimliği ve IP eşit user_ips girişleri günceller. Sorgu herhangi bir satır güncelleme olmadıysa, o zaman o kullanıcı için IP tablosunda değil, bu yüzden onu ekler demektir.

$site->query('UPDATE `user_ips` SET `last_time` = UNIX_TIMESTAMP(), `user_agent` = \''.$this->user_agent.'\' WHERE `ip` = '.$this->ip.' AND `userid` = '.$this->id);
if(mysql_affected_rows() == 0)
{
    $site->query('INSERT INTO `user_ips` SET `userid` = '.$this->id.', `ip` = '.$this->ip.', `first_time` = UNIX_TIMESTAMP(), `last_time` = UNIX_TIMESTAMP(), `user_agent` = \''.$this->user_agent.'\'');
}

() Sorun bazen 0 döndüren bir kullanıcının geçerli kimlik ile satır ve IP varsa bile mysql_affected_rows olduğunu. Öyleyse kod aynı IP ile masaya başka bir satır ekler.

Eğer merak ediyorsanız, $ site benim web sitesi ve yürütür sadece sorgu için yapılan mysql sınıf sorgu tarafından kendisine iletilen bir (), ve başka bir şey değildir, bu nedenle bu sınıf ile bir sorun değildir. Oh ve IP uzun bir IP olarak saklanan, bu nedenle onu tırnak gerekmez.

4 Cevap

Ben burada doğrudan PHP belgelerine alıntı yapıyorum:

* UPDATE kullanırken yeni değer eski değeri olarak aynı olduğu, MySQL sütunları güncelleme olmaz. Bu mysql_affected_rows () aslında eşleşen satır sayısını, tam anlamıyla sorgulamadan etkilenen satırların sadece sayısına eşit olmayabilir olasılığını yaratır. *

UNIX_TIMESTAMP () (örneğin, aynı ikinci aynı istemciden gelen istekleri iki) aynı değeri döndürür Yani senin durumunda, mysql_affected_rows () 0 döndürür.

Slipbull cevabı üzerine inşa etmek, bu işlemek için basit yolu sadece bir INSERT gerekli olup olmadığını değerlendirmek için bir SELECT sorgusu gerçekleştirmek için belki de. Başka bir çözüm, geçerli bir rekor garanti olur gibi basit, kullanıcı oluşturma bir kayıt INSERT olacaktır.

Sadece kimliği ve ip hem span birincil anahtar ayarlayabilirsiniz. Bu yinelenen girdileri almak sağlayacak, ama size bir kayıt var kontrol için bir seçme eklemek için gitmiyorum eğer insert sorgusunda hata bastırmak gerekir.

Başka bir seçenek MySQL komutunu DEĞİŞTİR kullanmak olabilir. http://dev.mysql.com/doc/refman/5.0/en/replace.html. Zaten varsa satırı silin ve sonra satır eklemek hangi.

Sizin kesin ihtiyaçları için uygun olmayabilir rağmen.