2009-02-02 64 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的结果。为了调试代码,也许你可以打印它,所以你可以很容易地看到问题是什么。