2011-11-20 98 views
-1

所以我有db table>“schools”,并在这个表中名为“metro”的列。 在“地铁”我有这样的字符串“站名1,站名称2,站名5”为什么array_unique不能和explode()一起工作?

我现在做有选择地铁站搜索表单,所以我的代码看起来是这样的:

<select name="categoryID"> 
<? 

$metro_sql=mysql_query("SELECT metro FROM schools"); 
while($metro=mysql_fetch_array($metro_sql)){ 
    $metro_pieces = explode(", ", $metro['metro']); 
     foreach (array_unique($metro_pieces, SORT_REGULAR) as $metro_all) { 
      echo "<option value=\"".$metro_all."\">".$metro_all."</option>\n "; 
    } 
} 

而结果: 地铁站1 地铁站2 地铁站3 地铁站1 地铁站4 地铁站5 等 我做错了什么? p.s.对不起我的英语不好。

+1

最有可能的问题是在字段值空间,使他们非唯一 –

+0

无关你的问题,但如果你的数据是更加正常化的,你不必像这样处理它。将逗号分隔的数据存储在关系数据库中几乎总是一个坏主意。 – Corbin

回答

1

我会提出一个更好的数据库设计。

CREATE TABLE school (
    school_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) 
); 

CREATE TABLE station (
    station_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(255) 
); 

CREATE TABLE metro (
    school_id INT NOT NULL, 
    station_id INT NOT NULL, 
    UNIQUE INDEX (school_id, station_id) 
); 

您创建school学校和站station。当您需要将学校链接到一个电台时,您将添加一条记录到metro。这使得database normalized

当你再需要获得站,你只需做一次:

SELECT station.* 
FROM metro 
INNER JOIN station 
ON metro.station_id = station.station_id 
WHERE metro.school_id = $school_id 
+0

是的,这比我更好,但是,不幸的是,我已经写了一个代码来查看,编辑和更新学校信息的表单。我需要花很多时间来重写所有这些。 – user1056252

+0

稍后需要修复时,需要更多时间。设计时更容易解决问题,编码时更难以解决问题,部署时更难以解决问题,而当必须重新编入代码时非常困难。尽快修复错误总是更好 - 离开的时间越长,时间和金钱就越贵。 –

2

这是一个合乎逻辑的问题。
严格地说,你不能说“array_unique不起作用”。
仅仅因为涉及其他一些功能。
而且你不知道这个功能是否提供了正确的数据。

你必须学会​​才能调试你的代码。
将调试输出添加到您的代码并验证每个变量的状态以查看它是否包含所需的数据。从var_dump($metro);

开始内部循环的

+0

感谢您的建议,它返回布尔(错误) – user1056252

+0

**循环内**,而不是外面! –

+0

哎呀,在循环内没有返回 – user1056252

相关问题