繁体   English   中英

如何在while和foreach循环中结合使用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应该是特定类别的特定,唯一的编号,如1256468它不能包含其他/更多的事情,因为在这种情况下你的命名和你对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM