1

我正在为 MySQL 数据库制作 PHP 前端。我有一个名为“Regions”的表,其中包含 RegionID (int)、Name (string) 和 Country (string)。我正在尝试将 <select> 列表放入包含所有区域作为选项的表单上,使用 <optgroup> 来按国家/地区对区域进行分组。我已经通过嵌套的普通查询成功地完成了它,现在我正试图了解准备好的语句。

到目前为止,我得到的是:

// $DB is database object, already connected
// Error checking will be worked into this once I've worked out the basics...

$stmt_country = $DB->stmt_init();
$stmt_country->prepare("SELECT DISTINCT Country FROM Regions ORDER BY Country ASC");
$stmt_country->execute();
$stmt_country->bind_result($CountryName);

$stmt_region = $DB->stmt_init();
$stmt_region->prepare("SELECT RegionID,Name FROM REGIONS WHERE Country=? ORDER BY Name ASC");
$stmt_region->bind_param("s",$CountryName);

echo "<select name=\"RegionID\">\n";

while ($stmt_country->fetch()) {
    // Start 'country' option group

    echo "<optgroup label=\"$CountryName\">\n";

    // Execute the 'regions' query using the 'country' parameter

    $stmt_region->execute();
    $stmt_region->bind_result($RegionID,$RegionName);

    while ($stmt_region->fetch()) {
        // Output the regions matching that country 

        echo "<option value=\"$RegionID\">$RegionName</option>\n";
        }

    echo "</optgroup>\n";
    }

echo "</select>\n";

但是,当我运行它时,我得到:

Warning: mysqli_stmt::bind_param(): invalid object or resource

$stmt_region->bind_param("s",$CountryName)线。

通过对代码进行一些注释,我只得到了$stmt_country一半的工作(即只输出每个国家的 optgroups),然后以 的值为$CountryName,它的$stmt_region一半自己工作,但我无法得到两半一起工作。有人可以告诉我哪里出错了吗?

4

1 回答 1

0

我很确定在您完成整个结果集之前,您不能将 2 个语句绑定在同一个连接资源上。因此,您的第二个stmt_init()实际上并未返回声明。

看起来所有数据都在同一个表上,因此不需要 2 个查询。

如果数据在两个表上,那么仍然不需要 2 个查询,因为 oyu 可以使用连接:

即使不是这种情况,您也可以做并且应该做的是使用连接来一次获取所有内容:

SELECT DISTINCT r.RegionID, r.Country 
FROM Regions r, Country c
WHERE c.NAME = r.Country 
ORDER BY r.Country ASC

无论哪种情况,您都可以获得如下所示的结果集:

RegionID    Country    Name
----------------------------------
1           US         Ohio
2           US         California
3           US         New York
4           CN         Guan Dong
5           CN         Hunan
6           CN         Szechuan

由于排序,您可以使用单个循环将前一个循环与Country当前循环进行比较,以确定何时关闭/打开您的 opt 组标签。

于 2012-06-08T23:36:59.437 回答