0

phpアプリケーションを変更してページネーションを行うのに問題があります。私のエラーは私の論理にあるようで、私は自分が間違っていることを正確に明確にしていません。以前に発生しましたが、現在、mysql_num_rows()が有効な結果リソースではなく、foreachに無効な引数が指定されているというエラーは発生していません。私のロジックには、mysqlからの結果が返されなくなるという問題があると思います。

whileループのテストを除いて、すべての「テスト」エコーが出力されます。ページは、クエリの名前とオークションという単語、および最初と前のリンクで生成されますが、次と最後のリンクでは生成されません。セルごとにリンクを作成するのではなく、テーブル内の行のリンクを生成するより効率的な方法を指摘できれば幸いです。複数のアイテムを継続的にリンクすることは可能ですか?

<?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);
}

編集:私は何もなかったmysqlエラーを印刷しました。ただし、100を超えるレコードを持つデータベースから、8つの「テスト期間」が出力されます。foreachループに入ることがないので、理由はわかりません。

4

4 に答える 4

1

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

$pg はどのように設定されますか? $_GET から読み取っていないようです。register_globals に依存している場合: そうしないでください。$_GET から読み取って正の整数に解析し、失敗した場合は「1」に戻ります。

<a href='{$_SERVER['PHP_SELF']}?pg=$next'>次 -></a>

ページに必要な他のパラメーター、「クエリ」と「cmd」が失われているようです。

一般的に、コードを読むのは非常に難しいと思います。特に、echo() をインデントなしで使用する場合はそうです。また、htmlspecialchars() を使用せずに文字列を HTML に "...$template..." または .concatenate するたびに、無数の HTML/スクリプト インジェクションの脆弱性があります。

PHP はテンプレート言語です。使用してください。戦わないでください。例えば:

<?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>

複数のアイテムを連続してリンクすることはできますか?

細胞を越えて、いいえ。しかし、とにかくリンクを実際に使用しているわけではありません - それらの '#' アンカーはどこにも行きません。上記の例では、代わりに onclick をテーブルの行に配置しています。アクセシビリティにとってより適切なものは、アプリケーションが何をしようとしているのかによって異なります。

(上記では、PK が実際には数値であると想定しています。他の文字を「id」に入れるのは有効でない可能性があるためです。インラインの「onclick」を削除し、コードを以下のスクリプトに移動することも検討してください。「目立たない」を参照してください)。スクリプト」)

于 2009-02-02T13:25:28.457 に答える
0

これは間違っています:

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

そのはず:

if($cmd=="GetRecordSet") {
    echo "test in loop\n";
于 2009-02-02T13:12:37.873 に答える
0

getRowsByProductSearch関数では、mysql_error発生した場合の結果を返します。コードをデバッグするために、代わりに印刷できるので、問題が何であるかを簡単に確認できます。

于 2009-02-02T13:29:36.110 に答える