如何使用PHP和MySQL以及while和foreach循环?

时间:2013-09-01 00:18:08

标签: php html mysql foreach while-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"
}

2 个答案:

答案 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 SELECTsql2['id']中只有一个数字,如果没有,那么你的数据库设计/命名是完全错误的,更不用说如果它不是一个数字而不是某种数字字符串,你不能foreach()一个裸字符串,等待某种奇迹发生,将产生你想要的整个布局。此时我不得不说,如果我给你的第一个解决方案不起作用,那么你必须重新考虑数据库以及如何从这些表中插入/选择内容的方式,因为我认为你有误解你的能力如何发挥作用。

while ($row = mysql_fetch_array($result))获得的每一行应代表一个类别,而类别表的列应代表类别的属性,以及从$row数组中获取的每个对象。因此,当您从$row数组中获取值时,应使用属性名称(如果未在SQL查询中重命名该列的名称)将其索引,则应获得单个值。例如,$row['name']应包含该特定类别的名称,$row['id']应该是该特定类别的ID。在这些循环中,您无法执行foreach()循环,除非它们包含"auto,mobile,car"之类的内容,您必须先explode()循环它。要重复自己,ID应该是特定类别的特定数字,例如1256468它不能包含其他/更多因为在这种情况下你的命名和你对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

进行清理