Avatar billede jonatanharring Nybegynder
06. juni 2006 - 15:30 Der er 14 kommentarer og
1 løsning

Fejl i PHP kode - Jeg overbelaster b-ones server - Find den

Hej, jeg er webmaster for siden www.sejespil.dk, som iøjeblikket ikke virker pga. jeg overbelaster b-one's server! (systemet kørte også unormalt langsomt, da jeg endnu kunne se min hjemmeside skal det da også siges). De siger at det er en fejl i dette PHP script, og at jeg muligvis har glemt at lukke forbindelsen eller ligende!
- Kan i venligst hjælpe mig? TAK!

PHP scriptet:

<?
ob_start();
?>
<html>
<head>
<meta http-equiv="Content-Language" content="da">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<style type="text/css">
a, a:visited, a:active {
color: black;
text-decoration: none;
}
a:hover {
color: red;
}
body {
font: normal 10pt verdana;
background: #F5F9FC;
color: #000000;
scrollbar-face-color: #F5F9FC;
scrollbar-highlight-color: #F5F9FC;
scrollbar-shadow-color: #1C425E;
scrollbar-3dlight-color: #1C425E;
scrollbar-arrow-color: #1C425E;
scrollbar-track-color: #F5F9FC;
scrollbar-darkshadow-color: #F5F9FC;
overflow:auto;
}
table {
font: normal 10pt verdana;
}
img {
border-width: 0px;
}
.h {
font: bold 12pt verdana;
}
p, form {
display: inline;
}
</style>
<title>Oversigt over spil</title>
</head>
<body>
<?
mysql_connect("********", "********", "********") or die(mysql_error());
mysql_select_db("********") or die(mysql_error());

// Sæt hits ved hvert spil
$sql = mysql_query("SELECT * FROM `spil`");
while ($row = mysql_fetch_array($sql)) {
  extract($row);
  if (!$hits) {
    $hits = mysql_num_rows(mysql_query("SELECT * FROM `hits` WHERE `id` = $id"));
    mysql_query("UPDATE `spil` SET `hits` = $hits WHERE `id` = $id");
  }
  $rate2 = mysql_query("SELECT * FROM `rate` WHERE `id` = $id");
  $rate1 = mysql_fetch_array($rate2);
  $rate = $rate1["rate"];
  mysql_query("UPDATE `spil` SET `gennemsnit` = $rate WHERE `id` = $id");
}

$vis = (int) $_GET["vis"];
if (!$vis || $vis < 0) {
  $vis = 0;
}
$antal = 20;

$play = $_GET["play"];
if ($play && $_GET["id"]) {
  $ip = getenv("REMOTE_ADDR");
  $id = $_GET["id"];
  $sql = mysql_query("SELECT * FROM `spil` WHERE `id` = $id");
  $row = mysql_fetch_array($sql);
  $dest = $_GET["dest"];
  mysql_query("INSERT INTO `hits` (`hits`, `id`) VALUES ('$ip', $id)");
  header("location: $dest");
  ob_end_flush();
  exit;
}

$kat = $_GET["kat"];

