• User

    php e access - paginazione dati

    Ho questa pagina che mi fa una query:

    [php]

    <?php

    $odbc_dns = "db_forum";
    $odbc_userid = "";
    $odbc_password = "";

    $query = "SELECT ID,Titolo
    FROM Forum";

    if ( !( $odbc_db = odbc_connect($odbc_dns, $odbc_userid, $odbc_password) ) )
    die("Could not connect to ODBC data source $odbc_dns");

    if ( !( $odbc_rs = odbc_do($odbc_db, $query) ) )
    die("Error executing query $query");

    $num_cols = odbc_num_fields($odbc_rs);
    if ($num_cols < 1)
    die("Query retured an empty set");

    echo "<TABLE>";

    echo("<TR>");
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TH><B>
    <font face='Arno Pro Light Display' size='5'>";
    echo odbc_field_name($odbc_rs, $a);
    echo "</TH></B></font>";
    }
    echo "</TR>";

    while( odbc_fetch_row($odbc_rs) )
    {
    echo "<TR>";
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TD>
    <font face='Arno Pro Light Display' size='4'>";
    echo odbc_result($odbc_rs, $a);
    echo "</TD>";
    }
    echo "<TD><input type='radio' name=titoloforum value=".odbc_result($odbc_rs, "Id")."></TD></TR>";
    }

    echo "</TABLE>";

    ?> [/php]Vorrei mettere i risultati di questa query in più pagine se nella tabella c sn più di un certo numero di valori. Come devo modificare questa pagina?

    Grazie mille.


  • User Attivo

    Visto che usi Access non puoi usare LIMIT come in MySQL.
    Prova in questo modo:

    [php]
    $num_of_val = 10;
    $start_val = 4;
    $query = "SELECT TOP $num_of_val ID, Titolo FROM Forum
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID)))
    ORDER BY ID";
    [/php]

    La query dovrebbe ritornare 10 ($num_of_val) valori partendo dal 5 ($start_val + 1) record.
    Il valore di partenza ($start_val) può essere passato di pagina in pagina attraverso un GET oppure variabili di sessione.

    Ciao!


  • User

    Non ho capito solo una cosa : per ogni pagina che mi serve devo fare una pagina php???

    Se io per esempio ho 40 records nella tabella e voglio che in ogni pagina me ne vengano visualizzati 10, devo fare 4 pagine php diverse???


  • User Attivo

    No, utilizzi sempre la stessa pagina per visualizzare i dati.
    Se per esempio hai la pagina "demo.php" fatta in questo modo:

    [php]
    $p = @$_GET["p"];
    //...
    $num_of_val = 10;
    $start_val = $p - 1;
    $query = "SELECT TOP $num_of_val ID, Titolo FROM Forum
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID)))
    ORDER BY ID";
    //...
    $next_link = $p + $num_of_val
    echo "<a href="demo.php?p=$next_link">Prossima pagina</a>";
    [/php]Verranno fuori link del tipo:
    demo.php?p=5
    demo.php?p=15
    demo.php?p=25

    P.S: Non utilizzare abbreviazioni like SMS nei post.


  • User

    Scusa la mia ignoranza, ma potresti aggiungermi il codice che mi hai consigliato nel codice che avevo inserito io prima??? Perchè mi perdo proprio... sono alle prime armi e quindi non so dove mettere mano.

    Grazie mille per la disponibilità.


  • User Attivo

    Così:

    [php]
    <?php
    $p = @$_GET["p"];

    if(($p == "")||($p <= 0))
    $p = 1;

    $odbc_dns = "db_forum";
    $odbc_userid = "";
    $odbc_password = "";

    $num_of_val = 10;
    $start_val = $p - 1;
    $query = "SELECT TOP $num_of_val ID, Titolo FROM Forum
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID)))
    ORDER BY ID";

    if ( !( $odbc_db = odbc_connect($odbc_dns, $odbc_userid, $odbc_password) ) )
    die("Could not connect to ODBC data source $odbc_dns");

    if ( !( $odbc_rs = odbc_do($odbc_db, $query) ) )
    die("Error executing query $query");

    $num_cols = odbc_num_fields($odbc_rs);
    if ($num_cols < 1)
    die("Query retured an empty set");

    echo "<TABLE>";

    echo("<TR>");
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TH><B>
    <font face='Arno Pro Light Display' size='5'>";
    echo odbc_field_name($odbc_rs, $a);
    echo "</TH></B></font>";
    }
    echo "</TR>";

    while( odbc_fetch_row($odbc_rs) )
    {
    echo "<TR>";
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TD>
    <font face='Arno Pro Light Display' size='4'>";
    echo odbc_result($odbc_rs, $a);
    echo "</TD>";
    }
    echo "<TD><input type='radio' name=titoloforum value=".odbc_result($odbc_rs, "Id")."></TD></TR>";
    }

    echo "</TABLE>";

    $next_link = $p + $num_of_val
    echo "<br><br><a href="NOME_PAGINA.php?p=$next_link">Record Successivi</a>";

    ?>
    [/php]


  • User

    Purtroppo mi da quest'errore:

    Parse error: parse error, unexpected T_ECHO in c:\programmi\easyphp1-7\www\mancini3_private\elencoforum.php on line **71

    **Un'altra cosa: da questa pagina,_tramite un form mi dovrebbe andare ad un'altra pagina.

    <a href="NOME_PAGINA.php?p=$next_link">Record Successivi</a>";

    Che è??? Al posto di nome pagina che dovrei inserire???_Questa è tutta la pagina per intero:[php]
    <html>

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    </head>

    <body background="../images/sfondo.jpg">
    <p align="right">
    <font face="Arno Pro Light Display" size="3"><a href="logout.php">Logout</a></font></p>
    <p align="center">
    <img border="0" src="../images/ForumSystem.gif" width="700" height="150"></p>

    <p><font size="6" face="Algerian">ELENCO FORUM</font></p>

    <form action="elencodiscussioni.php" method="post">
    <?php
    $p = @$_GET["p"];

    if(($p == "")||($p <= 0))
    $p = 1;

    $odbc_dns = "db_forum";
    $odbc_userid = "";
    $odbc_password = "";

    $num_of_val = 10;
    $start_val = $p - 1;
    $query = "SELECT TOP $num_of_val ID, Titolo FROM Forum
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID)))
    ORDER BY ID";

    if ( !( $odbc_db = odbc_connect($odbc_dns, $odbc_userid, $odbc_password) ) )
    die("Could not connect to ODBC data source $odbc_dns");

    if ( !( $odbc_rs = odbc_do($odbc_db, $query) ) )
    die("Error executing query $query");

    $num_cols = odbc_num_fields($odbc_rs);
    if ($num_cols < 1)
    die("Query retured an empty set");

    echo "<TABLE>";

    echo("<TR>");
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TH><B>
    <font face='Arno Pro Light Display' size='5'>";
    echo odbc_field_name($odbc_rs, $a);
    echo "</TH></B></font>";
    }
    echo "</TR>";

    while( odbc_fetch_row($odbc_rs) )
    {
    echo "<TR>";
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TD>
    <font face='Arno Pro Light Display' size='4'>";
    echo odbc_result($odbc_rs, $a);
    echo "</TD>";
    }
    echo "<TD><input type='radio' name=titoloforum value=".odbc_result($odbc_rs, "Id")."></TD></TR>";
    }

    echo "</TABLE>";

    $next_link = $p + $num_of_val
    echo "<br><br><a href="NOME_PAGINA.php?p=$next_link">Record Successivi</a>";

    ?>
    <input type="submit" name="submit" value="Continua"> </td>
    <td width="307">
    </tr>
    </table></form>

    <p align="center"><a href="menuamministratore.php">
    <font size="3" face="Arno Pro Light Display"><strong>Menù Amministratore</strong></font></a></p>

    <p align="center"><a href="gestioneforum.php">
    <font size="3" face="Arno Pro Light Display"><strong>Indietro</strong></font></a></p>

    </body>

    </html>

    [/php]


  • User Attivo

    Per l'errore, nella linea 70 ho dimenticato ;
    Metti:

    $next_link = $p + $num_of_val;

    Invece, NOME_PAGINA.php va stostituito col vero nome del file che contiene il codice php che, visto dal messaggio di errore, si chiama elencoforum.php

    echo "<br><br><a href="elencoforum.php?p=$next_link">Record Successivi</a>"


  • User

    L'ho modificata come mi hai detto tu ma mi esce questo errore:

    Warning: odbc_do(): SQL error: [Microsoft][Driver ODBC Microsoft Access] Errore di sintassi. nell'espressione della query '(((ID) NOT IN (SELECT TOP 0 ID FROM Forum ORDER BY ID)))'., SQL state 37000 in SQLExecDirect in c:\programmi\easyphp1-7\www\mancini3_private\elencoforum.php on line 35
    Error executing query SELECT TOP 10 ID, Titolo FROM Forum WHERE (((ID) NOT IN (SELECT TOP 0 ID FROM Forum ORDER BY ID))) ORDER BY ID


  • User Attivo

    Non si può fare SELECT TOP 0 ..., puoi farlo partire da 1 in poi.
    Per i primi 10 risultati basta solo la query

    SELECT TOP 10 ID, Titolo FROM Forum

    Modifica il codice in questo modo:

    [php]
    $num_of_val = 10;

    if(($p == "")||($p <= 0))
    {
    $query = "SELECT TOP $num_of_val ID, Titolo FROM Forum";
    $p = 1;
    }
    else
    {
    $start_val = $p - 1;
    $query = "SELECT TOP $num_of_val ID, Titolo FROM Forum
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID)))
    ORDER BY ID";
    }
    [/php]


  • User

    Se tolgo lo 0 mi funziona ma non mi prende il primo valore della tabella...


  • User Attivo

    Non funziona la modifica che ti ho proposto?


  • User

    Risolto... grazie mille... ho anche modificato la pagina inserendo anche la pagina precedente...

    Grazie mille della disponibilità...


  • User

    Un'altra domanda... è giusta come sintassi questa query???

    [php]
    $query = "SELECT TOP $num_of_val ID, Titolo
    FROM Discussione
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID))) AND
    ID_Forum = " . $titoloforum . "
    [/php]E' lo stesso problema di prima,solo che quando clicco su pagina precedente o successiva mi da errore perchè non mi prende il valore $titoloforum.


  • User Attivo

    Convertila in questo modo, utilizzando gli apici per contenere il valore:

    [php]
    $query = "SELECT TOP $num_of_val ID, Titolo
    FROM Discussione
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID))) AND
    ID_Forum = '" . $titoloforum . "'";
    [/php]


  • User

    Se la converto come mi hai consigliato mi esce errore, mentre se la lascio come avevo scritto in precedenza quando clicco su pagina successiva mi ritorna quest'errore:

    Notice: Undefined index: titoloforum in c:\programmi\easyphp1-7\www\mancini3_private\elencodiscussioni.php on line 24

    Warning: odbc_do(): SQL error: [Microsoft][Driver ODBC Microsoft Access] Errore di sintassi (operatore mancante) nell'espressione della query '(((ID) NOT IN (SELECT TOP 11 ID FROM Forum ORDER BY ID))) AND ID_Forum ='., SQL state 37000 in SQLExecDirect in c:\programmi\easyphp1-7\www\mancini3_private\elencodiscussioni.php on line 42
    Error executing query SELECT TOP 10 ID, Titolo FROM Discussione WHERE (((ID) NOT IN (SELECT TOP 11 ID FROM Forum ORDER BY ID))) AND ID_Forum = ORDER BY ID


  • User Attivo

    Dall'errore si vede che $titoloforum non è stato definito, quindi contine un valore vuoto e non è possibile fare una query sul nulla se non usi apici.

    Questo è un errore: ... AND ID_Forum = ORDER BY ID
    che dovrebbe essere riscritto in questo modo ... AND ID_Forum = ' ' ORDER BY ID.

    Controlla bene dove viene definita $titoloforum, cioè dove c'è l'assegnazione del valore:

    $titoloforum = ... ;


  • User

    Questo è il codice della mia pagina, quando clicco su precedente o successiva mi da quell'errore...

    [php]
    <?php

    $odbc_dns = "db_forum";
    $odbc_userid = "";
    $odbc_password = "";

    $titoloforum = $HTTP_POST_VARS["titoloforum"];

    $p = @$_GET["p"];

    if(($p == "")||($p <= 0))
    $p = 1;

    $num_of_val = 10;
    $start_val = $p;
    $query = "SELECT TOP $num_of_val ID, Titolo
    FROM Discussione
    WHERE (((ID) NOT IN (SELECT TOP $start_val ID FROM Forum ORDER BY ID))) AND
    ID_Forum = " . $titoloforum . "
    ORDER BY ID";

    if ( !( $odbc_db = odbc_connect($odbc_dns, $odbc_userid, $odbc_password) ) )
    die("Could not connect to ODBC data source $odbc_dns");

    if ( !( $odbc_rs = odbc_do($odbc_db, $query) ) )
    die("Error executing query $query");

    $num_cols = odbc_num_fields($odbc_rs);
    if ($num_cols < 1)
    die("Query retured an empty set");

    echo "<TABLE>";

    echo("<TR>");
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TH><B>
    <font face='Arno Pro Light Display' size='5'>";
    echo odbc_field_name($odbc_rs, $a);
    echo "</TH></B></font>";
    }
    echo "</TR>";

    while( odbc_fetch_row($odbc_rs) )
    {
    echo "<TR>";
    for($a = 1; $a <= $num_cols; $a++)
    {
    echo "<TD>
    <font face='Arno Pro Light Display' size='4'>";
    echo odbc_result($odbc_rs, $a);
    echo "</TD>";
    }
    echo "<TD><input type='radio' name='titolodiscussione' value=".odbc_result($odbc_rs, "Id")."></TD></TR>";
    }

    echo "</TABLE>";

    $next_link_prec = $p - $num_of_val;
    echo "<br><br><a href="elencodiscussioni.php?p=$next_link_prec">Pagina Precedente</a>";

    $next_link_succ = $p + $num_of_val;
    echo "<br><br><a href="elencodiscussioni.php?p=$next_link_succ">Pagina Successiva</a>";

    ?>

    [/php]


  • User Attivo

    Sostituisci

    $titoloforum = $HTTP_POST_VARS["titoloforum"];

    con

    $titoloforum = $_POST["titoloforum"];


  • User

    Niente,_mi da lo stesso errore.