Values met aangemaakte codes onbrengen bij een (parent) met vaste code

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Christiaan Tossaint

Christiaan Tossaint

06/04/2019 12:40:21
Quote Anchor link
Hoi, Hallo,

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.
 
PHP hulp

PHP hulp

06/12/2019 14:29:12
 
- Ariën -
Beheerder

- Ariën -

06/04/2019 13:14:05
Quote Anchor link
Je wilt dus een multi-level lijststructuur? Waarbij je feitelijk oneindig veel levels onder je parent hebt?
Dan moet je deze genormaliseerd opslaan, en recursief ophalen.

Dus een lijst zoals; Europa, Benelux, Nederland, Noord-Holland, Alkmaar (gemeente), Alkmaar.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>




Bron:
https://crisp.tweakblogs.net/blog/317/

PS: Je bedoelt Countries (land)?
Gewijzigd op 06/04/2019 13:14:21 door - Ariën -
 
Verwijderd 31683

Verwijderd 31683

06/04/2019 13:17:55
Quote Anchor link
Ofwel je ordent de resultaten in je database-query -aangenomen dat $row een resultaatrij van een query is- met een ORDER BY clause, of je bouwt in PHP een kleine datastructuur zodat je daar (volg)orde aanbrengt in de resultaten.

Dit is een relatief eenvoudig sorteerprobleem lijkt mij, daarna is het een kwestie van de resultaten achter elkaar uitdraaien.
 
Adoptive Solution

Adoptive Solution

06/04/2019 13:30:04
 
Christiaan Tossaint

Christiaan Tossaint

06/04/2019 13:30:12
Quote Anchor link
Bedankt voor je reactie - Ariën -,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>



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
 
Verwijderd 31683

Verwijderd 31683

06/04/2019 14:32:43
Quote Anchor link
= is een toekenning
== is een vergelijking
=== is een typegevoelige vergelijking

Dus $check_previous=$shortname in een if-statement lijkt mij sowieso niet kloppen.
 
Christiaan Tossaint

Christiaan Tossaint

06/04/2019 14:50:10
Quote Anchor link
Thomas, bedankt. Zal er naar kijken.
 
Verwijderd 31683

Verwijderd 31683

06/04/2019 15:26:17
Quote Anchor link
Een toekenning zelf heeft ook een resultaat. Dit kan mogelijk tot gevolg hebben dat een if-statement niet doet wat je zou verwachten.

Het resultaat van $test = 'x' is 'x'. Als je dus zoiets doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$test
= 'a';
if ($test = 'b') {
    // dit gedeelte wordt uitgevoerd
}
?>

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$test
= 'a';
if ($test == 'b') {
    // dit gedeelte wordt niet uitgevoerd
}
?>

Immers $test is ongelijk aan 'b'.
 
Christiaan Tossaint

Christiaan Tossaint

