2009-02-02 62 views
0

我在修改php應用程序有分頁時遇到了問題。我的錯誤似乎與我的邏輯有關,而且我不清楚我做錯了什麼。我以前有過,但目前沒有收到mysql_num_rows()無效結果資源 的錯誤,並且提供了無效參數給foreach。我認爲在我的邏輯中存在一個問題,它會阻止mysql返回的結果。php和mysql沒有顯示數據,沒有進入foreach循環

我所有的「測試」回聲都是輸出,除了循環測試。使用查詢名稱和詞拍賣以及第一個和上一個鏈接生成頁面,但不會生成下一個和最後一個鏈接。如果可以指出一個更有效的方式來生成表格中的行的鏈接,而不是每個單元格都建立鏈接,我將不勝感激。是否有可能有多個項目的連續鏈接?

<?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循環從來沒有被入侵過,我不確定爲什麼。

+0

你的代碼在很多方面都被破壞了。請查看SQL注入和HTML實體等主題(提示:如果您希望顯示字面意思是「<」,則幾乎肯定需要寫<代替)。除此之外,請嘗試將您的問題修剪至要點。刪除評論和無關代碼 – phihag 2009-02-02 12:59:00

+0

這與我的問題無關。我正在將我所有的代碼轉換爲mysqli來解決這個問題。我不知道什麼代碼導致了中斷,所以我不知道要刪除什麼。 – 2009-02-02 13:07:20

+0

如果它從不運行foreach,那麼它可能意味着$行是空的,也許呢?也許getRowsByProductSearch不是你所期望的? – Ben 2009-02-02 19:32:36

回答

1

的問題(或至少其中之一)是在讀取的代碼:

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

的$ numRows行變量不是一個MySQL結果集,它只是由getRowsByProductSearch返回正常陣列。

更改代碼如下:

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

那麼它至少應該找到一些結果你。

祝你好運,詹姆斯

您好,

下一個問題是讀取行:

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

應改爲:

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

建議至少在調試時將以下行添加到腳本的開頭:

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

因爲這會引發致命的錯誤,併爲您節省了大量的時間。

0

這是錯誤的:

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

它應該是:(!(isset($ PG)))

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

如果{$ PG = 1; }

$ pg如何設置?您似乎沒有從$ _GET中讀取它。如果你依賴register_globals:不要這樣做!嘗試從$ _GET中讀取它,並將其解析爲正整數,如果失敗則回落到'1'。

< A HREF = '{$ _ SERVER [' PHP_SELF ']} PG = $下?'>下一步 - > </A>

你似乎失去了其他參數的頁面需要'查詢'和'cmd'。

一般來說,我發現讀取代碼非常困難,特別是無縮進使用echo()。此外,每當您「... $ template ...」或者將一個字符串連接到HTML而沒有使用htmlspecialchars()時,您都會遇到數不勝數的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」並將代碼移動到下面的腳本 - 請參閱「不顯眼的腳本」。)

0

在您的getRowsByProductSearch函數中,如果它發生,則返回mysql_error的結果。爲了調試代碼,也許你可以打印它,所以你可以很容易地看到問題是什麼。