Forum zajednice Joomla! Hrvatska

Webmaster kutak => Ostale webmasterske teme i pitanja => Autor teme: erbi u 01. Rujan 2014, 09:41

Naziv: Mysql + PHP pomoč
Autor: 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.
Naziv: Odg: Mysql + PHP pomoč
Autor: Dario u 02. Rujan 2014, 08:21
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
Naziv: Odg: Mysql + PHP pomoč
Autor: erbi u 02. Rujan 2014, 09:18
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.
Naziv: Odg: Mysql + PHP pomoč
Autor: erbi u 02. Rujan 2014, 11:38
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')");
Naziv: Odg: Mysql + PHP pomoč
Autor: Dario u 03. Rujan 2014, 08:17
Probaj u ovom queryiju liniju "GROUP BY ip" zamjenit sa "GROUP BY ip, date", mislim da  bi to trebalo bit to
Naziv: Odg: Mysql + PHP pomoč
Autor: 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.

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.
Naziv: Odg: Mysql + PHP pomoč
Autor: Dario u 04. Rujan 2014, 08:16
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....
Naziv: Odg: Mysql + PHP pomoč
Autor: erbi u 04. Rujan 2014, 10:33
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!
Naziv: Odg: Mysql + PHP pomoč
Autor: Dario u 05. Rujan 2014, 08:08
No frk, zato smo tu :)