国家/城市/州验证

Posted

技术标签:

【中文标题】国家/城市/州验证【英文标题】:Country/City/state validation 【发布时间】:2011-01-14 07:40:35 【问题描述】:

我想用 php 和 jQuery 做以下事情

https://www.careerbuilder.com/share/register.aspx?sc_cmp1=JS_LoginASPX_RegNow

步骤

    从下拉列表中选择一个国家/地区。 城市下拉列表将自动填充所选国家/地区的城市列表。 如果该国家/地区有可用的州,则州列表将与该国家/地区的所有州列表一起可见。

然后我需要验证所选的城市、州和国家/地区。

你有什么想法吗?

提前致谢

【问题讨论】:

到目前为止你做了什么? 先下点功夫。如果你有任何问题,然后再回来 如果你这样做了,不要像你的示例链接那样重新加载页面......打字离开并让页面在你失去焦点和输入的下方重新加载真的很烦人(使用 AJAX而是) 【参考方案1】:

不退出您的要求,但是这会自动填充用户数据并保存在浏览器中的字段。

使用 html 自动完成: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete

<form method="post">
 <input type="text" name="userCountry" id="country-name" autocomplete="on" />
 <input type="submit" />
</form>

然后使用PHP验证信息;

<?PHP
 /* SANITIZE END-USER INPUTs */
 if ( $_SERVER["REQUEST_METHOD"] == "POST" ) 
   $_POST = filter_var_array( $_POST, FILTER_SANITIZE_STRING );
 

 /* VALIDATE DATA */
 if ( isset( $_POST['userCountry'] ) 
  $countrys = array( "united states of america", "united kingdom", "australia" );
  if ( !in_array( strtolower( $_POST['userCountry'] ), $countrys ) ) 
   /* Return a failed response */
   return false;
  
 

 /* SAVE DATA */

 /* Return a successful response */
 return true;
?>

您可能需要查看 onChange 然后填充数据。例如。

$("#country-name").change(function () 
    $("#state, #city").find("option:gt(0)").remove();
    $("#state").find("option:first").text("Loading...");
    $.getJSON("/get/states", 
        country_id: $(this).val()
    , function (json) 
        $("#state").find("option:first").text("");
        for (var i = 0; i < json.length; i++) 
            $("<option/>").attr("value", json[i].id).text(json[i].name).appendTo($("#state"));
        
    );
);
$("#state").change(function () 
    $("#city").find("option:gt(0)").remove();
    $("#city").find("option:first").text("Loading...");
    $.getJSON("/get/cities", 
        state_id: $(this).val()
    , function (json) 
        $("#city").find("option:first").text("");
        for (var i = 0; i < json.length; i++) 
            $("<option/>").attr("value", json[i].id).text(json[i].name).appendTo($("#city"));
        
    );
);

【讨论】:

【参考方案2】:

  var app = angular.module('ganesh', []);

	app.controller('MainCtrl', function($scope) 
  $scope.name = "Charlie's Programming..........";
  $scope.countries = 

                'USA': 
                    'Alabama': ['Montgomery', 'Birmingham'],
                    'California': ['Sacramento', 'Fremont'],
                    'Illinois': ['Springfield', 'Chicago']
                ,
               'India': 
						 'AndamanandNicobarIslands' : 	,
						 'AndhraPradesh' :  ,
						 'ArunachalPradesh' :  ,
						 'Assam' :  ,
						 'Bihar' :  ,
						 'Chandigarh' :  ,
						 'Chhattisgarh' :  , 
						 'DadraandNagarHaveli' :  ,
						 'DamanandDiu' :  , 
						 'Delhi' :  ,
						 'Goa' :  ,
						 'Gujarat' :  , 
						 'Haryana' :  ,
						 'HimachalPradesh' :  ,
						 'JammuandKashmir' :  , 
						 'Jharkhand' :  , 
						 'Karnataka' :  ,
						 'Kerala' :  ,
						 'Lakshadweep' :  , 
						 'MadhyaPradesh' :  , 
						 'Maharashtra' :  
										 'Ahmednagar' : [   ],
										 'Akola|Alibag' : [   ],
										 'Amaravati' : [   ],
										 'Arnala' : [   ], 
										 'Aurangabad' : [   ],
										 'Aurangabad' : [   ],
										 'Bandra' : [   ], 
										 'Bassain' : [   ], 
										 'Belapur' : [   ],
										 'Bhiwandi' : [   ], 
										 'Bhusaval' : [   ], 
										 'Borliai-Mandla' : [   ],
										 'Chandrapur' : [   ], 
										 'Dahanu' : [   ],
										 'Daulatabad' : [   ], 
										 'Dighi(Pune)' : [   ],
										 'Dombivali' : [   ],
										 'Goa' : [   ],
										 'Jaitapur' : [   ],
										 'Jalgaon' : [   ],
										 'JawaharlalNehru(NhavaSheva)' : [   ], 
										 'Kalyan' : [   ],
										 'Karanja' : [   ],
										 'Kelwa' : [   ], 
										 'Khopoli' : [   ],
										 'Kolhapur' : [   ], 
										 'Lonavale' : [   ], 
										 'Malegaon' : [   ], 
										 'Malwan' : [   ], 
										 'Manori' : [   ],
										 'MiraBhayandar' : [   ],
										 'Miraj' : [   ],
										 'Mumbai(exBombay)' : [   ],
										 'Murad' : [   ],
										 'Nagapur' : [   ],
										 'Nagpur' : [   ], 
										 'Nalasopara' : [   ],
										 'Nanded' : [   ],
										 'Nandgaon' : [   ],
										 'Nashik' : ['422606', '422004', '422002', '422003'], 
										 'NaviMumbai' : [   ],
										 'Nhave' : [   ], 
										 'Osmanabad' : [   ],
										 'Palghar' : [   ], 
										 'Panvel' : [   ], 
										 'Pimpri' : [   ], 
										 'Pune' : [   ], 
										 'Ratnagiri' : [   ], 
										 'Sholapur' : [   ],
										 'Shrirampur' : [   ],
										 'Shriwardhan' : [   ],
										 'Tarapur' : [   ],
										 'Thana' : [   ], 
										 'Thane' : [   ], 
										 'Trombay' : [   ],
										 'Varsova' : [   ], 
										 'Vengurla' : [   ],
										 'Virar' : [   ], 
										 'Wada' : [   ], 
										 'Panvel' : [   ],
										 'Pimpri' : [   ], 
										 'Pune' : [   ], 
										 'Ratnagiri' : [   ],
										 'Sholapur' : [   ],
										 'Shrirampur' : [   ],
										 'Shriwardhan' : [   ], 
										 'Tarapur' : [   ], 
										 'Thana' : [   ], 
										 'Thane' : [   ], 
										 'Trombay' : [   ], 
										 'Varsova' : [   ],
										 'Vengurla' : [   ], 
										 'Virar' : [   ], 
										 'Wada' : [   ], 
											,
						 'Manipur' :  ,
						 'Meghalaya' :  ,
						 'Mizoram' :  , 
						 'Nagaland' :  , 
						 'Orissa' :  ,
						 'Pondicherry' :  ,
						 'Punjab' :  , 
						 'Rajasthan' :  , 
						 'Sikkim' :  , 
						 'TamilNadu' :  , 
						 'Telangana' :  ,
						 'Tripura' :  ,
						 'Uttaranchal' :  ,
						 'UttarPradesh' :  , 
						 'WestBengal' :  
						 
                  
                ,
                'Australia': 
                    'New South Wales': ['Sydney'],
                    'Victoria': ['Melbourne']
                
            ;

			$scope.GetSelectedCountry = function () 
                $scope.strCountry = document.getElementById("country").value;
            ;
            $scope.GetSelectedState = function () 
                $scope.strState = document.getElementById("state").value;
            ;
            $scope.GetSelectedcity = function () 
                $scope.strCity = document.getElementById("city").value;
            ;
             $scope.GetSelectedpin = function () 
                $scope.strPin = document.getElementById("pin").value;
            ;
);
  <!DOCTYPE html>
<html ng-app="ganesh">

  <head>
    <meta charset="utf-8" />
    <title>Charlie</title>
    <script>document.write('<base href="' + document.location + '" />');</script> 
    <script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.12/angular.js" data-semver="1.4.9"></script>	
 </head>

  <body >	
  <div ng-controller="MainCtrl">
  <p>Welcome to name</p>
    <label for="country">Country *</label>
 <select id="country" ng-model="statessource" ng-options="country for (country, states) in countries"
                ng-change="GetSelectedCountry()">
 <option value=''>Select</option>
</select>    
 <label for="state">State *</label>
<select id="state" ng-disabled="!statessource" ng-model="model.state" ng-options="state for (state,city) in statessource"
         ng-change="GetSelectedState()"><option value=''>Select</option>
 </select>
  <label for="city">City *</label>
 <select id="city" ng-disabled="!model.state" ng-model="model.city" ng-options="city for (city, pin)  in model.state"
         ><option value=''>Select</option>
 </select>
 <label for="pin">Pincode *</label>
 <select id="pin" ng-disabled="!model.city" ng-model="model.pin" ng-options="pin for pin  in model.city"
         ><option value=''>Select</option>
 </select>
 </div>
  </body>

</html>

【讨论】:

这既不是 PHP 也不是 JQuery。请阅读***.com/help/how-to-answer。【参考方案3】:

打印带有状态列表的下拉列表 通过方法使状态的列表 id 获取或发布 id, 制作一个 sql 城市列表表并使用 php 调用该表比 jquery 需要更多时间,但它可以工作

【讨论】:

【参考方案4】:

从下拉列表中选择一个国家。

我假设这是一个从数据库表中填充的 HTML SELECT

城市下拉列表将填满 自动与城市列表 所选国家/地区。

不要这样做。你想要的是一个 jQuery Autocomplete,用户开始输入,然后你从数据库中提取可能的条目。

如果状态是 可用于该国家然后说明 列表将在所有状态下可见 该国家/地区的列表。

如果您要进行邮寄地址验证,则仅在少数国家/地区需要此功能。一种常见的处理方法是隐藏SELECT 框,当用户选择一个国家(例如澳大利亚)时,您需要在其中显示省份。

那我需要 验证选定的城市、州和 国家。

请注意,State/Province 和 Country 是 SELECT 控件,因此它们永远不会产生无效结果,并且无法验证城市名称。

【讨论】:

【参考方案5】:

我们所做的是使用 ServiceObjects.com 来验证地址。

所以我们让用户在纯文本字段(或多或少)中输入他们的地址,然后简单地将地址详细信息发送到 ServiceObjects.com 并使用他们的 web 服务返回的规范化/更正后的地址。

Service Objects Address Valiation

这不是直接回答您的问题,但也许它为根本问题提供了另一种解决方案。

【讨论】:

【参考方案6】:

这是一个非常标准的 AJAX 场景。事实上,您描述的确切问题可能是最常见的 Ajax 介绍性示例。您已将 PHP 和 jQuery 列为问题的标签;将这些结合使用将使解决方案变得非常简单。

我的建议是使用 PHP 查找 jQuery Ajax 示例。您几乎肯定会找到您正在寻找的东西。

【讨论】:

【参考方案7】:

我也面临着类似的挑战。我不知道您是否是这种情况,但就我而言,我们需要确保输入的城市确实是现有城市。稍后在项目中,我们希望能够收集世界任何地方的同一城市的条目。这些结果需要精确。 所以我们不能让人们也进入费城和费城。我们还希望人们使用城市的英文名称而不是他们自己语言的名称。

我找到了一些国家、州和城市的公共数据库。例如这里:MaxMind。但这是一个大约 300 万个城市的列表,我发现另一个超过 600 万个城市。我已经按照您描述的方式进行了设置。选择国家,然后通过 AJAX 调用获取其中的城市并填写下拉列表。对于像荷兰这样的国家来说,这大约需要 2 秒,但对于中国或俄罗斯来说,加载是不可接受的。 而且列表很大,而且对用户来说根本不友好。

所以我认为最好让人们在文本字段中输入它们,因为城市真的全部匹配并不是那么重要。 我们现在正在研究 Google Maps API 来解决我们的问题。

【讨论】:

感谢 abel 的好建议。我非常接近解决方案。一旦我完成了,我会在这里发布。再次感谢。【参考方案8】:

如果您想让外国人更容易输入地址,那么简单地提供一个文本字段,地址可以作为格式化文本输入。很少有国家使用州(或类似的东西)作为地址的一部分,我不明白您为什么要提供带有城市的下拉列表。德国城市列表(或更正确、有效的邮政地址中的地名)将包含大约 23,000 个条目。你觉得哪个更容易,输入地址或尝试在这样的列表中找到地名_

【讨论】:

以上是关于国家/城市/州验证的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何 API 用于获取所有国家并通过国家/地区获取所有州/地区并再次通过州/地区获取其中的所有城市

如何从reverseGeocodeCoordinate获取国家、州、城市?

从国家、州、城市和每个城市纬度/经度的数据库查询构建 JSON

城市/州|地区/国家的邮政编码国际数据库? [关闭]

用于跟踪用户位置的 Google Geolocation Api - 国家、城市、州、时区

用于加载国家、州/省/地区和城市选择菜单数据的 API 或数据库 [关闭]