Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL queryn sivutus

Sivun loppuun

Plakkis [17.09.2010 22:21:13]

#

<?php
$kayttaja="xxxxxxx";
$salasana="xxxxxxxxx";
$tietokanta="xxxxxxxxxx";
mysql_connect(localhost,$kayttaja,$salasana);
@mysql_select_db($tietokanta) or die( "Virhe tietokantaa valittaessa");

// Kuinka monta riviä/sivu
$rivitPerSivu = 25;

// $rivitPerSivu muokattavaksi
if (isset($_GET['rivitPerSivu']))
{
$rivitPerSivu = $_GET['rivitPerSivu'];
}

// Oletuksena näytetään sivu nro 1.
$sivuNro = 1;

// jos $_GET['sivu'] määritetty, käytä sitä sivunumerona
if(isset($_GET['sivu']))
{
$sivuNum = $_GET['sivu'];
}

// Kuinka monta sivua skipataan, että tiedetään kuinka monta riviä kullekkin sivulle kuuluu
$offset = ($sivuNum - 1) * $rivitPerSivu;

$query = "SELECT * FROM books ORDER BY Teos ASC LIMIT $offset, $rowsPerPage";
$result = mysql_query($query);
$num = mysql_numrows($result);
$i=0;
while ($i < $num)
{

$variable1=mysql_result($result,$i,"variable1");
// Echotetaan
echo $variable1 . '<BR>';

// Query tietokantaan rivien kokonaismäärän saamiseksi
$query2 = "SELECT COUNT(RECNO) AS numrows FROM books";
$result2 = mysql_query($query2) or die('Virhe, query2 epäonnistui');
$row = mysql_fetch_array($result2, MYSQL_ASSOC);
$numrows = $row['numrows'];

// Kuinka monta sivua käytössä kun sivutus käytössä
$maxPage = ceil($numrows/$rivitPerSivu);
}
// Tulostetaan sivunumerot
$self = $_SERVER['PHP_SELF'];
$nav = '';
for($page = 1; $page <= $maxPage; $page++)
{
if ($page == $pageNum) {
$nav .= " $page "; // Ei tarvetta linkille nykyiselle sivulle
} else {
$nav .= " <a href=\"$self?page=$page&rivitPerSivu=$rivitPerSivu\" class='page'>$page</a> ";
}
}
// luodaan edellisen ja seuraavan linkit
// ja linkit millä pääsee suoraan ensimmäiselle ja viimeiselle sivulle
if ($sivuNum > 1) {
$page = $sivuNum - 1;
$prev = " <a href=\"$self?page=$page&rivitPerSivu=$rivitPerSivu\" class='page'>&lt;</a> ";

$first = " <a href=\"$self?page=1&rivitPerSivu=$rivitPerSivu\" class='page'>&lt;&lt;</a> ";
} else {
$prev = '&nbsp;'; // Sivu yksi, älä tulosta edellistä
$first = '&nbsp;'; // Äläkä ensimmäisen sivun linkkiä
}
if ($sivuNum < $maxPage) {
$page = $sivuNum + 1;
$next = " <a href=\"$self?page=$page&rivitPerSivu=$rivitPerSivu\" class='page'>&gt;</a> ";
$last = " <a href=\"$self?page=$maxPage&rivitPerSivu=$rivitPerSivu\" class='page'>&gt;&gt;</a> ";
} else {
$next = '&nbsp;'; // Viimeinen sivu, älä tulosta seuraavaa sivua
$last = '&nbsp;'; // Äläkä viimeiselle sivulle menoa
}
// echotetaan navigaatio linkit
echo $first . $prev . $nav . $next . $last;
// Ja lopuksi suljetaan yhteys tietokantaan
mysql_close();

?>

Koodi sisennetty ja virheellinen {} suljettu.

Lebe80 [17.09.2010 22:31:31]

#

Kokeilepas sisentää oikein { } -merkkien sisältä, niin näet mistä "yllättävä lopetus" johtuu.

-tossu- [17.09.2010 22:32:03]

#

Koodissa näyttää olevan sulkematon while-silmukka.

Plakkis [17.09.2010 22:37:43]

#

while ($i < $num) {

Viittaisiko tuo virhe siis tuohon riviin?

-tossu- [17.09.2010 22:47:21]

#

Plakkis kirjoitti:

Viittaisiko tuo virhe siis tuohon riviin?

Virhe tarkoittaa sitä, että et ole sulkenut tuota while-silmukkaa. Sisennä koodisi, niin näet sen itsekkin. Sinun pitää lisätä siihen }-merkki sopivaan kohtaan.

Plakkis [17.09.2010 22:54:38]

#

Okei, kiitos virheen huomauttamisesta. While silmukka on suljettu, mutta en ole varma suljinko sen sittenkin väärin, sillä uutta virhettä tulee


Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in sivutus.php on line 31

Metabolix [17.09.2010 23:04:51]

#

Tuo taas kertoo, että MySQL-kyselyssä on tapahtunut virhe. Koodissa oleva virhe on triviaali, ja saat etsiä sen itse samalla, kun opettelet hyviä ohjelmointitapoja.

Laita koodin alkuun seuraavat rivit:

<?php
ini_set("display_errors", 1);
ini_set("error_reporting", E_ALL | E_STRICT);

Näin saat näkyviin paljon enemmän virheilmoituksia, varoituksia ym. korjattavaa.

Virheellisten MySQL-kyselyiden varalta kannattaa joko vaihtaa tietokantarajapinnaksi PDO-kirjasto, tai jos tämä ei mitenkään sovi, voi käyttää seuraavanlaista apufunktiota aina mysql_query-funktion sijaan:

<?php
mysql_query_apu($query, $yhteys = null) {
  $tulos = mysql_query($query, $yhteys);
  if (!$tulos) {
    echo "<p>Virhe MySQL-kyselyssä!</p>\n";
    echo "<p>Kysely: ", htmlspecialchars($query), "</p>\n";
    echo "<p>Virhe: ", htmlspecialchars(mysql_error()), "</p>\n";
    die();
  }
  return $tulos;
}

// Esimerkki:
$haku = mysql_query_apu("SELECT * FROM taulu WHERE id = 1");

Plakkis [17.09.2010 23:42:28]

#

Noniin, kiitos tuon display error pätkän, sain vian jäljitettyä lopulta variables kohtaan, joka vaatii korjailua. Kiitos avustanne!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta