Values met aangemaakte codes onbrengen bij een (parent) met vaste code
Allereerst bedankt als je me wilt helpen met het volgende probleem. Wellicht zit ik er helemaal naast...
Ik heb een stukje code geschreven om van alle landen over de wereld de bijbehorende provincies, districten, counties etc. erbij te zetten. Nu is het geval dat ik bij een land de districten onder hun Counties wil plaatsen. Hiervoor hebben de Counties een vaste code en de Districten heb ik zo gemaakt dat ze de bij behorende County codes bevatten. Echter is het probleem nu dat ik het niet voor elkaar krijg om de Districten onder de juiste County te zetten.
Dit is wat ik wil:
County 1
- District 1
- District 3
- District 6
County 2
- District 2
- District 4
- District 5
etc.
Maar ik krijg nu dit (voorbeeld, niet exacte namen):
County 1
County 2
District 1
District 2
District 3
District 4
District 5
District 6
Script hieronder laat de generated codes achter de Districten zien:
echo $row['subdivision_name']." - <i>".$row['category']."</i><br />";
$fixed = $row['subdivision_code'];
$generated = "";
//$generated = $row['alpha2']."-".$row['subdivision_parent'];
//echo "generated: ".$generated." <br /> ";
if (!empty($row['subdivision_parent'])) {
$generated = $row['alpha2']."-".$row['subdivision_parent'];
$fixed = "";
echo "generated: ".$generated." <br /> ";
}
Heeft iemand een idee hoe ik dit kan aanpakken?
Indien meer info nodig is hoor ik het graag.
Dan moet je deze genormaliseerd opslaan, en recursief ophalen.
Dus een lijst zoals; Europa, Benelux, Nederland, Noord-Holland, Alkmaar (gemeente), Alkmaar.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
// get all menuitems with 1 query
$result = mysqli_query($con,"
SELECT
id, parentId, name
FROM
menu
ORDER BY
parentId, name
");
// prepare special array with parent-child relations
$menuData = array(
'items' => array(),
'parents' => array()
);
while ($menuItem = mysqli_fetch_assoc($result))
{
$menuData['items'][$menuItem['id']] = $menuItem;
$menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
}
// menu builder function, parentId 0 is the root
function buildMenu($parentId, $menuData)
{
$html = '';
if (isset($menuData['parents'][$parentId]))
{
$html = '<ul>';
foreach ($menuData['parents'][$parentId] as $itemId)
{
$html .= '<li>' . $menuData['items'][$itemId]['name'];
// find childitems recursively
$html .= buildMenu($itemId, $menuData);
$html .= '</li>';
}
$html .= '</ul>';
}
return $html;
}
// output the menu
echo buildMenu(0, $menuData);
?>
// get all menuitems with 1 query
$result = mysqli_query($con,"
SELECT
id, parentId, name
FROM
menu
ORDER BY
parentId, name
");
// prepare special array with parent-child relations
$menuData = array(
'items' => array(),
'parents' => array()
);
while ($menuItem = mysqli_fetch_assoc($result))
{
$menuData['items'][$menuItem['id']] = $menuItem;
$menuData['parents'][$menuItem['parentId']][] = $menuItem['id'];
}
// menu builder function, parentId 0 is the root
function buildMenu($parentId, $menuData)
{
$html = '';
if (isset($menuData['parents'][$parentId]))
{
$html = '<ul>';
foreach ($menuData['parents'][$parentId] as $itemId)
{
$html .= '<li>' . $menuData['items'][$itemId]['name'];
// find childitems recursively
$html .= buildMenu($itemId, $menuData);
$html .= '</li>';
}
$html .= '</ul>';
}
return $html;
}
// output the menu
echo buildMenu(0, $menuData);
?>
Bron:
https://crisp.tweakblogs.net/blog/317/
PS: Je bedoelt Countries (land)?
Gewijzigd op 06/04/2019 13:14:21 door - Ariën -
Dit is een relatief eenvoudig sorteerprobleem lijkt mij, daarna is het een kwestie van de resultaten achter elkaar uitdraaien.
http://adoptive.2kool4u.net/dynamic_select/populate.php?country=netherlands
Gebaseerd op
http://adoptive.2kool4u.net/dynamic_select/
Hier de code :
http://adoptive.2kool4u.net/dynamic_select/populate.txt
Ik heb je script bekeken, maar moet ik uit je reactie concluderen dat het niet mogelijk is om met gegenereerde codes (child) naar een parent te leiden?
County (fixed code)
District (generated code)
Voorbeeld:
County - AL-01 (uit database)
District - AL-01 (deze AL-01 is gegenereerd)
Hieronder de volledige script:
<style>
.success {
border: 1px solid lime;
border-radius: 5px;
font: 12px verdana;
color: #000;
background-color: lime;
display: inline-block;
}
.failed {
border: 1px solid red;
border-radius: 5px;
font: 12px verdana;
color: #000;
background-color: red;
display: inline-block;
}
</style>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
$servername = "";
$username = "";
$password = "";
$dbname = "";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("<div class=\"failed\">Connection failed: ".mysqli_connect_error()."</div><br /><br />");
}
echo "<div class=\"success\">Connected successfully</div><br /><br />";
// Change character set to utf8
if (!$conn->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n<br />", $conn->error);
} else {
printf("Current character set: %s\n<br />", $conn->character_set_name());
}
// SQL join
$sql = "SELECT * FROM `iso3166-1`
LEFT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`
UNION -- use UNION ALL to retain common rows
SELECT * FROM `iso3166-1`
RIGHT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`";
// Get SQL results
$result = mysqli_query($conn, $sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: ".mysqli_error($conn)."<br />";
exit;
}
$check_previous = "";
$same = false;
if (mysqli_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting<br />";
exit;
}
// While Loop
while ($row = mysqli_fetch_assoc($result)) {
$shortname = $row['shortname'];
if ($shortname!==$check_previous) {
echo "<b>".$shortname."</b><br />";
} else {
echo "";
}
$check_previous="";
if ($same==true) {
// we know $same is true but are they really the same?
if ($check_previous=$shortname) {
$same=true;
//echo $same;
} else {
$same=false;
$row['shortname']="";
//echo $same;
}
} else {
// we are not sure that is it the same... need check
if ($check_previous=$shortname) {
//now we are 100% sure it is the same
$same=true;
}
if ($check_previous!=$shortname) {
//now we are 100% sure it is NOT the same
$same=false;
}
}
// Put Districts (with Parent Codes) in County
echo $row['subdivision_name']." - <i>".$row['category']."</i><br />";
$fixed = $row['subdivision_code'];
$generated = "";
//$generated = $row['alpha2']."-".$row['subdivision_parent'];
//echo "generated: ".$generated." <br /> ";
if (!empty($row['subdivision_parent'])) {
$generated = $row['alpha2']."-".$row['subdivision_parent'];
$fixed = "";
echo "generated: ".$generated." <br /> ";
}
}
mysqli_free_result($result);
mysqli_close($conn);
?>
$servername = "";
$username = "";
$password = "";
$dbname = "";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("<div class=\"failed\">Connection failed: ".mysqli_connect_error()."</div><br /><br />");
}
echo "<div class=\"success\">Connected successfully</div><br /><br />";
// Change character set to utf8
if (!$conn->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n<br />", $conn->error);
} else {
printf("Current character set: %s\n<br />", $conn->character_set_name());
}
// SQL join
$sql = "SELECT * FROM `iso3166-1`
LEFT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`
UNION -- use UNION ALL to retain common rows
SELECT * FROM `iso3166-1`
RIGHT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`";
// Get SQL results
$result = mysqli_query($conn, $sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: ".mysqli_error($conn)."<br />";
exit;
}
$check_previous = "";
$same = false;
if (mysqli_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting<br />";
exit;
}
// While Loop
while ($row = mysqli_fetch_assoc($result)) {
$shortname = $row['shortname'];
if ($shortname!==$check_previous) {
echo "<b>".$shortname."</b><br />";
} else {
echo "";
}
$check_previous="";
if ($same==true) {
// we know $same is true but are they really the same?
if ($check_previous=$shortname) {
$same=true;
//echo $same;
} else {
$same=false;
$row['shortname']="";
//echo $same;
}
} else {
// we are not sure that is it the same... need check
if ($check_previous=$shortname) {
//now we are 100% sure it is the same
$same=true;
}
if ($check_previous!=$shortname) {
//now we are 100% sure it is NOT the same
$same=false;
}
}
// Put Districts (with Parent Codes) in County
echo $row['subdivision_name']." - <i>".$row['category']."</i><br />";
$fixed = $row['subdivision_code'];
$generated = "";
//$generated = $row['alpha2']."-".$row['subdivision_parent'];
//echo "generated: ".$generated." <br /> ";
if (!empty($row['subdivision_parent'])) {
$generated = $row['alpha2']."-".$row['subdivision_parent'];
$fixed = "";
echo "generated: ".$generated." <br /> ";
}
}
mysqli_free_result($result);
mysqli_close($conn);
?>
Toevoeging op 06/04/2019 13:43:01:
Thomas van den Heuvel, ik begrijp je maar dit kan niet als de code pas in een While Loop word gegenereerd.
Adoptive Solution, ja zoiets, alhoewel ik het een beetje anders wil hebben in design ;-) Daarnaast is mijn probleem nu echter of ik gegenereerde child codes kan linken aan gefixeerde codes
== is een vergelijking
=== is een typegevoelige vergelijking
Dus $check_previous=$shortname in een if-statement lijkt mij sowieso niet kloppen.
Thomas, bedankt. Zal er naar kijken.
Het resultaat van $test = 'x' is 'x'. Als je dus zoiets doet:
Immers, het resultaat van de toekenning $test = 'b' is 'b' en dit is ongelijk aan een false-achtige waarde, dus het if-statement voldoet en het bijbehorende codeblok wordt uitgevoerd.
Controleer je echter op de volgende wijze:
Immers $test is ongelijk aan 'b'.
Echter ik krijg ORDER BY hier niet aan het werk... Kan ik ORDER BY wel gebruiken by JOIN's?
(Ter info: `iso3166-2`.`subdivision_parent` bevat nu dezelfde code (is hier dus een Child) dat een code in `iso3166-2`.`subdivision_code` (=Parent) gekoppeld kan worden)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$sql = "SELECT * FROM `iso3166-1`
LEFT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`
UNION -- use UNION ALL to retain common rows
SELECT * FROM `iso3166-1`
RIGHT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`
ORDER BY `iso3166-2`.`subdivision_parent`";
?>
$sql = "SELECT * FROM `iso3166-1`
LEFT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`
UNION -- use UNION ALL to retain common rows
SELECT * FROM `iso3166-1`
RIGHT JOIN `iso3166-2` ON `iso3166-1`.`numeric` WHERE `iso3166-1`.`numeric` = `iso3166-2`.`numeric`
ORDER BY `iso3166-2`.`subdivision_parent`";
?>
http://kejser.org/resources/free-data/free-data-countries-world/
https://www.ip2location.com/free/iso3166-2
Wat tabellen aangemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `iso3166_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numeric` int(11) DEFAULT NULL,
`Alpha2Code` varchar(4) DEFAULT NULL,
`Alpha3Code` varchar(4) DEFAULT NULL,
`CountryName` varchar(128) DEFAULT NULL,
`TopLevelDomain` varchar(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `numeric` (`numeric`),
KEY `Alpha2Code` (`Alpha2Code`),
KEY `CountryName` (`CountryName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
`id` int(11) NOT NULL AUTO_INCREMENT,
`numeric` int(11) DEFAULT NULL,
`Alpha2Code` varchar(4) DEFAULT NULL,
`Alpha3Code` varchar(4) DEFAULT NULL,
`CountryName` varchar(128) DEFAULT NULL,
`TopLevelDomain` varchar(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `numeric` (`numeric`),
KEY `Alpha2Code` (`Alpha2Code`),
KEY `CountryName` (`CountryName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE `iso3166_2` (
`country_code` char(2) DEFAULT NULL,
`subdivision_name` varchar(128) DEFAULT NULL,
`subdivision_code` varchar(10) DEFAULT NULL,
KEY `idx_country_code` (`country_code`),
KEY `idx_region_name` (`subdivision_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
`country_code` char(2) DEFAULT NULL,
`subdivision_name` varchar(128) DEFAULT NULL,
`subdivision_code` varchar(10) DEFAULT NULL,
KEY `idx_country_code` (`country_code`),
KEY `idx_region_name` (`subdivision_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
En de data geïmporteerd.
De veldnaam 'subdivision_code' is al compleet, bijvoorbeeld :
Indien de landencode in de subdivision_code onbreekt, dan zou het er zo uit kunnen zien :
Omdat ik uit je php code opmaak dat je de landencode en de subdivision code nog moet samenvoegen, kan je iets dergelijk al in MySQL doen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
UPPER(Alpha2Code) AS Code,
CountryName AS Name,
CONCAT(Alpha2Code,'-',subdivision_code) AS SubCode,
subdivision_name AS Subdivision
FROM
iso3166_1
LEFT JOIN
iso3166_2
ON
Alpha2Code = country_code
WHERE
Alpha2Code >= 'MA'
AND
Alpha2Code <= 'MZ'
ORDER BY
Name, Subdivision
UPPER(Alpha2Code) AS Code,
CountryName AS Name,
CONCAT(Alpha2Code,'-',subdivision_code) AS SubCode,
subdivision_name AS Subdivision
FROM
iso3166_1
LEFT JOIN
iso3166_2
ON
Alpha2Code = country_code
WHERE
Alpha2Code >= 'MA'
AND
Alpha2Code <= 'MZ'
ORDER BY
Name, Subdivision
Het resulaat zou er dan zo uit kunnen zien :
Ik ga jullie mijn voorbeeld verbeteren met data voorbeelden. Hopelijk helpt dat...
Voorbeeld: bij een land waarbij COUNTIES en de daarbij horende DISTRICTEN bekend zijn:
COUNTRY
- COUNTY
-- DISTRICT
Zo komt het bijvoorbeeld eruit te zien:
Albania
- Berat - County
-- Berat - District
-- Kuçovë - District
-- Skrapar - District
- Dibër - County
- Durrës - County
etc...
Voorbeeld: bij een land waarbij alleen PROVINCIES bekend zijn (waarbij later de gemeentes per provincies erbij komen):
COUNTRY
- PROVINCE
(-- COMMUNITIES) // De gemeentes
Zo komt het bijvoorbeeld eruit te zien:
Afghanistan
- Badakhsh?n - Province
- B?dgh?s - Province
- Baghl?n - Province
- Balkh - Province
- B?my?n - Province
- D?ykund? - Province
etc...
Zo kan elk land een andere indeling hebben, maar dat is nu even ter info voor jullie.
Mijn database structuren zijn:
iso3166-1 (Tabelnaam)
- id - int(11) -> 1 (oplopend)
- history - int(1) -> 0 (of 1 wanneer dit record is verwijderd)
- shortname - varchar(255) -> Afghanistan
- nativename - varchar(255) -> ?????????
- alpha2 - char(2) -> AF
- alpha3 - char(3) -> AFG
- numeric - char(3) -> 004
iso3166-2
- id - int(11) -> 47 (oplopend)
- history - int(1) -> 0 (of 1 wanneer dit record is verwijderd)
- numeric - char(3) -> 008
- subdivision_code - varchar(6) -> AL-BR
- subdivision_name - varchar(255) -> Berat
- category - varchar(255) -> District
- subdivision_parent - char(5) -> AL-01
mijn volledige php code staat in een bericht hierboven.
Hopend dat dit meer helpt. Fijn weekend allemaal.
Toevoeging op 07/04/2019 13:46:12:
Ter info: de nativenaam word hier weergegeven met ?????????. Echter zijn dit speciale characters.
Hoe heb je nu in je site UTF-8 ingesteld?
Vervolgens zet ik in PHP de character set op UTF-8:
Code (php)
Ik hoop dat dat je helpt!
Ik gebruik object ipv assoc, dus effe aanpassen.
En ook de category aanpassen, die veldnaam heb ik niet, vandaar 'district'.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$check_previous = "";
while( $row = $result->fetch_object() )
{
$shortname = $row->Name;
if ( $shortname <> $check_previous )
{
echo '<b>' . $shortname . '</b><br />';
$check_previous = $shortname;
}
// Put Districts (with Parent Codes) in County
echo ' ' . $row->Subdivision . ' - <i>District</i><br />';
if ( !empty( $row->SubCode ) )
{
$generated = $row->SubCode;
echo ' Generated : ' . $generated . '<br />';
}
}
?>
$check_previous = "";
while( $row = $result->fetch_object() )
{
$shortname = $row->Name;
if ( $shortname <> $check_previous )
{
echo '<b>' . $shortname . '</b><br />';
$check_previous = $shortname;
}
// Put Districts (with Parent Codes) in County
echo ' ' . $row->Subdivision . ' - <i>District</i><br />';
if ( !empty( $row->SubCode ) )
{
$generated = $row->SubCode;
echo ' Generated : ' . $generated . '<br />';
}
}
?>
Wat ik ook probeer met jou code... ik krijg het niet voor elkaar dat het werkt. Ik krijg eerst alle counties en daarna de districten. Dus niet de counties met de bij behorende districten. Wellicht doe ik iets fouts, vandaar dat ik graag je volledig werkende code zou willen inzien. Bij voorbaat dank!
Een selectie data voor de landen :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE IF EXISTS `iso3166_1`;
CREATE TABLE `iso3166_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numeric` int(11) DEFAULT NULL,
`Alpha2Code` varchar(4) DEFAULT NULL,
`Alpha3Code` varchar(4) DEFAULT NULL,
`CountryName` varchar(128) DEFAULT NULL,
`TopLevelDomain` varchar(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `numeric` (`numeric`),
KEY `Alpha2Code` (`Alpha2Code`),
KEY `CountryName` (`CountryName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `iso3166_1` (`id`, `numeric`, `Alpha2Code`, `Alpha3Code`, `CountryName`, `TopLevelDomain`) VALUES
(1, 20, 'ad', 'and', 'Andorra', '.ad'),
(2, 4, 'af', 'afg', 'Afghanistan', '.af'),
(3, 28, 'ag', 'atg', 'Antigua and Barbuda', '.ag'),
(4, 660, 'ai', 'aia', 'Anguilla', '.ai'),
(5, 8, 'al', 'alb', 'Albania', '.al');
CREATE TABLE `iso3166_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numeric` int(11) DEFAULT NULL,
`Alpha2Code` varchar(4) DEFAULT NULL,
`Alpha3Code` varchar(4) DEFAULT NULL,
`CountryName` varchar(128) DEFAULT NULL,
`TopLevelDomain` varchar(5) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `numeric` (`numeric`),
KEY `Alpha2Code` (`Alpha2Code`),
KEY `CountryName` (`CountryName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `iso3166_1` (`id`, `numeric`, `Alpha2Code`, `Alpha3Code`, `CountryName`, `TopLevelDomain`) VALUES
(1, 20, 'ad', 'and', 'Andorra', '.ad'),
(2, 4, 'af', 'afg', 'Afghanistan', '.af'),
(3, 28, 'ag', 'atg', 'Antigua and Barbuda', '.ag'),
(4, 660, 'ai', 'aia', 'Anguilla', '.ai'),
(5, 8, 'al', 'alb', 'Albania', '.al');
en de regios :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
DROP TABLE IF EXISTS `iso3166_2`;
CREATE TABLE `iso3166_2` (
`country_code` char(2) DEFAULT NULL,
`subdivision_name` varchar(128) DEFAULT NULL,
`subdivision_code` varchar(10) DEFAULT NULL,
KEY `idx_country_code` (`country_code`),
KEY `idx_region_name` (`subdivision_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `iso3166_2` (`country_code`, `subdivision_name`, `subdivision_code`) VALUES
('AD', 'Andorra la Vella', 'AD-07'),
('AD', 'Canillo', 'AD-02'),
('AD', 'Encamp', 'AD-03'),
('AD', 'Escaldes-Engordany', 'AD-08'),
('AD', 'La Massana', 'AD-04'),
('AD', 'Ordino', 'AD-05'),
('AD', 'Sant Julia de Loria', 'AD-06'),
('AE', '\'Ajman', 'AE-AJ'),
('AE', 'Abu Zaby', 'AE-AZ'),
('AE', 'Al Fujayrah', 'AE-FU'),
('AE', 'Ash Shariqah', 'AE-SH'),
('AE', 'Dubayy', 'AE-DU'),
('AE', 'Ra\'s al Khaymah', 'AE-RK'),
('AE', 'Umm al Qaywayn', 'AE-UQ'),
('AF', 'Baghlan', 'AF-BGL'),
('AF', 'Balkh', 'AF-BAL'),
('AF', 'Bamyan', 'AF-BAM'),
('AF', 'Faryab', 'AF-FYB'),
('AF', 'Helmand', 'AF-HEL'),
('AF', 'Herat', 'AF-HER'),
('AF', 'Kabul', 'AF-KAB'),
('AF', 'Kandahar', 'AF-KAN'),
('AF', 'Khost', 'AF-KHO'),
('AF', 'Kunduz', 'AF-KDZ'),
('AF', 'Logar', 'AF-LOG'),
('AF', 'Nangarhar', 'AF-NAN'),
('AF', 'Nimroz', 'AF-NIM'),
('AF', 'Paktika', 'AF-PKA'),
('AF', 'Paktiya', 'AF-PIA'),
('AF', 'Parwan', 'AF-PAR'),
('AF', 'Takhar', 'AF-TAK'),
('AF', 'Uruzgan', 'AF-URU'),
('AG', 'Redonda', 'AG-11'),
('AG', 'Saint George', 'AG-03'),
('AG', 'Saint John', 'AG-04'),
('AG', 'Saint Mary', 'AG-05'),
('AG', 'Saint Paul', 'AG-06'),
('AG', 'Saint Peter', 'AG-07'),
('AG', 'Saint Philip', 'AG-08'),
('AI', 'Anguilla', '-'),
('AL', 'Berat', 'AL-01'),
('AL', 'Diber', 'AL-09'),
('AL', 'Durres', 'AL-02'),
('AL', 'Elbasan', 'AL-03'),
('AL', 'Fier', 'AL-04'),
('AL', 'Gjirokaster', 'AL-05'),
('AL', 'Korce', 'AL-06'),
('AL', 'Kukes', 'AL-07'),
('AL', 'Lezhe', 'AL-08'),
('AL', 'Shkoder', 'AL-10'),
('AL', 'Tirane', 'AL-11'),
('AL', 'Vlore', 'AL-12');
CREATE TABLE `iso3166_2` (
`country_code` char(2) DEFAULT NULL,
`subdivision_name` varchar(128) DEFAULT NULL,
`subdivision_code` varchar(10) DEFAULT NULL,
KEY `idx_country_code` (`country_code`),
KEY `idx_region_name` (`subdivision_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `iso3166_2` (`country_code`, `subdivision_name`, `subdivision_code`) VALUES
('AD', 'Andorra la Vella', 'AD-07'),
('AD', 'Canillo', 'AD-02'),
('AD', 'Encamp', 'AD-03'),
('AD', 'Escaldes-Engordany', 'AD-08'),
('AD', 'La Massana', 'AD-04'),
('AD', 'Ordino', 'AD-05'),
('AD', 'Sant Julia de Loria', 'AD-06'),
('AE', '\'Ajman', 'AE-AJ'),
('AE', 'Abu Zaby', 'AE-AZ'),
('AE', 'Al Fujayrah', 'AE-FU'),
('AE', 'Ash Shariqah', 'AE-SH'),
('AE', 'Dubayy', 'AE-DU'),
('AE', 'Ra\'s al Khaymah', 'AE-RK'),
('AE', 'Umm al Qaywayn', 'AE-UQ'),
('AF', 'Baghlan', 'AF-BGL'),
('AF', 'Balkh', 'AF-BAL'),
('AF', 'Bamyan', 'AF-BAM'),
('AF', 'Faryab', 'AF-FYB'),
('AF', 'Helmand', 'AF-HEL'),
('AF', 'Herat', 'AF-HER'),
('AF', 'Kabul', 'AF-KAB'),
('AF', 'Kandahar', 'AF-KAN'),
('AF', 'Khost', 'AF-KHO'),
('AF', 'Kunduz', 'AF-KDZ'),
('AF', 'Logar', 'AF-LOG'),
('AF', 'Nangarhar', 'AF-NAN'),
('AF', 'Nimroz', 'AF-NIM'),
('AF', 'Paktika', 'AF-PKA'),
('AF', 'Paktiya', 'AF-PIA'),
('AF', 'Parwan', 'AF-PAR'),
('AF', 'Takhar', 'AF-TAK'),
('AF', 'Uruzgan', 'AF-URU'),
('AG', 'Redonda', 'AG-11'),
('AG', 'Saint George', 'AG-03'),
('AG', 'Saint John', 'AG-04'),
('AG', 'Saint Mary', 'AG-05'),
('AG', 'Saint Paul', 'AG-06'),
('AG', 'Saint Peter', 'AG-07'),
('AG', 'Saint Philip', 'AG-08'),
('AI', 'Anguilla', '-'),
('AL', 'Berat', 'AL-01'),
('AL', 'Diber', 'AL-09'),
('AL', 'Durres', 'AL-02'),
('AL', 'Elbasan', 'AL-03'),
('AL', 'Fier', 'AL-04'),
('AL', 'Gjirokaster', 'AL-05'),
('AL', 'Korce', 'AL-06'),
('AL', 'Kukes', 'AL-07'),
('AL', 'Lezhe', 'AL-08'),
('AL', 'Shkoder', 'AL-10'),
('AL', 'Tirane', 'AL-11'),
('AL', 'Vlore', 'AL-12');
Een procedure die je in php aanroept :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DELIMITER ;;
DROP PROCEDURE IF EXISTS `iso3166`;;
CREATE PROCEDURE `iso3166`(IN `van` char(3), IN `tot` char(3))
SELECT
UPPER(Alpha2Code) AS Code,
CountryName AS Name,
subdivision_code AS SubCode,
subdivision_name AS Subdivision
FROM
iso3166_1
LEFT JOIN
iso3166_2
ON
Alpha2Code = country_code
WHERE
Alpha2Code >= van AND Alpha2Code <= tot
ORDER BY
Alpha2Code, Name, Subdivision;;
DELIMITER ;
DROP PROCEDURE IF EXISTS `iso3166`;;
CREATE PROCEDURE `iso3166`(IN `van` char(3), IN `tot` char(3))
SELECT
UPPER(Alpha2Code) AS Code,
CountryName AS Name,
subdivision_code AS SubCode,
subdivision_name AS Subdivision
FROM
iso3166_1
LEFT JOIN
iso3166_2
ON
Alpha2Code = country_code
WHERE
Alpha2Code >= van AND Alpha2Code <= tot
ORDER BY
Alpha2Code, Name, Subdivision;;
DELIMITER ;
En de webpagina :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>ISO3166 List</title>
<meta name="viewport" content="user-scalable=1, width=device-width, initial-scale=1.0, maximum-scale=2.0, minimum-scale=1.0" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
//db details
$dbHost = 'localhost';
$dbUsername = 'user';
$dbPassword = 'password';
$dbName = 'wereld';
//Connect and select the database
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);
$db->set_charset("utf8mb4");
$db->query("SET NAMES utf8mb4 COLLATE utf8mb4_general_ci");
if ($db->connect_error) {
die("Connection failed: " . $db->connect_error);
}
?>
<?php
$Alpha2CodeFrom = strtoupper( filter_var( $_GET['van'], FILTER_SANITIZE_STRING ) );
$Alpha2CodeTo = strtoupper( filter_var( $_GET['tot'], FILTER_SANITIZE_STRING ) );
if ( $Alpha2CodeFrom > $Alpha2CodeTo )
{
$Alpha2CodeTemp = $Alpha2CodeFrom;
$Alpha2CodeFrom = $Alpha2CodeTo;
$Alpha2CodeTo = $Alpha2CodeTemp;
}
$query = "CALL iso3166( '" . $Alpha2CodeFrom . "', '" . $Alpha2CodeTo . "')";
if ( $result = $db->query($query) )
{
if ( $result->num_rows > 0 )
{
$check_previous = "";
while( $row = $result->fetch_object() )
{
$shortname = $row->Name;
if ( $shortname <> $check_previous )
{
echo '<b>' . $shortname . '</b><br />';
$check_previous = $shortname;
}
// Put Districts (with Parent Codes) in County
echo ' ' . $row->Subdivision . ' - <i>District</i><br />';
if ( !empty( $row->SubCode ) )
{
$generated = $row->SubCode;
echo ' Generated : ' . $generated . '<br />';
}
}
}
}
?>
</div>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>ISO3166 List</title>
<meta name="viewport" content="user-scalable=1, width=device-width, initial-scale=1.0, maximum-scale=2.0, minimum-scale=1.0" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
//db details
$dbHost = 'localhost';
$dbUsername = 'user';
$dbPassword = 'password';
$dbName = 'wereld';
//Connect and select the database
$db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);
$db->set_charset("utf8mb4");
$db->query("SET NAMES utf8mb4 COLLATE utf8mb4_general_ci");
if ($db->connect_error) {
die("Connection failed: " . $db->connect_error);
}
?>
<?php
$Alpha2CodeFrom = strtoupper( filter_var( $_GET['van'], FILTER_SANITIZE_STRING ) );
$Alpha2CodeTo = strtoupper( filter_var( $_GET['tot'], FILTER_SANITIZE_STRING ) );
if ( $Alpha2CodeFrom > $Alpha2CodeTo )
{
$Alpha2CodeTemp = $Alpha2CodeFrom;
$Alpha2CodeFrom = $Alpha2CodeTo;
$Alpha2CodeTo = $Alpha2CodeTemp;
}
$query = "CALL iso3166( '" . $Alpha2CodeFrom . "', '" . $Alpha2CodeTo . "')";
if ( $result = $db->query($query) )
{
if ( $result->num_rows > 0 )
{
$check_previous = "";
while( $row = $result->fetch_object() )
{
$shortname = $row->Name;
if ( $shortname <> $check_previous )
{
echo '<b>' . $shortname . '</b><br />';
$check_previous = $shortname;
}
// Put Districts (with Parent Codes) in County
echo ' ' . $row->Subdivision . ' - <i>District</i><br />';
if ( !empty( $row->SubCode ) )
{
$generated = $row->SubCode;
echo ' Generated : ' . $generated . '<br />';
}
}
}
}
?>
</div>
</body>
</html>
De pagina roep je aan als volgt :
Toevoeging op 08/04/2019 11:42:45:
Werkend voorbeeld :
http://adoptive.2kool4u.net/dynamic_select/iso3166.php?van=af&tot=am
Gewijzigd op 08/04/2019 11:26:54 door Adoptive Solution
Dit is wat ik nu krijg als ik pagina.php?van=al&tot=al doe:
Albania
Berat - District
Generated : AL-01
Diber - District
Generated : AL-09
Durres - District
Generated : AL-02
Elbasan - District
Generated : AL-03
Fier - District
Generated : AL-04
Gjirokaster - District
Generated : AL-05
Korce - District
Generated : AL-06
Kukes - District
Generated : AL-07
Lezhe - District
Generated : AL-08
Shkoder - District
Generated : AL-10
Tirane - District
Generated : AL-11
Vlore - District
Generated : AL-12
Dat is inderdaad een lijst van Counties onder de Country. Maar als ik de Districten van Albania in de database erbij zet dan word dat er niet bij toegevoegd. Kan ook niet als ik zo naar je code kijk, er mis een stukje code waarin een subdivision_parent (generated) naar een subdivision_code (fixed) kijkt en de Districten onder de juiste Counties onderbrengt.
Wat het moet worden is dit:
Albania
Berat - County
Berat - District
Kuçovë - District
Skrapar - District
Durrës - County
Durrës - District
Krujë - District
Elbasan - County
Elbasan - District
Gramsh - District
Librazhd - District
Peqin - District
etc.
De Districten hebben een eigen subdivision_code die anders is dat de subdivision code die elk County heeft. Daarom heb ik een kolom erbij gezet: subdivision_parent daarin staan bij mij nu de subdivision_codes van de juiste County (parents) in bij de Districten.
Dus:
County AL-01 - Berat - County is een fixed subdivision_code
District - Berat heeft een fixed subdivision_code dat AL-BR is en een subdivision-code AL-01 om naar de County AL-01 te verwijzen.
District - Kuçovë heeft een fixed subdivision_code dat AL-KC is en een subdivision-code AL-01 om naar de County AL-01 te verwijzen.
County AL-02 - Durrës - County is een fixed subdivision_code
etc.
Gewijzigd op 08/04/2019 12:20:26 door Christiaan Tossaint
Je mag ook zelf wel iets bedenken.
Ikzelf dacht dat ik met fixed en generated deze parent en child codes aan elkaar kon koppelen, maar dat is dus niet het geval. Ik heb mijn uitleg hierboven nog wat toegelicht een gewijzigd dus wellicht iets beter uitgelegd nu.
Adoptive Solution, ik waardeer alle hulp van jou en van anderen dus begrijp mij niet verkeerd. En ik denk echt wel mee ;-)
Kijk eens met print_r naar je boom met data. Met een if-je kan je alle Counties dan wel vetgedrukt maken.
https://en.wikipedia.org/wiki/ISO_3166-2:BD
En
https://en.wikipedia.org/wiki/ISO_3166-2:BE
Gewijzigd op 08/04/2019 14:59:14 door Adoptive Solution