Domanda

Ho dei problemi con la modifica di un'applicazione php per avere l'impaginazione. Il mio errore sembra essere nella mia logica e non sono chiaro esattamente cosa sto facendo in modo errato. Ho avuto prima, ma al momento non ricevo errori che mysql_num_rows () non sia una risorsa di risultato valida  e che sono stati forniti argomenti non validi per foreach. Penso che ci sia un problema nella mia logica che sta impedendo la restituzione dei risultati da mysql.

Tutti i miei " test " gli echi vengono emessi tranne il test while loop. Viene generata una pagina con il nome della query e la parola aste e i collegamenti primo e precedente, ma non i collegamenti successivo e ultimo. Le sarei grato se potesse essere indicato un modo più efficiente di generare collegamenti per le righe nella mia tabella, invece di creare un collegamento per cella. È possibile avere un collegamento continuo per più elementi?

<?php
if (isset($_GET["cmd"]))
  $cmd = $_GET["cmd"]; else
die("You should have a 'cmd' parameter in your URL");
$query ='';
if (isset($_GET["query"])) {
    $query = $_GET["query"];
}
if (isset($_GET["pg"]))
{ 
 $pg = $_GET["pg"];
 }
  else $pg = 1;
$con = mysql_connect("localhost","user","password");
echo "test connection<p>";
if(!$con) {
    die('Connection failed because of' .mysql_error());
}
mysql_query('SET NAMES utf8');
mysql_select_db("database",$con);
if($cmd=="GetRecordSet"){
    echo "test in loop<p>"; 
    $table = 'SaleS';
    $page_rows = 10;
    $max = 'limit ' .($pg - 1) * $page_rows .',' .$page_rows;
    $rows = getRowsByProductSearch($query, $table, $max);
    echo "test after query<p>";
    $numRows = mysql_num_rows($rows);
    $last = ceil($rows/$page_rows);
    if ($pg < 1) {
        $pg = 1;
    } elseif ($pg > $last) {
        $pg = $last;
    }
    echo 'html stuff <p>';

    foreach ($rows as $row) {

echo "test foreach <p>";
        $pk = $row['Product_NO'];
        echo '<tr>' . "\n";
        echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
        echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
        echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['Product_NAME'].'</a></td>' . "\n";
        echo '</tr>' . "\n";
    }
    if ($pg == 1) {
    } else {
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=1'> <<-First</a> ";
        echo " ";
        $previous = $pg-1;
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=$previous'> <-Previous</a> ";
    }
    echo "---------------------------";
    if ($pg == $last) {
    } else {
        $next = $pg+1;
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=$next'>Next -></a> ";
        echo " ";
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=$last'>Last ->></a> ";
    }
    echo "</table>\n";
}
echo "</div>";
function getRowsByProductSearch($searchString, $table, $max) {
    $searchString = mysql_real_escape_string($searchString);
    $result = mysql_query("SELECT Product_NO, USERNAME, ACCESSSTARTS, Product_NAME, date_format(mycolumn, '%d %m %Y') as shortDate FROM {$table} WHERE upper(Product_NAME) LIKE '%" . $searchString . "%'" . $max);
    if($result === false) {
        echo mysql_error();
    }
    $rows = array();
    while($row = mysql_fetch_assoc($result)) {
        echo "test while <p>";
        $rows[] = $row;
    }
    return $rows;
    mysql_free_result($result);
}

modifica: ho stampato l'errore mysql di cui non c'era nessuno. Tuttavia 8 & Quot; test whils & Quot; vengono stampati da un database con oltre 100 record. Il ciclo foreach non è mai stato inserito e non sono sicuro del perché.

È stato utile?

Soluzione

Il problema (o almeno uno di questi) è nel codice che dice:

$rows = getRowsByProductSearch($query, $table, $max);
$numRows = mysql_num_rows($rows);

La variabile $ numRows non è un gruppo di risultati MySQL, è solo un normale array restituito da getRowsByProductSearch.

Cambia il codice da leggere:

$rows = getRowsByProductSearch($query, $table, $max);
$numRows = count($rows);

Quindi dovrebbe almeno trovare dei risultati per te.

Buona fortuna, James

Ciao,

Il prossimo problema è con la riga che recita:

$last = ceil($rows/$page_rows);

