我在修改php应用程序以进行分页时遇到问题。我的错误似乎与我的逻辑有关,我不清楚我到底做错了什么。我以前有,但目前没有得到mysql_num_rows()无效结果资源的错误 并且向foreach提供了无效的参数。我认为我的逻辑中存在一个问题,即停止返回mysql的结果。
除了测试循环外,我的所有“测试”回声都是输出。生成一个页面,其中包含查询名称和单词拍卖,以及第一个和上一个链接,但不包括下一个和最后一个链接。如果能够指出为表中的行生成链接的更有效方法,而不是为每个单元格建立链接,我将不胜感激。是否可以为多个项目建立连续的链接?
<?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 :(得分:1)
if(!(isset($ pg))){ $ pg = 1; }
如何设置$ pg?您似乎没有从$ _GET中读取它。如果你依赖register_globals:不要那样做!尝试从$ _GET中读取它并将其解析为正整数,如果失败则回退到'1'。
&lt; a href ='{$ _ SERVER ['PHP_SELF']}?pg = $ next'&gt; Next - &gt;&lt; / a&gt;
您似乎正在丢失网页所需的其他参数,'query'和'cmd'。
一般来说,我发现很难读取你的代码,特别是使用echo()的无缩进。每当你“... $ template ...”或.concatenate一个字符串到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) ?>&pg=1"> <<- First </a>
<?php } ?>
<?php if ($pg>2) ?>
<a href="<?php h($myurl) ?>&pg=<?php h($pg-1) ?>"> <-- Previous </a>
<?php } ?>
<?php if ($pg<$last-1) ?>
<a href="<?php h($myurl) ?>&pg=<?php h($pg+1) ?>"> Next --> </a>
<?php } ?>
<?php if ($pg<$last) ?>
<a href="<?php h($myurl) ?>&pg=<?php h($last) ?>"> Last ->> </a>
<?php } ?>
</div>
是否可以为多个项目建立连续链接?
跨细胞,没有。但是你还没有真正使用链接 - 那些'#'锚点不会去任何地方。上面的示例将onclick放在表行上。什么更适合可访问性取决于您的应用程序正在尝试做什么。
(上面还假设PK实际上是数字,因为其他字符可能无法放入'id'。您可能还需要考虑删除内联“onclick”并将代码移动到下面的脚本 - 请参阅“不引人注目的脚本”。)
答案 1 :(得分: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');
因为这会引发致命错误并为你节省了大量时间。
答案 2 :(得分:0)
这是错误的:
if($cmd=="GetRecordSet")
echo "test in loop\n"; {
应该是:
if($cmd=="GetRecordSet") {
echo "test in loop\n";
答案 3 :(得分:0)
在getRowsByProductSearch
函数中,如果出现,则返回mysql_error
的结果。为了调试代码,也许您可以打印它,这样您就可以轻松地看到问题所在。