Novosti:

Aktualne Joomla! verzije: 3.10.11 i 4.2.6

Main Menu

Mysql + PHP pomoč

Autor erbi, 01. Rujan 2014, 09:41

0 Članovi i 1 Gost pregledava ovu temu.

erbi

Pozdrav!

Treba mi jedna pomoč oko php i mysql. Imam tablicu u koji je: ime, datum, ip, status
E sad mi treba jedna skripta, koja potraži prvi ip i pronađe sve unose ovog ip-ja. Do ovdje nema problema. Problem se pojavi, kako promjeniti status svima unosima ovog ip-ja, ako so u razponu manje od 24 sati. Ostavi se samo jedan unos.
Ovako bi mi trebalo za sve ip-je, koji su u bazi, da ne tražim ručno.

Dario

#1
Citat: erbi  u 01. Rujan 2014, 09:41
Pozdrav!

Treba mi jedna pomoč oko php i mysql. Imam tablicu u koji je: ime, datum, ip, status
E sad mi treba jedna skripta, koja potraži prvi ip i pronađe sve unose ovog ip-ja. Do ovdje nema problema. Problem se pojavi, kako promjeniti status svima unosima ovog ip-ja, ako so u razponu manje od 24 sati. Ostavi se samo jedan unos.
Ovako bi mi trebalo za sve ip-je, koji su u bazi, da ne tražim ručno.

Ovako iz glave, mislim da bi ovak nešto trebalo proći, samo treba imena tablica (i filed-ova) zamjenit....

DELETE test
FROM test
    INNER JOIN (
        SELECT MAX(ip) AS lastIp, ime, datum
        FROM test
        GROUP BY ip
        HAVING COUNT(*) > 1
    ) duplicate ON duplicate.lastIp = test.ip
WHERE test.datum < duplic.datum;

Prvo svakako backup, a za testiranje možeš u prvoj liniji umjesto "DELETE" napisati "SELECT" i trebao bi ti izbaciti van sve zapise koje bi inače izbrisao... Ako ti izbaci van redove koji su dupli, a nisu najnovij, onda je to - to

Problem bi mogao biti što nema id-a u tablici.... A još jedan način na koji bi mogao to izbjeći je da staviš da je IP adresa Unique u tablici i onda u INSERT statementu napraviš ON DUPLICATE KEY UPDATE, odnosno ako taj key već postoji - update-aš samo datum. Na taj ničin nikad u stvari nebi imao duplikate već samo jedinstvene IP adrese, a više o tome na
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
---
Molim da mi ne šaljete privatne poruke sa zahtjevima za pomoć, takve poruke ignoriram - zato služi forum :)
2b || !2b; this.question();
http://www.dblaze.eu

erbi

Hvala Dario.
Tablica ima i ID, pa mi ne koristi suviše  :) Ip ne mogu biti unique, jer se svaki dan jedanput može upisat isti ip. U skripti ima, da kontroliše ip i vrijeme upisa. Kod mene radi, al neko je zaobišao i stavio puno zapisa u 10 sekundi. Zaobišao je i cookie iako je ovaj obavezan.

erbi

Evo, u tablici je ovako:
    id               datum                        ip                 
"15813","2014-09-01 12:00:00","666"
"15810","2014-09-02 02:00:00","666"
"15811","2014-09-02 04:00:00","666"
"15812","2014-09-02 06:00:00","666"
"15814","2014-09-03 12:00:00","666"
"15815","2014-09-03 14:00:00","666"

Delete bi morao obrisati linije 3, 4, 6, al mi obriše linije 2, 3, 4. Znači, svaki dan je možan samo jedan upis od jednog IP-ja. Noje bitno, dali je to prvi ili poslednji.

Koda je ovakva:

$result = mysqli_query($con,"SELECT *
FROM votes
    INNER JOIN (
        SELECT MAX(ip) AS lastIp, option_id, date
        FROM votes
        GROUP BY ip
        HAVING COUNT(*) > 1
    ) duplicate ON duplicate.lastIp = votes.ip
where DATE_FORMAT(DATE(votes.date), '%Y-%m-%d') = DATE_FORMAT(DATE(duplicate.date), '%Y-%m-%d')");

Dario

Probaj u ovom queryiju liniju "GROUP BY ip" zamjenit sa "GROUP BY ip, date", mislim da  bi to trebalo bit to
---
Molim da mi ne šaljete privatne poruke sa zahtjevima za pomoć, takve poruke ignoriram - zato služi forum :)
2b || !2b; this.question();
http://www.dblaze.eu

erbi

E, ovo radi kako treba. Ima još jednu manju grešku.
Ako pronađe 2 ili više IP-ja na jedan dan obriše sve za toj dan. Neče da ostavi jednog. Ako0 ne ide, može i ovako.

Još sada ne shvačam, kako je moguče zaobiči kontrolu IP-ja? Sa klikom sve se upiše u tablicu. Sa poslednjim posjetom se prvo provjeri dali danas več postoji ovaj ip. Ako postoji forma se ne pokazuje, a ja imam upise po 5 na isti sekund.

Dario

Citat: erbi  u 03. Rujan 2014, 09:45
E, ovo radi kako treba. Ima još jednu manju grešku.
Ako pronađe 2 ili više IP-ja na jedan dan obriše sve za toj dan. Neče da ostavi jednog. Ako0 ne ide, može i ovako.

Mislam da ovaj "=" znak na kraju u WHERE-u treba promjeniti u "<" i to bi trebalo bit to....
---
Molim da mi ne šaljete privatne poruke sa zahtjevima za pomoć, takve poruke ignoriram - zato služi forum :)
2b || !2b; this.question();
http://www.dblaze.eu

erbi

Evo, ovakvo je rješenje:

$result = mysqli_query($con,"SELECT *
FROM xlpix_acepolls_votes
    INNER JOIN (
        SELECT MAX(ip) AS lastIp, option_id, date, MAX(id) as maxId
        FROM votes
        GROUP BY ip, DATE_FORMAT(DATE(votes.date), '%Y-%m-%d')
        HAVING COUNT(*) > 1
    ) duplicate ON duplicate.lastIp = votes.ip
where DATE_FORMAT(DATE(votes.date), '%Y-%m-%d') = DATE_FORMAT(DATE(duplicate.date), '%Y-%m-%d')
AND maxId > votes.id");


Dario hvala na pomoči!

Dario

---
Molim da mi ne šaljete privatne poruke sa zahtjevima za pomoć, takve poruke ignoriram - zato služi forum :)
2b || !2b; this.question();
http://www.dblaze.eu