06/04/2019 16:59:15
Quote Anchor link
Ik heb de genereerde codes eruit gehaald en de database genormaliseerd.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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`"
;
?>
 
Adoptive Solution

Adoptive Solution

06/04/2019 19:17:14
Quote Anchor link
Op basis van je code heb ik wat data erbij gezocht.

http://kejser.org/resources/free-data/free-data-countries-world/
https://www.ip2location.com/free/iso3166-2

Wat tabellen aangemaakt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


En de data geïmporteerd.

De veldnaam 'subdivision_code' is al compleet, bijvoorbeeld :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AD    Andorra la Vella    AD-07


Indien de landencode in de subdivision_code onbreekt, dan zou het er zo uit kunnen zien :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AD    Andorra la Vella    07


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)
PHP script in nieuw venster Selecteer het PHP script
1
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


Het resulaat zou er dan zo uit kunnen zien :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Code    Name    SubCode    Subdivision
MA    Morocco    MA-05    Beni-Mellal-Khenifra
MA    Morocco    MA-06    Casablanca-Settat
MA    Morocco    MA-08    Draa-Tafilalet
 
Christiaan Tossaint

Christiaan Tossaint

07/04/2019 13:43:47
Quote Anchor link
Adoptive Solution, ik heb met je code zitten spelen. Je hebt een mooie manier gevonden. Echter krijg ik het niet voor elkaar met mijn eigen data. Daarnaast zie ik geen COUNTY (dat is geen COUNTRY) en zie ik geen onderscheid tussen de subdivisions (zoals COUNTY, DISTRICT, PROVINCE etc.). Dat laatste is nou net wat ik zocht...

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.
 
- Ariën -
Beheerder

- Ariën -

07/04/2019 14:16:33
Quote Anchor link
Dit heeft te maken met character-encoding in het forum, waarbij tijd moet worden gevonden om te fixxen.

Hoe heb je nu in je site UTF-8 ingesteld?
 
Christiaan Tossaint

Christiaan Tossaint

07/04/2019 15:27:19
Quote Anchor link
- Ariën - data word in de database op UTF-8 gezet, bij mij is de COLLATION ingesteld op: utf8_unicode_ci
Vervolgens zet ik in PHP de character set op UTF-8:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// 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());
    }

?>


Ik hoop dat dat je helpt!
 
Adoptive Solution

Adoptive Solution

07/04/2019 21:39:10
Quote Anchor link
Met dit krijg je het lijstje zoals gewenst.
Ik gebruik object ipv assoc, dus effe aanpassen.
En ook de category aanpassen, die veldnaam heb ik niet, vandaar 'district'.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 '&nbsp;&nbsp;' . $row->Subdivision . ' - <i>District</i><br />';
    if ( !empty( $row->SubCode ) )
    {

        $generated = $row->SubCode;
        echo '&nbsp;&nbsp;Generated : ' . $generated . '<br />';
    }    
}

?>
 
Christiaan Tossaint

Christiaan Tossaint

08/04/2019 10:07:37
Quote Anchor link
Adoptive Solution, is het mogelijk om jouw complete werkende code (inclusief de SQL statement) hier te plaatsen?
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!
 
Adoptive Solution

Adoptive Solution

08/04/2019 11:24:13
Quote Anchor link
komt ie :

Een selectie data voor de landen :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');


en de regios :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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');


Een procedure die je in php aanroept :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 ;


En de webpagina :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<!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 '&nbsp;&nbsp;' . $row->Subdivision . ' - <i>District</i><br />';
            if ( !empty( $row->SubCode ) )
            {

                $generated = $row->SubCode;
                echo '&nbsp;&nbsp;Generated : ' . $generated . '<br />';
            }    
        }
    }
}

?>


    </div>

</body>

</html>


De pagina roep je aan als volgt :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
pagina.php?van=af&tot=af



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
 
Christiaan Tossaint

Christiaan Tossaint

08/04/2019 12:03:51
Quote Anchor link
Adoptive Solution, bedankt voor je snelle reactie. Ik heb je script exact overgenomen en in mijn browser laten draaien. Werkt op zich goed, maar ik mis wat...

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
 
Adoptive Solution

Adoptive Solution

08/04/2019 12:13:24
Quote Anchor link
Dan pas je het aan!
Je mag ook zelf wel iets bedenken.
 
Christiaan Tossaint

Christiaan Tossaint

08/04/2019 12:28:49
Quote Anchor link
Adoptive Solution, ik begrijp je reactie niet goed omdat ik vanaf mijn eerste vraag hier naar vraag. Al dat andere had ik juist al zelf. Gezien het feit dat ik denk dat er wat misverstanden waren tussen County en Country en tussen wat fixed en generated betekende in mijn codes probeer ik mij hier meer mijn probleem uit te leggen.

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 ;-)
 
- Ariën -
Beheerder

- Ariën -

08/04/2019 13:00:34
Quote Anchor link
Kijk eens met print_r naar je boom met data. Met een if-je kan je alle Counties dan wel vetgedrukt maken.
 
Adoptive Solution

Adoptive Solution

08/04/2019 14:56:45
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.