我正在尝试使用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"
}
答案 0 :(得分:1)
如果foreach()
只包含1个对象,则不需要$sql2['id']
循环。
另外,为什么要制作$value = $sql2['id'];
? $value
循环使用foreach()
变量,它自动将集合的当前对象(在我们的例子中是一个对象的集合)分配给它。更难以理解的是,如果你甚至不使用foreach()
变量,为什么你创建了$value
循环并完成了我之前描述的赋值?
同样在这种情况下$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_*
函数已弃用,you shouldn't use them。
编辑:正如我所看到的那样,你会认真对待事情。你应该使用我给你的第一种技术并以这种方式创建<div>
。如果这对您不起作用,那么您编写错误的SQL查询或数据库设计是错误的。根据你的SQL SELECT
,sql2['id']
中只有一个数字,如果没有,那么你的数据库设计/命名是完全错误的,更不用说如果它不是一个数字而不是某种数字字符串,你不能foreach()
一个裸字符串,等待某种奇迹发生,将产生你想要的整个布局。此时我不得不说,如果我给你的第一个解决方案不起作用,那么你必须重新考虑数据库以及如何从这些表中插入/选择内容的方式,因为我认为你有误解你的能力如何发挥作用。
从while ($row = mysql_fetch_array($result))
获得的每一行应代表一个类别,而类别表的列应代表类别的属性,以及从$row
数组中获取的每个对象。因此,当您从$row
数组中获取值时,应使用属性名称(如果未在SQL查询中重命名该列的名称)将其索引,则应获得单个值。例如,$row['name']
应包含该特定类别的名称,$row['id']
应该是该特定类别的ID。在这些循环中,您无法执行foreach()
循环,除非它们包含"auto,mobile,car"
之类的内容,您必须先explode()
循环它。要重复自己,ID应该是特定类别的特定数字,例如1
,2
,56
或468
它不能包含其他/更多因为在这种情况下你的命名和你对id的概念是错误的。
答案 1 :(得分:0)
我假设您的查询首先返回任何值,但是使用var_dump($ sql1)进行测试;在那条线之后。
此处$sql1
实际上是您的结果集。
如果我理解你正在尝试做什么,那么foreach就不是必要的。您应该将结果排在$sql2
中(尽管不是关联的 - 所以如果您选择不使用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
进行清理