login  Naam:   Wachtwoord: 
Registreer je!
 Forum

mysql_query() vervangen met array()

Offline Tuinstoel - 23/08/2005 11:36
Avatar van TuinstoelPHP expert Ik moet een query besparend systeem maken, dus het volgende (zie notatie) mag er niet in voorkomen.
  1. <?php
  2. $sQuery = "SELECT * FROM `tabel`";
  3. if(!$rRes = @mysql_query($sQuery))
  4. { echo 'failed'; exit; }
  5. else
  6. {
  7. $aUser = array();
  8. while($aRow = mysql_fetch_assoc($rRes))
  9. {
  10. $sQuerySel = "SELECT `user` FROM `tabel` WHERE `pagina` = '".$aRow['pagina']."' AND `tijd` = ".$aRow['tijd'];
  11. // ditte is te veel van het goeie, te veel querys
  12. if(!$rResSel = @mysql_query($sQuerySel))
  13. { echo 'failed.'; }
  14. else
  15. {
  16. if(mysql_num_rows($rResSel) > 0)
  17. {
  18. $aRowSel = mysql_fetch_assoc($rResSel);
  19. $aUser[] = $aRowSel['user'];
  20. }
  21. }
  22. }
  23. }
  24.  
  25. if(count($aUser) > 0)
  26. {
  27. $sQueryUpd = "UPDATE `leden` SET `dit` = 'iets' WHERE `id` IN(".implode(",",$aUser).")";
  28. if(!mysql_query($sQueryUpd))
  29. { echo 'failed'; exit; }
  30. else
  31. { echo 'succeeded'; }
  32. }
  33. ?>

Wat hier dus wordt gedaan is eerst alles opvragen uit 'tabel', en vervolgens kijken of hier een dubbele waarde in zit (dus tijd = tijd en pagina = pagina), zoja dan moet hij de user toevoegen in de array, en vervolgens wordt er met behulp van implode() een query uitgevoerd met de betreffende users.

Nu is mijn probleem dat er ong. 100 records per minuut in die tabel zit, en ik deze pagina in een cronjob uitvoer die elke minuut wordt uitgevoerd. Is dit ook anders mogelijk, dus dat $sQuerySel niet hoeft worden toegepast, dus bijvoorbeeld met array's gewerkt kan worden. Ik heb wel het een en ander geprobeerd maar kwam er niet uit. De server draait onder PHP5, dus dat kan ook gebruikt worden.

Met vriendelijke groet,
Tuinstoel

5 antwoorden

Gesponsorde links
Offline Thomas - 23/08/2005 13:29
Avatar van Thomas Moderator
Citaat:
Wat hier dus wordt gedaan is eerst alles opvragen uit 'tabel', en vervolgens kijken of hier een dubbele waarde in zit (dus tijd = tijd en pagina = pagina), zoja dan moet hij de user toevoegen in de array
Dat gebeurt volgens mij niet - hij leest gewoon van alle pagina's de users uit die er op een gegeven moment op zitten (of zoiets). Als hier een "dubbele waarde" in zou zitten, dan zou deze twee keer in het array staan (en je wilt eigenlijk dat dat array alleen maar leden bevatten die een "dubbele notering" hebben lijkt me ?).

Wat is precies de bedoeling, dan kunnen we het hierna eens over de optimalisatie ervan hebben .
Vanaf MySQL versie zoveel zijn geneste queries toegestaan, maar zo nieuw is jouw versie waarschjinlijk niet ?
SQL bevat ook een "HAVING" deel, dus er valt misschien wel een query te maken a la

  1. SELECT lid, COUNT(aantal keren dat iemand op een pagina zit) AS aantal
  2. ...
  3. FROM ...
  4. WHERE ...
  5. HAVING aantal > 1


Zodat je de "dubbele noteringen" in één keer hebt...
Offline Tuinstoel - 23/08/2005 13:40
Avatar van Tuinstoel PHP expert Mja versie is 4.0.25, dat is redelijk nieuw, maar het doel van dit hele script is (had ik beter gelijk kunnen vertellen);

Als men 2 vensters naast elkaar draait, kan er op excact dezelfde tijd een bepaalde actie worden ondernomen, die je bijvoorbeeld slechts een maal in de 2 minuten kunt uitvoeren. Ik heb er zodoende een logger in geprutst, met de volgende structuur;
id integer (unique)
user integer
tijd integer (time()
pagina varchar

Is het dus zo dat er een dubbele waarde in zit (dus 2 maal of vaker iets op dezelfde tijd en pagina), dan moet de 'user' geselecteerd worden.

Van having heb ik opgezocht op mysql.com, kan er alleen weinig van vinden aangezien having ook een gewoon engels woord is in het vocabulair daar.
Offline Fenrir - 23/08/2005 14:12 (laatste wijziging 23/08/2005 14:14)
Avatar van Fenrir PHP expert Stel je hebt form.php. Iemand heeft 2 vensters met actie.php open. Daarop staat een form, en de user klikt beide forms aan. De form gaat naar actie.php. Daar zet je dus zo'n timestamp in de db. Als er een user op actie.php komt, dan controleer je of er al zo'n timestamp in de db staat, en of deze timestamp minder dan 2 minuten oud is. Als dit zo is krijgt hij een bericht:
"Je kunt deze actie maar 1 keer per 2 minuten uitvoeren".

Het gaat dus zo:
  1. Venster 1 -> form submit -> actie.php -> geen timestamp in db -> maak er een.
  2. Venster 2 -> form submit -> actie.php -> wel timestamp in db (van venster 1) -> bericht: "Je kunt deze actie maar 1 keer per 2 minuten uitvoeren".
Offline Tuinstoel - 23/08/2005 16:02
Avatar van Tuinstoel PHP expert Dat is het probleem juist, dat valt dus blijkbaar te omzeilen omdat mensen sneller zijn dan de server (don't ask me how).

Ik controleer wel degelijk met mysql (dus geen cookies/sessions dat soort shit) of er in de afgelopen 2 minuten iets gedaan is.
Offline Fenrir - 23/08/2005 19:45
Avatar van Fenrir PHP expert misschien zo:

  1. <?php
  2.  
  3. // controleer of er een timestamp in db staat, zo ja, die(), zo nee, zet er een in, en sla het ID op:
  4.  
  5. usleep(100000); // andere waarde kan ook, maar ik denk dat dit genoeg is. Als dit niet zo is, zet er dan nog een 0 achter.
  6.  
  7. //controleer nog eens of er een timestamp in de db staat, en of het ID van de timestamp anders is dan $ID, als dit zo is betekent dat dat er vanuit een ander venster geprobeerd is tegelijkertijd een actie te doen, dus die(), anders, doe gewoon de actie
  8.  
  9. ?>


Zo zou het moeten werken.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2025 Sitemasters.be - Regels - Laadtijd: 0.216s