// Vælg kategori menu
if ($kat != "Rate" && $kat != "hits") {
  echo "<center>\n";
  echo "<form name=\"kategori_form\" action=\"$PHP_SELF\" method=\"get\">\n";
  echo "Vælg kategori:\n";
  echo "<select name=\"kat\" onchange=\"kategori_form.submit();\">\n";
  echo "<option value=\"alle\">Alle</option>\n";
  $sql = mysql_query("SELECT * FROM `kategorier` ORDER BY `kat` ASC");
  while ($row = mysql_fetch_array($sql)) {
    echo "<option value=\"$row[kat]\""; if ($kat == $row["kat"]) echo " selected=\"selected\""; echo ">$row[kat]</option>\n";
  }
  echo "</select></form>";
  echo "</center><br />\n";
}
$rate = $_POST["rate"];
$ip = $_SERVER["REMOTE_ADDR"];
$list_rate = explode("_", $rate);
if (is_array($list_rate)) {
mysql_query("INSERT INTO `rate` (`id`, `rate`, `ip`) VALUES ($list_rate[3], $list_rate[1], '$ip')");
}
if ($kat) {
  if ($kat == "alle") {
    $sql = mysql_query("SELECT * FROM `spil` ORDER BY `id` DESC LIMIT $vis, $antal");
  }
  elseif ($kat == "Rate") {
    $sql = mysql_query("SELECT * FROM `spil` ORDER BY `gennemsnit` DESC LIMIT 0, 50");
  }
  elseif ($kat == "hits") {
    $sql = mysql_query("SELECT * FROM `spil` ORDER BY `hits` DESC LIMIT 0, 50");
  }
  else {
    $sql = mysql_query("SELECT * FROM `spil` WHERE `kategori` = '$kat' ORDER BY `id` DESC LIMIT $vis, $antal");
  }
}
else {
  $sql = mysql_query("SELECT * FROM `spil` ORDER BY `id` DESC LIMIT $vis, $antal");
}
echo "<center>\n";
if (mysql_num_rows($sql) == 0) {
  echo "<span class=\"h\">Der blev ikke fundet nogle spil i denne kategori.</span>";
} else {
  if ($kat == "Rate") {
    echo "<span class=\"h\">De 50 bedste spil</span>";
  } elseif ($kat == "hits") {
    echo "<span class=\"h\">De 50 mest besøgte spil</span>";
  } elseif ($kat == "Chats") {
    echo "<span class=\"h\">Antal chats: " . mysql_num_rows(mysql_query("SELECT * FROM `spil` WHERE `kategori` = '$kat'")) . "</span>";
  } else {
    if (!$kat) {
      echo "<span class=\"h\">Antal spil og film: " . mysql_num_rows(mysql_query("SELECT * FROM `spil`")) . "</span>";
    } else {
      echo "<span class=\"h\">Antal spil og film: " . mysql_num_rows(mysql_query("SELECT * FROM `spil` WHERE `kategori` = '$kat'")) . "</span>";
    }
  }
}
echo "</center>";
echo "<hr color=\"#8DC0EB\" size=\"1\" noshade />";
if ($kat == "Rate") {
  $index = 0;
  echo "<table width=\"100%\">";
  while ($row = mysql_fetch_array($sql)) {

    $index++;
    if (strstr($index/2, ".")) {
      echo "<tr>";
    }

    $ip = $_SERVER["REMOTE_ADDR"];
    $id = $row["id"];
    echo "<td width=\"50%\" align=\"center\" id=\"$row[id]\">";
    $rate1 = mysql_query("SELECT * FROM `rate` WHERE `id` = $id");
    $sum = 0;
    while ($rate2 = mysql_fetch_array($rate1)) {
      $sum += $rate2["rate"];
    }
    $opsummering = mysql_num_rows($rate1);

    $billede2 = mysql_query("SELECT * FROM `spil` WHERE `id` = $id");
    $billede1 = mysql_fetch_array($billede2);
    if (!$billede1["gennemsnit"]) {
      $billede1["gennemsnit"] = "0";
    }
    echo "<div align=\"center\" id=\"$row[id]\"><b><a style=\"text-decoration: none\" href=\"?play=true&id=" . $row["id"] . "&dest=" . $row["spil_dest"] . "\" target=\"_blank\">$row[titel]</b></a></div>\n";
    echo "<a href=\"?play=true&id=" . $row["id"] . "&dest=" . $billede1["spil_dest"] . "\" target=\"_blank\"><img height=\"60\" width=\"60\" src=\"uploads/" . $billede1["billede_dest"] . "\" alt=\"" . $billede1["titel"] . "\" /></a>\n<br />\n";

    if (mysql_num_rows(mysql_query("SELECT * FROM `rate` WHERE `id` = $id AND `ip` = '$ip'")) == 0) {
      echo "<form action=\"{$_SERVER[PHP_SELF]}#{$row[id]}\" method=\"post\">\n";
      echo "Bedøm: <select name=\"rate\">\n";
      for ($i = 1; $i <= 10; $i++) {
        echo "<option value=\"rate_{$i}_id_{$id}\">$i</option>\n";
      }
      echo "</select> <input type=\"submit\" value=\"Bedøm\" />\n</form>";
    }

    echo "<p>Kategori: <b>$billede1[kategori]</b><br />Antal stemmer: <b>" . mysql_num_rows(mysql_query("SELECT * FROM `rate` WHERE `id` = $id")) . "</b><br />Gennemsnitlig bedømmelse: <b>";
    if (strstr(($sum)/$opsummering, ".")) {
      echo substr($sum/$opsummering, 0, 3);
    } else {
      echo $sum/$opsummering;
    }
    echo "</b><br />Hits: <b>" . mysql_num_rows(mysql_query("SELECT * FROM `hits` WHERE `id` = $id")) . "</b></td>";

    // Her går den til næste spil
    if (!strstr($index/2, ".")) {
      echo "</tr><tr><td colspan=\"2\"><hr color=\"#8DC0EB\" size=\"1\" noshade /></td></tr>\n";
    }
  }
}

