
[英]cannot use while loop instead of foreach loop for pagination php mysql
[英]How to use PHP and MySQL together with a while and a foreach loop?
我正在尝试使用PHP和MySQL自动更新"Products"
页面。 我使用MySQL存储产品的ID,产品名称,价格,数量等。我需要帮助PHP获取MySQL数据并将每个ID放入具有特定类的<div>
。
我认为我需要一个while()
循环来获取数据数组,并且需要一个foreach()
循环来获取ID的每个实例,但是我没有正确使用foreach()
循环。
请原谅我的编码混乱。 在寻找更有效的做事方法之前,我试图将所有概念都付诸实践。 请注意, sql2['id']
包含多个项。
<?php
mysql_connect('localhost', 'user', 'password');
mysql_select_db('store');
$sql1 = mysql_query('
SELECT c.id,
c.name,
c.description,
c.price,
c.quantity,
c.itemid,
c.imgname,
c.position,
(SELECT Count(t.id)
FROM topics AS t
WHERE t.parent = c.id
AND t.id2 = 1) AS topics,
(SELECT Count(t2.id)
FROM topics AS t2
WHERE t2.parent = c.id
AND t2.id2 != 1) AS replies
FROM categories AS c
GROUP BY c.id
ORDER BY c.position ASC
');
if($sql1 === false){
die(mysql_error());
}
while($sql2 = mysql_fetch_array($sql1)){
foreach($sql2['id'] as $value){?>
<div class="itemInset">
<p><?php echo $sql2['name']; ?></p>
<img src="admin/image/<?php echo $sql2['imgName']; ?>" alt="<?php echo $sql2['imgName']; ?>" />
</div><?php
}
}
?>
类别SQL:
CREATE TABLE IF NOT EXISTS `categories` (
`id` smallint(6) NOT NULL,
`name` varchar(256) NOT NULL,
`description` text NOT NULL,
`price` text NOT NULL,
`quantity` int(10) NOT NULL,
`itemID` text NOT NULL,
`cC` text NOT NULL,
`imgName` text NOT NULL,
`position` smallint(6) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
还有var_dump()
:
array(20) {
[0]=>
string(1) "1"
["id"]=>
string(1) "1"
[1]=>
string(9) "PC"
["name"]=>
string(9) "PC"
[2]=>
string(58) "computer "
["description"]=>
string(58) "computer "
[3]=>
string(6) "150.00"
["price"]=>
string(6) "150.00"
[4]=>
string(4) "1000"
["quantity"]=>
string(4) "1000"
[5]=>
string(8) "PCR-1000"
["itemID"]=>
string(8) "PCR-1000"
[6]=>
string(0) ""
["imgName"]=>
string(0) ""
[7]=>
string(1) "1"
["position"]=>
string(1) "1"
[8]=>
string(1) "0"
["topics"]=>
string(1) "0"
[9]=>
string(1) "0"
["replies"]=>
string(1) "0"
}
如果$sql2['id']
仅包含1个对象,则不需要foreach()
循环。
还有为什么你要使$value = $sql2['id'];
? $value
变量由foreach()
循环使用,该循环会自动为其分配集合的当前对象(在本例中为一个对象的集合)。 如果您甚至不使用$value
变量,那么为什么创建了foreach()
循环并完成了前面所述的赋值,这加剧了不可理解性?
同样在这种情况下, $sql2
命名非常容易引起误解,因为该对象不代表与SQL相关的事物。
如果查看mysql-fetch-array()文档,则会看到一些示例以及应如何使用它。 还要注意变量的命名! 您的代码应如下所示:
$result = mysql_query('
SELECT c.id,
c.name,
c.description,
c.price,
c.quantity,
c.itemid,
c.imgname,
c.position,
(SELECT Count(t.id)
FROM topics AS t
WHERE t.parent = c.id
AND t.id2 = 1) AS topics,
(SELECT Count(t2.id)
FROM topics AS t2
WHERE t2.parent = c.id
AND t2.id2 != 1) AS replies
FROM categories AS c
GROUP BY c.id
ORDER BY c.position ASC
');
while ($row = mysql_fetch_array($result)) {?>
<div class="itemInset">
<p><?php echo $row['name']; ?></p>
<img src="admin/image/<?php echo $row['imgName']; ?>" alt="<?php echo $row['imgName']; ?>">
</div>
<?php } ?>
请注意,不推荐使用mysql_*
函数, 您不应使用它们 。
编辑:据我所知,您确实在做/认为事情真的很糟糕。 您应该使用我给您的第一种技术,并以这种方式创建<div>
。 如果这对您不起作用,则表示您编写了错误的SQL查询,或者您的数据库设计错误。 根据您的SQL SELECT
,如果不是,则sql2['id']
应该只有一个数字,这比您的数据库设计/命名完全错误,更不用说如果它不是数字,而是某种字符串,并且您不能foreach()
裸字符串,而要等待某种奇迹的发生,这将生成您想要的整个布局。 在这一点上,我不得不说,如果我给您的第一个解决方案没有用,那么您就必须重新考虑数据库以及如何从这些表中插入/选择内容的方式,因为我认为您对以下内容有误解您应该如何工作。
您从while ($row = mysql_fetch_array($result))
获得的每一行应代表一个类别,并且您的Categories表的列应代表一个类别的属性,以及从$row
数组中获得的每个对象。 因此,当您从$row
数组中获取一个值时,应使用属性名称(如果未在SQL查询中重命名该列的名称)对其进行索引,则应该获得一个值。 例如, $row['name']
应该包含该特定类别的名称, $row['id']
应该是该特定类别的ID。 您不能在其中使用foreach()
循环执行任何操作,除非它们包含诸如"auto,mobile,car"
,而您必须先对其进行explode()
才能使其循环。 并重复自己的ID应该是特定类别的特定,唯一的编号,如1
, 2
, 56
或468
它不能包含其他/更多的事情,因为在这种情况下你的命名和你对ID的概念是错误的。
我在这里假设您的查询首先返回任何值,但请使用var_dump($ sql1);进行测试。 在那条线之后。
在这里,您的$sql1
实际上是您的结果集。
如果我了解您要执行的操作,则不需要进行foreach。 您应该将结果行放在$sql2
(尽管不是关联的-因此,如果您选择不使用mysql_fetch_assoc()
(或mysql_fetch_assoc()
或mysql_fetch_array($resultset, MYSQL_ASSOC)
方法,则必须使用$ sql2 [0])。
然后,您应该使用while循环询问结果集是否连续。
$results = mysql_query('...SELECT STUFF....');
// i.e. dear results, please assign a row of your data to the variable $row
while ( $row = mysql_fetch_assoc($results) ) {
echo $row['id']; // and so on
}
PHP手册中有一些很好的示例,应该使用mysql_fetch_assoc清除
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.