login  Naam:   Wachtwoord: 
Registreer je!
 Forum

in_array geeft pagina timeout (Opgelost)

Offline GroundZero - 10/12/2014 23:54
Avatar van GroundZeroLid Hi,

ik wil een aantal advertenties weergeven (max 30) maar als er maar 5 resultaten zijn, dan wil ik willekeurig 25 oude advertenties weergeven om de lege ruimtes op te vullen.

In mijn tweede loop kijk ik of er geen dubbele advertenties zijn door middel van in_array, echter wanneer ik dit doe blijft de pagina net zo lang laden tot ik een time-out krijg.

Kan iemand mij vertellen hoe ik dit kan oplossen?

  1. <?php
  2. require_once('includes/config.php');
  3. ?>
  4.  
  5. <!doctype html>
  6. <html>
  7. <head>
  8. <meta charset="utf-8">
  9.  
  10. <meta http-equiv="Cache-Control" content="no-cache" />
  11. <meta http-equiv="Pragma" content="no-cache" />
  12. <meta http-equiv="Expires" content="0" />
  13.  
  14. <title>BETA</title>
  15.  
  16. <base href="<?=ROOT?>" />
  17. <link rel="stylesheet" type="text/css" href="css/style.css" />
  18.  
  19. </head>
  20. <body>
  21.  
  22. <div class="wrapper">
  23. <div class="banner">
  24. <a href="<?=ROOT?>" title="BETA home pagina">
  25. <img src="images/banner.png" alt="BETA banner" />
  26. </a>
  27. </div>
  28.  
  29. <?php
  30. $counter = 1;
  31. $temp = 1;
  32. $cont = array();
  33.  
  34. $query = mysql_query('SELECT id, url, advertentie FROM site_advertenties
  35. WHERE
  36. klaar = 0
  37. AND
  38. geplaatst >= NOW() - INTERVAL 1 hour
  39. ORDER BY geplaatst ASC
  40. LIMIT 0, 30');
  41. $rows = mysql_num_rows($query);
  42.  
  43. while($fetch = mysql_fetch_assoc($query))
  44. {
  45. if($temp == 5)
  46. {
  47. echo '<div class="block mb1px">
  48. <a href="'.$fetch['url'].'" title="Bekijk deze website aangeboden via BETA.nl" target="_blank">
  49. <img src="uploads/'.$fetch['advertentie'].'" alt="Bekijk deze website aangeboden via BETA.nl" />
  50. </a>
  51. </div>';
  52. $temp = 1;
  53. }
  54. else
  55. {
  56. echo '<div class="block mr1px mb1px">
  57. <a href="'.$fetch['url'].'" title="Bekijk deze website aangeboden via BETA.nl" target="_blank">
  58. <img src="uploads/'.$fetch['advertentie'].'" alt="Bekijk deze website aangeboden via BETA.nl" />
  59. </a>
  60. </div>';
  61. $temp++;
  62. }
  63.  
  64. $cont[] = $fetch['id'];
  65. $counter++;
  66. }
  67.  
  68.  
  69.  
  70.  
  71. // select some old ones to display randomly
  72. if($rows <= 29)
  73. {
  74. $remaining = 30 - $rows;
  75. $temp = array();
  76. $num = $rows + 1;
  77. $select = '';
  78.  
  79. for($a = 1; $a <= $remaining; $a++)
  80. {
  81. while(in_array($select, $cont)) {
  82. $select = rand(1, $rows);
  83. }
  84.  
  85. $query = mysql_query('SELECT id, url, advertentie FROM site_advertenties
  86. WHERE
  87. id = "'.mysql_real_escape_string($select).'"');
  88. $fetch = mysql_fetch_assoc($query);
  89.  
  90. if($num % 5 == 0)
  91. {
  92. echo '<div class="block mb1px">
  93. <a href="'.$fetch['url'].'" title="Bekijk deze website aangeboden via BETA.nl" target="_blank">
  94. <img src="uploads/'.$fetch['advertentie'].'" alt="Bekijk deze website aangeboden via BETA.nl" />
  95. </a>
  96. </div>';
  97. }
  98. else
  99. {
  100. echo '<div class="block mr1px mb1px">
  101. <a href="'.$fetch['url'].'" title="Bekijk deze website aangeboden via BETA.nl" target="_blank">
  102. <img src="uploads/'.$fetch['advertentie'].'" alt="Bekijk deze website aangeboden via BETA.nl" />
  103. </a>
  104. </div>';
  105. }
  106.  
  107. $num++;
  108. $cont[] = $select;
  109. $select = '';
  110. }
  111. }
  112. ?>
  113.  
  114. <div class="footer">
  115.  
  116. </div>
  117. </div>
  118.  
  119. </body>
  120. </html>

6 antwoorden

Gesponsorde links
Offline Wijnand - 11/12/2014 08:54 (laatste wijziging 11/12/2014 08:54)
Avatar van Wijnand Moderator Je kunt misschien beter de id's onthouden van de eerste loop in een array en dan in een query zetten met:

  1. if ($rows <= 29) {
  2. $query = " SELECT id, url, advertentie FROM site_advertenties WHERE id NOT IN (" . mysql_real_escape_string(implode(',',$cont)) . " ) ";
  3. $fetch = mysql_fetch_assoc($query);
  4. if($num % 5 == 0)
  5. {
  6. echo '<div class="block mb1px"><a href="'.$fetch['url'].'" title="Bekijk deze website aangeboden via BETA.nl" target="_blank"><img src="uploads/'.$fetch['advertentie'].'" alt="Bekijk deze website aangeboden via BETA.nl" /></a></div>';
  7. } else {
  8. echo '<div class="block mr1px mb1px"><a href="'.$fetch['url'].'" title="Bekijk deze website aangeboden via BETA.nl" target="_blank"><img src="uploads/'.$fetch['advertentie'].'" alt="Bekijk deze website aangeboden via BETA.nl" /></a></div>';
  9. }
  10. $num++;
  11. }
Bedankt door: GroundZero
Offline GroundZero - 11/12/2014 13:02 (laatste wijziging 11/12/2014 13:11)
Avatar van GroundZero Lid Kijk, dat is een hele slimme oplossing. Ik was totaal de implode functie vergeten omdat ik die al jaren niet meer gebruikt heb.

Dankjewel voor deze oplossing!


EDIT: Ik krijg nu een foutmelding namelijk "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1".

  1. $query = mysql_query('SELECT id, url, advertentie FROM site_advertenties WHERE id NOT IN ('.mysql_real_escape_string(implode(',', $cont)).')') or die(mysql_error());
  2. $fetch = mysql_fetch_assoc($query);
Offline Wijnand - 11/12/2014 13:31
Avatar van Wijnand Moderator Doe eens:
echo $query;
Offline GroundZero - 11/12/2014 13:42 (laatste wijziging 11/12/2014 14:45)
Avatar van GroundZero Lid Deze geeft het volgende terug:

SELECT id, url, advertentie FROM site_advertenties WHERE id NOT IN (38,39)
SELECT id, url, advertentie FROM site_advertenties WHERE id NOT IN (38,39,)You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

EDIT: De array was leeg en dat mag niet, nu standaard de nul (0) ingevuld en nu werkt het perfect. Dankjewel voor je oplossing!
Offline Wijnand - 11/12/2014 14:44
Avatar van Wijnand Moderator die laatste komma is het probleem.

Je doet net iets fout:


Die hele FOR kan eruit waardoor je niet 25 connecties hoeft te maken (deze dus: for($a = 1; $a <= $remaining; $a++)

Alleen die query is goed genoeg om dit te regelen.
Je hoeft dan ook geen dingen op te slaan, maar die code die ik neerzette zou moeten werken.

Dus alles weghalen vanaf if($rows <= 29) en daarvoor in de plaats de bovenstaande code zetten.
Offline Thomas - 11/12/2014 19:55
Avatar van Thomas Moderator Het ophalen van de resterende advertenties kan met één query lijkt mij?

Als dit "random" advertenties moeten zijn (en je advertentie-tabel meer dan 30 records bevat) kun je wellicht ORDER BY RAND() gebruiken.

Dus zoiets:

SELECT <kolomnamen van gewenste kolomgegevens>
FROM site_advertenties
WHERE id NOT IN (<reeds gebruikte id's>)
ORDER BY RAND()
LIMIT <aantal op te halen advertenties>

Ik weet trouwens niet of de query efficiënt blijft als de tabel (heel) erg groot wordt (in verband met ORDER BY RAND()) maar ik denk niet dat dit snel een probleem gaat vormen.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.211s