elseif ($kat == "hits") {
  $index = 0;
  echo "<table width=\"100%\">";
  while ($row = mysql_fetch_array($sql)) {
    $index++;
    if (strstr($index/2, ".")) {
      echo "<tr>";
    }
    echo "<td width=\"50%\" align=\"center\" id=\"$row[id]\">";
    $ip = $_SERVER["REMOTE_ADDR"];
    $id = $row["id"];

    $rate1 = mysql_query("SELECT * FROM `rate` WHERE `id` = $id");
    $sum = 0;
    while ($rate2 = mysql_fetch_array($rate1)) {
      $sum += $rate2["rate"];
    }
    $opsummering = mysql_num_rows($rate1);

    $billede2 = mysql_query("SELECT * FROM `spil` WHERE `id` = $id");
    $billede1 = mysql_fetch_array($billede2);

    if (strstr(($sum)/$opsummering, ".")) {
      $gennemsnit = substr($sum/$opsummering, 0, 3);
    } else {
      $gennemsnit = $sum/$opsummering;
    }
    echo "<div align=\"center\" id=\"$row[id]\"><a style=\"text-decoration: none\" href=\"?play=true&id=" . $row["id"] . "&dest=" . $row["spil_dest"] . "\" target=\"_blank\"><b>$row[titel]</b></a></div>\n";
    echo "<a href=\"?play=true&id=" . $row["id"] . "&dest=" . $billede1["spil_dest"] . "\" target=\"_blank\"><img height=\"60\" width=\"60\" src=\"uploads/" . $billede1["billede_dest"] . "\" alt=\"" . $billede1["titel"] . "\" /></a>\n<br />\n";

    if (mysql_num_rows(mysql_query("SELECT * FROM `rate` WHERE `id` = $id AND `ip` = '$ip'")) == 0) {
      echo "<form action=\"{$_SERVER[PHP_SELF]}#{$row[id]}\" method=\"post\">\n";
      echo "Bedøm: <select name=\"rate\">\n";
      for ($i = 1; $i <= 10; $i++) {
        echo "<option value=\"rate_{$i}_id_{$id}\">$i</option>\n";
      }
      echo "</select> <input type=\"submit\" value=\"Bedøm\" />\n</form>";
    }

    echo "<p>Kategori: <b>$billede1[kategori]</b><br />Antal stemmer: <b>" . mysql_num_rows(mysql_query("SELECT * FROM `rate` WHERE `id` = $id")) . "</b><br />Gennemsnitlig bedømmelse: <b>";
    echo $gennemsnit . "</b><br />Hits: <b>" . mysql_num_rows(mysql_query("SELECT * FROM `hits` WHERE `id` = $id")) . "</b></td>";

    // Her går den til næste spil
    if (!strstr($index/2, ".")) {
      echo "</tr><tr><td colspan=\"2\"><hr color=\"#8DC0EB\" size=\"1\" noshade /></td></tr>\n";
    }
  }
}

