MYSQL - 按 ID 获取下一条和上一条记录 - 超链接的 HTML
Posted
技术标签:
【中文标题】MYSQL - 按 ID 获取下一条和上一条记录 - 超链接的 HTML【英文标题】:MYSQL - Get Next and Previous Record by ID - HTML for hyperlinks 【发布时间】:2012-06-27 00:50:04 【问题描述】:所以我试图通过添加下一个和上一个链接在我的数据库中的记录之间导航来为 CRUD 添加一点便利。
这是我的疑问:
$id=$_GET['id'];
$id = $currentid;
$prevquery= "SELECT * FROM inventory WHERE id < $currentid ORDER BY id DESC LIMIT 1";
$prevresult = mysql_query($prevquery);
$nextquery= "SELECT * FROM inventory WHERE id > $currentid ORDER BY id ASC LIMIT 1";
$nextresult = mysql_query($nextquery);
?>
这是我的 HTML:
<a href="http://www.url.com/crud/edit.php?id=<?php echo $prevresult; ?> ">Previous</a>
<a href="http://www.url.com/crud/edit.php?id=<?php echo $nextresult; ?> ">Next</a>
现在我在 PHPMyAdmin 中测试了这些查询,它们产生了我想要的结果,但我无法让我的超链接实际提供正确的 ID……它们在 = 之后只是空白。我做错了什么?
【问题讨论】:
请不要将mysql_*
函数用于新代码。它们不再维护,社区已经开始deprecation process。看到red box?相反,您应该了解prepared statements 并使用PDO 或MySQLi。如果您不能决定,this article 将帮助您选择。如果你想学习,here is good PDO tutorial.
不应该是$currentid = $id;吗?
【参考方案1】:
mysql_query
() 返回一个结果集(资源)。要从结果集中获取实际行,您需要使用mysql_fetch_row()
之类的函数。
“下一个”链接的代码看起来类似于:
PHP
$nextquery= "SELECT * FROM inventory WHERE id > $currentid ORDER BY id ASC LIMIT 1";
$nextresult = mysql_query($nextquery);
if(mysql_num_rows($nextresult) > 0)
$nextrow = mysql_fetch_row($nextresult);
$nextid = $nextrow['id'];
HTML
<a href="http://www.url.com/crud/edit.php?id=<?php echo $nextid; ?> ">Next</a>
之前的链接也是类似的。
必填:对于新代码,您应该认真考虑使用PDO。
高级说明: 您可以将查询组合成一个查询,例如:
SELECT
(
SELECT id
FROM inventory WHERE id < $currentid ORDER BY id DESC LIMIT 1
) AS previd,
(
SELECT id
FROM inventory WHERE id > $currentid ORDER BY id ASC LIMIT 1
) AS nextid
然后相应地调整逻辑。
【讨论】:
这可能是朝着正确方向迈出的一步,但我的错误日志是:[25-Jun-2012 12:22:47] PHP Warning: Wrong parameter count for mysql_num_rows() in /url/第 144 行的 usr/public_html/crud/edit.php [25-Jun-2012 12:22:47] PHP 警告:第 152 行 /url/usr/public_html/crud/edit.php 中 mysql_num_rows() 的参数计数错误 是的,你必须将结果资源传递给它,尝试更新的代码。 现在得到:PHP 警告:mysql_num_rows():提供的参数在....中不是有效的 MySQL 结果资源。 这意味着有一个错误 -- 在mysql_query()
行之后添加 print_r(mysql_error());
并查看它的内容。
您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“ORDER BY id ASC LIMIT 1”附近使用正确的语法【参考方案2】:
好吧,花了一点时间,但我想通了......
PHP
$prevquery= "SELECT * FROM inventory WHERE id < $currentid ORDER BY id DESC LIMIT 1";
$prevresult = mysql_query($prevquery) or die(mysql_error());
while($prevrow = mysql_fetch_array($prevresult))
$previd = $prevrow['id'];
$nextquery= "SELECT * FROM inventory WHERE id > $currentid ORDER BY id ASC LIMIT 1";
$nextresult = mysql_query($nextquery) or die(mysql_error());
while($nextrow = mysql_fetch_array($nextresult))
$nextid = $nextrow['id'];
HTML
<a href="http://www.theantiquarium.com/crud/edit.php?id=<?php echo $previd; ?>">Previous</a>
<a href="http://www.theantiquarium.com/crud/edit.php?id=<?php echo $nextid; ?>">Next</a>
感谢您的帮助,我认为这让我走上了正确的道路。我会在未来研究 PDO 的东西。我刚刚开始掌握旧的 MYSQL/PHP 语法,现在突然出现了一种新格式……很难跟上这一切!
【讨论】:
由于您将结果集的大小限制为 1,因此您不需要 while 循环,但是它会隐藏查询返回结果集时发生的错误大小为 0。这对您来说可能并不重要,因为您仍在学习,但您至少应该了解为什么 while 循环是不必要的(并且可能会引入错误)。无论如何,恭喜它开始工作!【参考方案3】:生成的代码在表格的开头和结尾都有罪魁祸首。您的代码将按照您的要求“死亡”。相反,您可以检查查询结果($prevresult、$nextresult)并决定不显示上一个或下一个项目的链接。
【讨论】:
【参考方案4】:选择 如果空( (SELECT id FROM inventory WHERE id $currentid ORDER BY id ASC LIMIT 1 ), (SELECT id FROM inventory ORDER BY id ASC LIMIT 1 ) ) 作为下一个ID
【讨论】:
以上是关于MYSQL - 按 ID 获取下一条和上一条记录 - 超链接的 HTML的主要内容,如果未能解决你的问题,请参考以下文章