• User Attivo

    record successivo e record precedente

    Salve, ho sottoposto lo stesso problema in un altro forum abbastanza famoso, tuttavia dopo una settimana non ho avuto risposta.

    Ho questa porzione di codice:

    codice PHP:
    mysql_select_db($database_conn, $conn);
    $query_rsNews = sprintf("SELECT * FROM tblnews WHERE newsTitle = '$newsTitle' ", $colname_rsNews);
    $rsNews = mysql_query($query_rsNews, $conn) or die(mysql_error());
    $row_rsNews = mysql_fetch_assoc($rsNews);
    $totalRows_rsNews = mysql_num_rows($rsNews);

    che poi vado a stampare in questo modo

    codice PHP: echo $row_rsNews['newsTitle'];
    echo $row_rsNews['newsData'];
    echo $row_rsNews['newsCredit'];
    echo $row_rsNews['catID'];
    echo $textnews = utf8_decode ($row_rsNews['newsText']);

    dato il codice illustrato, qualcuno può aiutarmi a creare i link per il record precedente e quello successivo?

    al momento sto provando ad arrangiarmi in questo modo:

    codice PHP:
    <a href="anteprima.php?newsID=<?php $precedente = $row_rsNews['newsID']; echo $precedente - 1; ?>">precedente</a>
    <a href="anteprima.php?newsID=<?php $successivo = $row_rsNews['newsID']; echo $successivo + 1; ?>">successivo</a>

    Tuttavia questo codice ha una serie di problemi:

    1. non funziona in presenza di un newsID inesistente. Poniamo che ho scritto 10 news e ho cancellato dal database la numero 8: se mi trovo nella news con newsID = 7 e faccio 7 + 1, mi invia alla pagina con newsID = 8, che non esiste.
    2. Lo stesso problema si verificherebbe se la news esiste ma io ho deciso di filtrarla tramite un campo di controllo e si trova in stato di bozza (il classico filtro pubblica si/no)

    In sostanza mi servirebbe una qualche funzione che mi controlli innanzitutto l'esistenza della newsID successiva o precedente, in caso negativo mi sommi un'altra volta 1, fino a trovare una newsID esistente.
    Ovviamente tale funzione dovrebbe accorgersi quando la newsID è l'ultima pubblicata, e pertanto non esistono newsID successive (altrimenti continuerebbe ad aggiungermi 1 all'infinito)

    Da dove posso iniziare?


  • User Attivo

    Per trovare il record precedente corretto devi fare una query che chieda il primo record (LIMIT 1) minore di quello che cerchi (con la chiave che cerchi) ordinato in ordine decrescente.

    Per trovare il record successivo corretto devi fare una query che chieda il primo record (LIMIT 1) maggiore di quello che cerchi (con la chiave che cerchi) ordinato in ordine crescente.


  • User Attivo

    @Senamion said:

    Per trovare il record precedente corretto devi fare una query che chieda il primo record (LIMIT 1) minore di quello che cerchi (con la chiave che cerchi) ordinato in ordine decrescente.

    Per trovare il record successivo corretto devi fare una query che chieda il primo record (LIMIT 1) maggiore di quello che cerchi (con la chiave che cerchi) ordinato in ordine crescente.

    premetto che mi trovo molto più a mio agio a adattare il codice creato da altri piuttosto che a crearlo autonomamente (siamo in tanti a fare così, credo) facendo un po' di copia e incolla con il codice già presente nella pagina e leggendo un altro post sul forum ho provato a buttare giù due righe

    [php]
    $query = "SELECT * FROM tblnews WHERE newsID < '$newsID' ORDER BY newsID DESC LIMIT 1";
    $News = mysql_query($query, $conn) or die(mysql_error());
    $row = mysql_fetch_assoc($News);
    $totalRows_rsNews = mysql_num_rows($News);
    echo $row ['newsID'];
    $query2 = "SELECT * FROM tblnews WHERE newsID > '$newsID' ORDER BY newsID ASC LIMIT 1";
    $News2 = mysql_query($query2, $conn) or die(mysql_error());
    $row2 = mysql_fetch_assoc($News2);
    $totalRows_rsNews2 = mysql_num_rows($News2);
    echo $row2 ['newsID'];
    [/php]

    Il bello è che la cosa sembra funzionare.
    Magari ho messo qualche riga di troppo. Qualcuno può aiutarmi a ripulire il tutto?


  • User Attivo

    Bè un po' di pulizia l'ho fatta io (funzionava male)

    Ora funziona bene, tuttavia sono stato costretto a dupplicare le pagine per via del fatto che utilizzando il mod rewrite la funzione get mi passa newsTitle e non newsID (indispensabile per far funzionare il tutto)

    Al momento in testa alla pagina news.php ho il codice:

    [php]
    $newsTitle = ereg_replace('-', ' ', $newsTitle);
    $colname_rsNews = '%';
    if (isset($_GET['newsTitle'])) {
    $colname_rsNews = (get_magic_quotes_gpc()) ? $_GET['newsTitle'] : addslashes($_GET['newsTitle']);
    }

    mysql_select_db($database_conn, $conn);
    $query_rsNews = sprintf("SELECT * FROM tblnews WHERE newsTitle = '$newsTitle' ", $colname_rsNews);
    $rsNews = mysql_query($query_rsNews, $conn) or die(mysql_error());
    $row_rsNews = mysql_fetch_assoc($rsNews);
    $totalRows_rsNews = mysql_num_rows($rsNews);
    [/php]

    mentre su news1.php (quella che viene linkata nel modo news1.php?newsID=XXX) ho il codice

    [php]
    $colname_rsNews = '-1';
    if (isset($_GET['newsID'])) {
    $colname_rsNews = (get_magic_quotes_gpc()) ? $_GET['newsID'] : addslashes($_GET['newsID']);
    }
    mysql_select_db($database_conn, $conn);
    $query_rsNews = sprintf("SELECT * FROM tblnews WHERE newsID = %s", $colname_rsNews);
    $rsNews = mysql_query($query_rsNews, $conn) or die(mysql_error());
    $row_rsNews = mysql_fetch_assoc($rsNews);
    $totalRows_rsNews = mysql_num_rows($rsNews);
    [/php]

    Come posso fare per far funzionare una sola pagina sia che mi vanga passato da link newsTitle o newsID? in pratica dovrei fondere i due codici sopra riportati, ma nonostante abbia fatto numerose prove non riesco ad ottenere quello che voglio.
    Mi dareste una mano?