else {
  $index = 0;
  echo "<table width=\"100%\">";
  while ($row = mysql_fetch_array($sql)) {
    $index++;
    if (strstr($index/2, ".")) {
      echo "<tr>";
    }
    echo "<td width=\"50%\" align=\"center\" id=\"$row[id]\">";
    echo "<a href=\"?play=true&id=" . $row["id"] . "&dest=" . $row["spil_dest"] . "\" target=\"_blank\"><b>$row[titel]</b></a><br />\n";
    echo "<a href=\"?play=true&id=" . $row["id"] . "&dest=" . $row["spil_dest"] . "\" target=\"_blank\"><img height=\"60\" width=\"60\" src=\"uploads/" . $row["billede_dest"] . "\" alt=\"" . $row["titel"] . "\" /></a>\n<br />\n";

    $ip = $_SERVER["REMOTE_ADDR"];
    $id = $row["id"];
    if (mysql_num_rows(mysql_query("SELECT * FROM `rate` WHERE `id` = $id AND `ip` = '$ip'")) == 0) {
      echo "<form action=\"{$_SERVER[PHP_SELF]}#{$row[id]}\" method=\"post\">\n";
      echo "Bedøm: <select name=\"rate\">\n";
      for ($i = 1; $i <= 10; $i++) {
        echo "<option value=\"rate_{$i}_id_{$id}\">$i</option>\n";
      }
      echo "</select> <input type=\"submit\" value=\"Bedøm\" />\n</form>";
    }

    $rate1 = mysql_query("SELECT * FROM `rate` WHERE `id` = $id");
    $sum = 0;
    while ($rate2 = mysql_fetch_array($rate1)) {
      $sum += $rate2["rate"];
    }
    $opsummering = mysql_num_rows($rate1);

    echo "Kategori: <b>$row[kategori]</b><br />Antal stemmer: <b>" . mysql_num_rows(mysql_query("SELECT * FROM `rate` WHERE `id` = $id")) . "</b><br />Gennemsnitlig bedømmelse: <b>";

    if (strstr($sum/$opsummering, ".")) {
      echo (int) substr($sum/$opsummering, 0, 3);
    } else {
      echo (int) $sum/$opsummering;
    }

    echo "</b><br />Hits: <b>" . mysql_num_rows(mysql_query("SELECT * FROM `hits` WHERE `id` = $id")) . "</b></td>";

    // Her går den til næste spil
    if (!strstr($index/2, ".")) {
      echo "</tr><tr><td colspan=\"2\"><hr color=\"#8DC0EB\" size=\"1\" noshade /></td></tr>\n";
    }
  }
  echo "</table>";
  if (!strstr(($index-1)/2, ".")) {
    echo "<hr color=\"#8DC0EB\" size=\"1\" noshade />\n";
  }
}
echo "<p />";
if ($kat == "Rate" || $kat == "hits") {
  exit;
}
echo "<center>";
$forrige = $vis-$antal;
$naeste = $vis+$antal;
if ($forrige >= 0) {
  echo "<a href=\"?vis=$forrige\">Forrige</a>&nbsp;&nbsp;&nbsp;";
}
$i = 0;
$i2 = 0;
if (!$kat) {
  do {
    $i2 = $i2 + 1;
    if ($vis == $i) {
      echo "<b>$i2</b>&nbsp;&nbsp;";
    } else {
      echo "<a href=\"?kat=$kat&vis=$i\">$i2</a>&nbsp;&nbsp;";
    }
    $i = $i + 20;
  }
  while ($i < mysql_num_rows(mysql_query("SELECT * FROM `spil`")));
} else {
  do {
    $i2 = $i2 + 1;
    if ($vis == $i) {
      echo "<b>$i2</b>&nbsp;&nbsp;";
    } else {
      echo "<a href=\"?kat=$kat&vis=$i\">$i2</a>&nbsp;&nbsp;";
    }
    $i = $i + 20;
  }
  while ($i < mysql_num_rows(mysql_query("SELECT * FROM `spil` WHERE `kategori` = '$kat'")));
}

