0

我正在尝试使用 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"
}
4

2 回答 2

1

如果仅包含 1 个对象,则您的foreach()循环是不必要的。$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_*函数已被弃用,您不应使用它们

编辑:正如我所见,你做/想的事情真的很糟糕。您应该使用我给您的第一种技术并以<div>这种方式创建 s。如果这对您不起作用,则说明您编写了错误的 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 的概念是错误的。

于 2013-09-01T00:46:17.060 回答
0

我在这里假设您的查询首先返回任何值,但请使用 var_dump($sql1); 进行测试。在那条线之后。

这里你$sql1实际上是你的结果集。

如果我理解你想要做什么,那么 foreach 应该是没有必要的。你应该有你的结果行$sql2(尽管不是关联的 - 所以你必须使用 $sql2[0],如果你选择不使用mysql_fetch_assoc() (或mysql_fetch_array($resultset, MYSQL_ASSOC)方法)。

然后,您应该使用您的 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进行清理

于 2013-09-01T00:45:28.740 回答