Dovrebbe essere modificato per leggere:

$last = ceil($numRows / $page_rows);

Consigliamo di aggiungere le seguenti righe all'inizio dello script almeno durante il debug:

ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', 'On');

In quanto ciò avrebbe generato un errore fatale e ti avrebbe risparmiato un sacco di tempo.

Altri suggerimenti

  

if (! (isset ($ pg))) {      $ pg = 1;   }

Come verrà impostato $ pg? Sembra che tu non lo stia leggendo da $ _GET. Se ti affidi a register_globals: non farlo! Prova a leggerlo da $ _GET e analizzalo in un numero intero positivo, ritornando a '1' se fallisce.

  

< a href = '{$ _ SERVER [' PHP_SELF ']}? pg = $ next' > Next - > < / a > ;

Sembra che tu stia perdendo gli altri parametri necessari alla tua pagina, "query" e "cmd".

In generale trovo molto difficile leggere il tuo codice, in particolare l'uso di echo () senza indentazioni. Inoltre hai vulnerabilità HTML / script-injection inalterabili ogni volta che & Quot; ... $ template ... & Quot; o .concatenare una stringa in HTML senza htmlspecialchars () ing.

PHP è un linguaggio esemplare: usalo, non combatterlo! Ad esempio:

<?php
    // Define this to allow us to output HTML-escaped strings painlessly
    //
    function h($s) {
        echo(htmlspecialchars($s), ENT_QUOTES);
    }

    // Get path to self with parameters other than page number
    //
    $myurl= $_SERVER['PHP_SELF'].'?cmd='.urlencode($cmd).'&query='.urlencode($query);
?>

<div id="tableheader" class="tableheader">
    <h1><?php h($query) ?> Sales</h1>
</div>
<div id="tablecontent" class="tablecontent">
    <table border="0" width="100%"> <!-- width, border, cell width maybe better done in CSS -->
        <tr>
            <td width="15%">Seller ID</td>
            <td width="10%">Start Date</td>
            <td width="75%">Description</td>
        </tr>
        <?php foreach ($rows as $row) { ?>
            <tr id="row-<?php h($row['Product_NO']) ?>" onclick="updateByPk('Layer2', this.id.split('-')[1]);">
                <td><?php h($row['USERNAME']); ?></td>
                <td><?php h($row['shortDate']); ?></td>
                <td><?php h($row['Product_NAME']); ?></td>
            </tr>
        <?php } ?>
    </table>
</div>
<div class="pagercontrols">
    <?php if ($pg>1) ?>
        <a href="<?php h($myurl) ?>&amp;pg=1"> &lt;&lt;- First </a>
    <?php } ?>
    <?php if ($pg>2) ?>
        <a href="<?php h($myurl) ?>&amp;pg=<?php h($pg-1) ?>"> &lt;-- Previous </a>
    <?php } ?>
    <?php if ($pg<$last-1) ?>
        <a href="<?php h($myurl) ?>&amp;pg=<?php h($pg+1) ?>"> Next --> </a>
    <?php } ?>
    <?php if ($pg<$last) ?>
        <a href="<?php h($myurl) ?>&amp;pg=<?php h($last) ?>"> Last ->> </a>
    <?php } ?>
</div>
  

È possibile avere un collegamento continuo per più elementi?

Attraverso le celle, no. Ma in realtà non stai usando un link - quelle ancore '#' non vanno da nessuna parte. L'esempio sopra mostra invece il clic sulla riga della tabella. Ciò che è esattamente più appropriato per l'accessibilità dipende da cosa esattamente la tua applicazione sta cercando di fare.

(Sopra anche suppone che il PK sia effettivamente numerico, poiché altri caratteri potrebbero non essere validi per inserire un 'id'. Potresti anche considerare di rimuovere il " onclick " e spostando il codice in uno script qui sotto - vedi " script discreto " ;.)

Questo è sbagliato:

if($cmd=="GetRecordSet")
echo "test in loop\n"; {

Dovrebbe essere:

if($cmd=="GetRecordSet") {
    echo "test in loop\n";

Nella funzione getRowsByProductSearch, si restituisce il risultato di mysql_error se si verifica. Per eseguire il debug del codice, forse è possibile stamparlo, in modo da poter vedere facilmente qual è il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top