if ($kat) {
  if ($naeste < mysql_num_rows(mysql_query("SELECT * FROM `spil` WHERE `kategori` = '$kat'"))) {
    echo "<a href=\"?kat=$kat&vis=$naeste\">Næste</a>";
  }
} else {
  if ($naeste < mysql_num_rows(mysql_query("SELECT * FROM `spil`"))) {
    echo "<a href=\"?vis=$naeste\">Næste</a>";
  }
}
echo "</center>";
?>
</body>
</html>
Avatar billede barklund Nybegynder
06. juni 2006 - 15:35 #1
For lige at stille det dumme spørgsmål - lukker du da forbindelsen? Du ved, mysql_connect forbinder, mysql_close lukker forbindelsen igen.
Avatar billede jonatanharring Nybegynder
06. juni 2006 - 16:29 #2
Hvor skal jeg da i så fald lukke forbindelsen henne?
Avatar billede BTEngineer Novice
06. juni 2006 - 16:35 #3
Prøv at indsæt mysql_close(); nedrest i scriptet.
Avatar billede barklund Nybegynder
06. juni 2006 - 16:42 #4
(hvilket umiddelbart er et ekstremt oplagt svar, som spørgeren unægteligt burde kunne have kommet med selv efter at have kigget på for eksempel http://php.net/mysql_connect)
Avatar billede fixxxer Nybegynder
06. juni 2006 - 17:13 #5
Avatar billede tiller3 Nybegynder
06. juni 2006 - 19:14 #6
Personligt tror jeg mere problemet er at du overbelaster deres database.

Har du lavet indexer paa dine keys i databasen.


Proev at koere foelgende query og giv output her:

explain SELECT * FROM `spil` WHERE `id` = 10;

(Jeg ved faktisk ikke om man kan goere det inde fra php med med mysql_query men jeg tror det nesten. Altsaa output fra
mysql_query("explain SELECT * FROM `spil` WHERE `id` = 10");

Hvis det ikke giver noget resultat, saa skal logge ind paa maskinen, og koere mysql klienten, men jeg ved ikke om du maa det paa dit hotel.
Avatar billede olebole Juniormester
06. juni 2006 - 20:08 #7
<ole>

Det er en ualmindelig slammet kode, som nok ikke mange gider gå efter i enkeltheder. Du bør helt klart adskille markup og serverkode i stedet for at rode det hele sammen til en uoverskuelig sovs  :)

Derved slipper du (og b-one) også for, at du opbevarer hele dokumentet i serverens hukommelse med OutputBuffering (ob_start() og ob_flush()), som er helt unødvendigt, hvis man koder ordentligt.

Er det mon overhovedet nødvendigt, du bruger '*' i dine MySQL-kald? Mon ikke du henter en bunke unødige felter?

Desuden er der ingen grund til at bruge mysql_fetch_array(), når du kun bruger det associative array ... brug i stedet mysql_fetch_assoc().

Det virker også som skidt arkitektur, at du er nødt til at hente _så_ meget i DB'en, hvergang et dokument requestes. Tænk, hvis bageren først skulle til at så hveden og rosinerne, malke koen og købe læggehøns - hvergang en kunde bestiller en tebolle med rosiner  ;o)

- og naturligvis bør du indeksere dine tabeller, som tiller3 helt korrekt anfører.

/mvh
</bole>
Avatar billede barklund Nybegynder
06. juni 2006 - 20:57 #8
Sår man rosiner? :(
Avatar billede olebole Juniormester
06. juni 2006 - 21:06 #9
J, men man skal passe på med at så dem for tæt på hestepærer ... så tørrer de bare ud  ;D

Jeg tænkte såmænd selv på det, da jeg skrev ordene, men det i forvejen lidt søgte eksempel ville blive endnu længere og vrøvlet, hvis jeg skrev vindruer - og skulle have disses rosin-metamorfose indflettet i sagaen  ;o)
Avatar billede barklund Nybegynder
06. juni 2006 - 21:20 #10
Jeg synes det var en fantastisk analogi og vil meget gerne abonnere på fremtidige kapitler herom... :)
Avatar billede mclemens Nybegynder
06. juni 2006 - 21:42 #11
Jeg bliver lige lidt nysgerrig...
iflg. link til http://php.net/mysql_connect så:

[ Bemærk:  Forbindelsen til serveren vil blive lukket, når scriptet er eksekveret med mindre, det er blevet defineret tidligere at den skulle lukke, af mysql_close(). ]

- Er det bedre at lukke den manuelt i koden ... eller sker det at den ikke lukker af sig selv? (jeg lukker den nemlig heller ikke selv, da jeg ikke troede, at det var nødvendigt?)
Avatar billede erikjacobsen Ekspert
06. juni 2006 - 21:56 #12
Det har som sådan ikke noget med mysql_close at gøre. Det er en smule bedre at gøre det selv, når man er færdig med databasedelen, og skal til at lave output til brugeren. Her hvor det nødvendigvis må stå til sidst løser det i hvert fald ikke problemet.

Jeg vil nok sige, at spørgeren bør undlade at skrive scripts der skal køre på webhoteller, før han har lært at programmere. Der er overtrådt så mange "regler", at det gør helt ondt at læse. Eet eksempel:

  do {
    //....
    $i = $i + 20;
  }
  while ($i < mysql_num_rows(mysql_query("SELECT * FROM `spil`")));

Antallet af rækker beregnes i hvert gennemløb på den absolut dyreste måde. Det burde gøres een gang, før "do", og med en "SELECT COUNT(*)....". 

Jeg har - for en gangs skyld - respekt for b-one, at de har lukket spørgerens side.
Avatar billede mclemens Nybegynder
06. juni 2006 - 22:06 #13
[ ... Det er en smule bedre at gøre det selv ... ]
- Tak for feedback, erikjacobsen :)
Avatar billede erikjacobsen Ekspert
06. juni 2006 - 22:12 #14
Fint nok, men lad mig præcisere. Een ikke helt gumpetung måde at lave PHP-sider på er en opdeling som (skitse):

<?
  mysql_connect(...);
  // phpkode, der finder ud af hvad brugeren vil
  // og som gemmer/henter data fra database og
  // putter det ind i passende variabler, arrays etc
  mysql_close(....);
?>
<html>
<!--den html kode der skal vises-->
Goddag <?=$fornavn?>.
<!--hvor man så bruger variablerne fra før-->
</html>

Her lukker man databasen så hurtigt som muligt, og spare derfor en lille smule ressourcer.
Og man har lavet en første opdeling mellem beregninger og præsentation. Det kan helt sikkert også gøres smartere...
Avatar billede mclemens Nybegynder
06. juni 2006 - 22:32 #15
Jeps, sådan har jeg også lavet min...
- Den er dog splittet ud i 14 php filer
med hver deres individuelle funktion...

... Lå på 20 ms. i sidste uge pr. side, denne uge
10 ms. efter optimering af diverse funktioner...

Laver en hastigheds test på den close funktion
en dag og ser om det kan give et ms. ekstra...

Har max 2 mysql request pr. side - den ene med limit - begge med et stk. like ... databasen fylder dog kun ca. 50 kb., da det er en webshop med seperate php filer med teksten til hver enkelt produkt anmeldelse i.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester