用户允许选择数据库字段

时间:2015-11-09 00:59:21

标签: php jquery mysql

想象一下,数据库驱动有两列。第一个是美国本土鸟类的清单。第二列列出了一个子集 - 每只原产于纽约州的鸟。

我不确定我想要如何设置数据库表,但我想修改它以便用户可以选择特定的数据子集。换句话说,他们可以在纽约和佛罗里达之间切换,或者他们可以在第二栏中显示加利福尼亚原产的鸟类列表。

假设第二列中显示的键是WHERE Table.Parent =' NY' (NY代表纽约)。我怎样才能允许用户将WHERE子句更改为WHERE Table.Parent =' CA'或者在哪里Table.Parent =' FL'?

有谁能告诉我我可以用什么策略来实现这个目标?我使用PHP,MySQL和jQuery。如果您可以向Google推荐一两个关键词,那将会很有用,可以提供有关如何操作的提示。

1 个答案:

答案 0 :(得分:1)

由于Dagon已对您的帖子发表评论,请正确设置数据库和表格。

我们可以有四个表格(state_tblocation_tbbird_tbbird_location_tb)。

对于state_tb表,请将其设置如下:

state_id  |  state
----------+----------
    1     |  Alabama
    2     |  Alaska
    3     |  Arizona
... and so on...

对于location_tb表:

location_id  |  state_id  |  location
-------------+------------+-------------
     1       |      1     |  Birmingham
     2       |      1     |  Montgomery
     3       |      1     |  Mobile
     4       |      2     |  Anchorage
     5       |      2     |  Fairbanks
     6       |      2     |  Juneau 
     7       |      3     |  Phoenix 
     8       |      3     |  Tucson
     9       |      3     |  Mesa
...and so on...

对于你的bird_tb表:

bird_id  |  bird
---------+-----------------
   1     |  Maya
   2     |  American Eagle
   3     |  Wood Pecker
...and so on...

最后,对于您的bird_location_tb表:

id  |  bird_id  |  bird_location (links to location_tb.location_id)
----+-----------+-----------------
 1  |     1     |       1
 2  |     2     |       2
 3  |     3     |       3

让用户首先从州和地点选择鸟类。这是一个示例JSfiddle。我在小提琴中给出的例子是修复,所以配置它,它将连接到你的数据库。

有三个选择字段,州,位置和鸟。

<select id="state"> <!-- SELECT FIELD FOR STATE -->
  <option value="0">Select State</option>
  <?php

    $stmt = $connection->prepare("SELECT state_id, state FROM state_tb");
    $stmt->execute();
    $stmt->bind_result($stateid, $state);
    while($stmt->fetch()){
      echo '<option value="'.$stateid.'">'.$state.'</option>';
    }
    $stmt->close();

  ?>
</select>

<select id="location">
  <option value="0">Select Location</option>
</select>

<select id="bird">
  <option value="0">Select Bird</option>
</select>

创建一个脚本,根据其先决条件字段填充下一个选择字段。

<script>

  $(document).ready(function(){

    $("#state").change(){ /* WHEN USER SELECTS A STATE */
      var stateid = $(this).val(); /* STORE THE SELECTED STATE ID TO THIS VARIABLE */
      $.ajax({
        type: "POST", /* METHOD TO USE TO PASS THE DATA */
        url: "action.php", /* PAGE WHERE WE WILL PROCESS THE PASSED DATA */
        data: {"stateid": stateid }, /* THE DATA WE WILL BE PASSING TO action.php */
        dataType: 'json', /* TYPE OF DATA THAT WILL BE RETURNED FROM action.php */
        success: function(result){ /* IF AJAX IS SUCCESS */
          $("#location").empty().append(result.locations); /* FILL THE LOCATION FIELD WITH THE RETURNED DATA */
          $("#bird").empty().append(result.birds); /* FILL THE BIRD FIELD WITH THE RETURNED DATA */
        }
      });
    });

    $("#location").change(){ /* WHEN USER SELECT A LOCATION */
      var locationid = $(this).val(); /* STORE THE SELECT LOCATION ID TO THIS VARIABLE */
      $.ajax({
        type: "POST", /* METHOD TO USE TO PASS THE DATA */
        url: "action.php", /* PAGE WHERE WE WILL PROCESS THE PASSED DATA */
        data: {"locationid": locationid }, /* THE DATA WE WILL BE PASSING TO action.php */
        success: function(result){ /* IF AJAX IS SUCCESS */
          $("#bird").empty().append(result); /* FILL THE BIRD FIELD WITH THE RETURNED DATA */
        }
    });

  });

</script>

对于action.php,我们将使用上面代码中的ajax处理传递的数据:

<?php

  include("yourconnection.php"); /* INCLUDE YOUR CONNECTION HERE */

  if(!empty($_POST["stateid"])){ /* WHEN USER CHANGE THE STATE ID */

    $locationoptions = '<option value="0">Select Location</option>';
    $birdoptions = '<option value="0">Select Bird</option>';

    /* START GETTING THE LOCATIONS THAT MATCHES THE STATE */
    $stmt = $connection->prepare("SELECT location_id, location FROM location_tb WHERE state_id = ?");
    $stmt->bind_param("i", $_POST["stateid"]);
    $stmt->execute();
    $stmt->bind_result($locationid, $location);
    while($stmt->fetch()){
      $locationoptions .= '<option value="'.$locationid.'">'.$location.'</option>';
    }
    $stmt->close();

    /* START GETTING THE BIRDS THAT MATCHES THE STATE ID */
    $stmt = $connection->prepare("SELECT d.bird_id, d.bird FROM state_tb a LEFT JOIN location_tb b ON a.state_id = b._stateid LEFT JOIN bird_location_tb c ON b.location_id = c.bird_location LEFT JOIN bird_tb d ON c.bird_id = d.bird_id WHERE a.state_id = ?");
    $stmt->bind_param("i", $_POST["stateid"]);
    $stmt->execute();
    $stmt->bind_result($birdid, $bird);
    while($stmt->fetch()){
      $birdoptions .= '<option value="'.$birdid.'">'.$bird.'</option>';
    }
    $stmt->close();

    echo json_encode(array("locations" => $locationoptions, "birds" => $birdoptions));

  } /* END OF PROCESSING THE PASSED ON STATE ID */

  else if(!empty($_POST["locationid"])){ /* WHEN USER CHANGE THE LOCATION */

    echo '<option value="0">Select Bird</option>';

    $stmt = $connection->prepare("SELECT b.bird_id, b.bird FROM bird_location_tb a LEFT JOIN bird_tb b ON a.bird_id = b.bird_id WHERE a.bird_location = ?");
    $stmt->bind_param("i", $_POST["locationid"]);
    $stmt->execute();
    $stmt->bind_result($birdid, $bird);
    while($stmt->fetch()){
      echo '<option value="'.$birdid.'">'.$bird.'</option>';
    }
    $stmt->close();

  }  /* END OF PROCESSING THE PASSED ON LOCATION ID */

?>