PHP - 链接列表“动态”

时间:2018-05-28 07:47:10

标签: javascript php

  

从数据库中读取时,我对链表有疑问,   让我用一个例子来解释。

     

示例数据库:

Country | City
USA     | New York
USA     | Washington
USA     | Dallas
USA     | LA
SPAIN   | Madrid
SPAIN   | Barcelona
UK      | London
UK      | Birmingham
UK      | Liverpool
     

HTML:2选择,对于此示例,第一个是国家/地区,而   秒是这个国家的城市。我怀疑是否可以检查   一切动态,例如:

     

PHP函数1

$statement = $conexion->prepare("Select distinct Country from database");     $statement->execute();  $result1 =
     

$陈述书>使用fetchall();功能2(接收$ country)

enter code here
$statement = $conexion->prepare("Select city from database where country = :country");    $statement->execute(array(":country" =>
     

$国家)); $ result2 = $ statement-> fetchAll();

     

1º想法:由于数据库不会被编辑,所以第一个想法就是获得   不同变量中的所有选项,例如$ country和   $ cityUSA,$ citySPAIN和$ cityUK,并在需要时加载它。

     

2º想法:我希望在我选择时将所需的城市加载到选项中   单击第一个选项,PHP变量获取值和   只做了一个声明,但我不知道如何,因为只有PHP   采用GET和POST选项。

     

对不起我的英文,谢谢大家!

真实数据是下一个: 表项目

c_project_id | d_name | d_description | n_budget | d_state
      1      |  Test  |  Test Project |    100   |  Open
      2      |  Web   |    Web APP    |   3000   |  Open
      3      | C Test |Closed Project |    100   | Closed
      4      | Certif.| Certificates  |   2500   |  Open

表类别(与表项目联系)

c_category_id | d_name | d_description | c_project_id
     1        | General| General cat   |      1
     2        | Test   | Test cat      |      1
     3        | General| General cat   |      2
     4        | General| General cat   |      3
     5        | Nothing| Nothing cat   |      3
     6        |Program | Programming   |      2
...

我想要一个带有项目名称的html中的SELECT,我接受它: PHP

$statement2 = $conexion->prepare("SELECT c_project_id, d_name FROM project WHERE d_state= 'Open'");
$statement2->execute();
$resultado2 = $statement2->fetchAll();

和HTML代码中的PHP foreach,这个工作,我把下一个数据。

<option value=<?php echo $res['c_project_id'] ?>><?php echo $res['d_name'] ?></option>

现在我想要:当我在第一个选择中“点击”时,第二个选择使这个语句像那样

$statement2 = $conexion->prepare("SELECT c_category_id, d_name FROM category WHERE c_project_id = :id");

但我不知道如何在不提交带有$ _GET或$ _POST的FORM的情况下进行此操作并以dinamycally方式进行。 我希望现在我解释得更好。

1 个答案:

答案 0 :(得分:0)

首先,你应该normalize你的数据库。这意味着将表格分为两个,一个用于国家,一个用于城市。

为您的国家/地区提供唯一的主键列(可能是自动增量)。

CountryId | CountryTag | CountryName
        1 | USA        | United States of America
        2 | ESP        | Spain
        3 | UK         | United Kingdom

然后创建一个包含国家/地区和城市的“多对多”表格,其中CountryId是指向您的国家/地区表格的外键。

CountryId | CityName
        1 | New York
        1 | Washington
        1 | Dallas
        1 | Los Angeles
        2 | Madrid
        2 | Barcelona
        3 | London
        3 | Birmingham
        3 | Liverpool

现在,您可以使用两个查询构建域模型:

$countries = array();
$statement = $connection->prepare("SELECT * FROM countries");
$statement->execute();
while ($row = = $statement->fetch(\PDO::FETCH_ASSOC)) {
    $countries[$row['CountryId']] = $row;
    $countries[$row['CountryId']]['cities'] = array();
}

$statement = $connection->prepare("SELECT * FROM cities");
$statement->execute();
while ($row = = $statement->fetch(\PDO::FETCH_ASSOC)) {
    $countries[$row['CountryId']]['cities'][] = $row;
}

如果您使用JOIN,也可以在一个查询中执行此操作。

你现在拥有这个数组:

array(3) {
  [1]=>
  array(4) {
    ["CountryId"]=>
    int(1)
    ["CountryTag"]=>
    string(3) "USA"
    ["CountryName"]=>
    string(24) "United States of America"
    ["cities"]=>
    array(4) {
      [0]=>
      string(8) "New York"
      [1]=>
      string(10) "Washington"
      [2]=>
      string(6) "Dallas"
      [3]=>
      string(11) "Los Angeles"
    }
  }
  [2]=>
  array(4) {
    ["CountryId"]=>
    int(2)
    ["CountryTag"]=>
    string(3) "ESP"
    ["CountryName"]=>
    string(5) "Spain"
    ["cities"]=>
    array(2) {
      [0]=>
      string(6) "Madrid"
      [1]=>
      string(9) "Barcelona"
    }
  }
  [3]=>
  array(4) {
    ["CountryId"]=>
    int(3)
    ["CountryTag"]=>
    string(2) "UK"
    ["CountryName"]=>
    string(14) "United Kingdom"
    ["cities"]=>
    array(2) {
      [0]=>
      string(6) "London"
      [1]=>
      string(9) "Liverpool"
    }
  }
}

现在,您可以根据需要对此进行循环,它由CountryId编制索引,并保存国家/地区的名称以及该国家/地区内的城市。

  

1º想法:由于数据库不会被编辑,第一个想法是将所有选项放在不同的变量中,例如$ country和$ cityUSA,$ citySPAIN和$ cityUK,并在需要时加载它。

然后为什么要烦扰数据库呢?你可以编辑一个配置文件来改变变量。为什么$cityUSA$citySPAIN$cities['spain']$cities['USA']同样适用,但您无需在代码中对国家/地区进行硬编码。

  

2º想法:当我点击第一个选项时,我想将所需的城市加载到选项中,PHP变量获取值并仅生成1个语句,但我不知道如何,因为PHP只接受GET和POST选项。

通过上述内容,您可以在select中创建选项组,也可以将其作为JSON输出到站点源中,以使用JavaScript动态更改select。或者你通过AJAX加载城市。

工作片段:

var countries = {"1":{"CountryId":1,"CountryTag":"USA","CountryName":"United States of America","cities":["New York","Washington","Dallas","Los Angeles"]},"2":{"CountryId":2,"CountryTag":"ESP","CountryName":"Spain","cities":["Madrid","Barcelona"]},"3":{"CountryId":3,"CountryTag":"UK","CountryName":"United Kingdom","cities":["London","Liverpool"]}};

var country_select = document.getElementById('countries');
var city_select = document.getElementById('cities');

// react to changes in the country select
country_select.onchange = function() {
    var elem = (typeof this.selectedIndex === "undefined" ? window.event.srcElement : this);
    var value = elem.value || elem.options[elem.selectedIndex].value;
    
    // empty cities select
    city_select.innerHTML = '';
    
    // populate with the correct cities;
   	var country = countries[value];
   country['cities'].forEach(function(element) {
   	var option = document.createElement("option");
    	option.value = element;
    	option.text = element;
    	city_select.appendChild(option);
   });  
}
<select id="countries">
<option value="1">USA</option>
<option value="2">Spain</option>
<option value="3">UK</option>
</select>

<select id="cities">
<option value="New York">Los Angeles</option>
<option value="Washington">Washington</option>
<option value="Dallas">Dallas</option>
<option value="Los Angeles">Los Angeles</option>
</select>