Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sivujen paginointi. Muuttujat katoaa

kamppis [18.03.2014 17:43:48]

#

Mitenhän voisi tämä ongelman hoitaa. Minulla tulee 10 erilaista kuvaketta ruudulle ja pystyn vaihtamaan sivua ongelmitta, mutta kaikki tallennetut tiedot häviää samalla. Minulla on iso hakutaulukko ja pystyn siihen kirjata haut jotka jakautuvat sivuilla oikeassa suhteessa. Kuitenkin jos painan vaikka kakkossivua niin osoite kenttä tietty nollaantuu ja menee ?page=2 jolloin kaikki vanhat muuttujat katoaa ja kakkossivulla näkyy "originaali" hakutulos mikä tulisi jos hakuehtoja ei laiteta.

Paginointi on tehty näin:
ÄLKÄÄ sitten vai jumittako noihin, että turvaton tai älä hae select * tyylillä kun ne tullaan kuitenkin muuttamaan. Vain kysymääni ongelmaan ratkaisua siis haetaan.

Alku.

lainaus:

$page = $_GET['page'];
if ($page < 1) $page = 1;

$resultsPerPage = 10;
$startResults = ($page - 1) * $resultsPerPage;
$numberOfRows = mysql_num_rows(mysql_query('SELECT * FROM users'));
$totalPages = ceil($numberOfRows / $resultsPerPage);

$data = mysql_query("SELECT * FROM users WHERE id != '$id' LIMIT $startResults,$resultsPerPage") or die(mysql_error());

Tässä välissä sitten tehdään while looppi joka kerää kaikki datat taulukosta ja näyttää tiedot. Loopin jälkeen tehdään alapalkki jossa voidaan kulkea eteen ja taakse:

lainaus:

echo '<a href="?page=1">First</a>&nbsp';
if($page > 1)
{
echo '<a href="?page='.($page - 1).'">Back</a>&nbsp';

}

for($i = 1; $i <= $totalPages; $i++)
{
   if($i == $page)
   {
      echo '<strong>'.$i.'</strong>&nbsp';
}
   else
   {
      echo '<a href="?page='.$i.'">'.$i.'</a>&nbsp';

}
}


if ($page < $totalPages)
{
   echo '<a href="?page='.($page + 1).'">Next</a>&nbsp;';

 }
echo '<a href="?page='.$totalPages.'">Viimeinen</a>';

Nyt homma toimii, mutta kun vaihdan sivua niin kaikki data katoaa. Löysin netistä, että POST pitäisi muuttaa GET muotoon. Vaihdoin tämän, mutta sillä ei ole merkitystä. Nyt kyllä hakudata näkyy ylhäällä, mutta heti kun vaihdan sivua niin data muuttuu muotoon.

http://MyWebSite/searchuser.php?page=2

Yritin tehdä niin, että käytin $_SERVER['HTTP_REFERER'] komentoa, mutta tuo vain sekottaa haun todella tehokkaasti ja ei ollut onnistunut taktiikka. Mikähän on oikea ratkaisu lähestyä tätä?

Metabolix [18.03.2014 18:06:17]

#

Kaikki parametrit pitää tietenkin välittää myös seuraavalle sivulle. Jos palvelimelta pyydetään sivua searchuser.php?page=2, mistä palvelin tietää, mitä käyttäjää pitää hakea? Osoitteeksi pitää siis tulostaa esimerkiksi searchuser.php?hakusana=SANA&page=2.

The Alchemist [18.03.2014 22:11:26]

#

Joskus, kun jostain syystä en käytä reitityksiä vaan räpellän suoraan urleilla, niin käytän silloinkin työtäni helpottamaan kehysluokkaa.

// Url.php
namespace Util;

class Url
{
    private $data;

    public static function current()
    {
        $url = new static('//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
        $url->host = null;
        return $url;
    }

    public static function normalize($url)
    {
        if (empty($url)) {
            return '';
        }

        if (substr($url, 0, 1) == '?') {
            $url = sprintf('%s/%s', explode('?', $_SERVER['REQUEST_URI'])[0], $url);
        } elseif (strpos($url, '://') === false && substr($url, 0, 2) != '//') {
            $url = '//' . $url;
        }

        return $url;
    }

    public function __construct($url = '')
    {
        $this->parse(self::normalize($url));
    }

    public function __toString()
    {
        return $this->compile();
    }

    public function __get($key)
    {
        if (array_key_exists($key, $this->data)) {
            return $this->data[$key];
        }
    }

    public function __set($key, $value)
    {
        if (array_key_exists($key, $this->data)) {
            $this->data[$key] = $value;
        }
    }

    public function get($key, $default = null)
    {
        return isset($this->data['query'][$key]) ? $this->query[$key] : $default;
    }

    public function set($key, $value)
    {
        $this->data['query'][$key] = $value;
        return $this;
    }

    public function del($key)
    {
        unset($this->data['query'][$key]);
    }

    public function compile()
    {
        $url = '';

        if ($this->data['host']) {
            if ($this->data['scheme']) {
                $url .= $this->data['scheme'];
            } else {
                $url .= '//';
            }
            $url .= $this->data['host'];
        }

        if ($this->data['path']) {
            $url .= $this->data['path'];
        }

        if ($query = $this->data['query']) {
            $url .= '?' . http_build_query($query);
        }

        return $url;
    }

    protected function parse($url)
    {
        $defaults = [
            'scheme' => null,
            'host' => null,
            'port' => null,
            'user' => null,
            'pass' => null,
            'path' => null,
            'fragment' => null,
            'query' => [],
        ];

        $data = parse_url($url) + ['query' => ''];
        $data['query'] = $this->parseQuery($data['query']);
        $this->data = $data + $defaults;
    }

    protected function parseQuery($query)
    {
        if (empty($query)) {
            return [];
        }

        $data = [];
        $pairs = explode('&', $query);

        foreach ($pairs as $pair) {
            $d = explode('=', $pair);
            $data[$d[0]] = count($d) > 1 ? $d[1] : null;
        }

        return $data;
    }
}
// Esimerkkejä yllä olevan luokan käytöstä.

require 'Url.php';
use Util\Url;

header('Content-Type: text/plain; charset=utf-8');

$url = new Url('www.google.de/search/?q=my+key+words');
$url->del('q');
$url->set('key', 'value');
$url->host = 'google.fi';
print $url . PHP_EOL;

$url = new Url('?foo=bar');
$url->set('foo', 'xxx');
print $url . PHP_EOL;

$url = Url::current()->set('foo', 'bar');
print $url . PHP_EOL;

Joo, voi olla hieman liian työstetty omiin tarkoituksiin sopivaksi, mutta toisaalta tuollaisella on käytännössä aina pärjännyt. (php 5.4+)

Vastaus

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

Tietoa sivustosta