在数据库中找到重复的地址,阻止用户提前输入它们?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在数据库中找到重复的地址,阻止用户提前输入它们?相关的知识,希望对你有一定的参考价值。
如何在数据库中找到重复的地址,或者在填写表单时更好地阻止人们?我想越早越好?
是否有任何好的方法来抽象街道,邮政编码等,以便可以检测到错别字和简单的尝试获得2次注册?喜欢:
Quellenstrasse 66/11
Quellenstr. 66a-11
我在说德语地址......谢谢!
约翰:
@PConroy:这也是我最初的thougt。有趣的是,要找到地址不同部分的良好转换规则!有什么好建议吗?
当我们之前处理这类项目时,我们的方法是采用我们现有的地址语料库(150k左右),然后对我们的域应用最常见的转换(爱尔兰,所以“Dr” - >“Drive”,“ Rd“ - >”Road“等)。我担心当时没有全面的在线资源可用,所以我们自己最终基本上都会列出一个列表,检查电话簿之类的东西(按空格键,地址以各种方式缩写! )。正如我之前提到的,只要加上一些常用规则,你就会惊讶地发现有多少“重复”!
我最近偶然发现了一个相当全面的list of address abbreviations页面,虽然它是美国英语,所以我不确定它在德国有多大用处!一个快速的谷歌出现了几个网站,但他们似乎垃圾邮件通讯注册陷阱。虽然那是我用英语搜索谷歌,所以你可能会更多地看看德语中的“德语地址缩写”:)
通常,您在数据库中使用约束来确保数据在基于数据的意义上是“唯一的”。
关于“同构”,我认为你是独立的,即自己编写代码。如果在数据库中,您可以使用触发器。
我正在寻找解决美国地址问题的答案
有问题的是阻止用户输入重复项
Quellenstrasse 66/11
和Quellenstr. 66a-11
当您让用户在输入框中输入完整地址时会发生这种情况。
您可以使用一些方法来防止这种情况发生。
1. Uniform formatting using RegEx
- 您可以提示用户以统一格式输入详细信息。
- 查询时也非常有效
- 测试用户对某些正则表达式输入的值,如果失败,请让用户更正它。
2.Use a map api like google maps and ask the user to select details from it.
- 如果您选择谷歌地图,您可以使用反向地理编码实现它。
术语地理编码通常是指将人类可读地址翻译成地图上的位置。执行相反的过程,将地图上的位置转换为人类可读的地址,称为反向地理编码。
3. Allow heterogeneous data as shown in the question and compare it with different formatting.
- 在问题中,OP允许以不同格式的地址。
- 在这种情况下,您可以将其更改为不同的表单并与数据库一起检查以获得解决方案。
- 这可能需要更多时间,时间完全取决于测试用例的数量。
4. Split the address into different parts and store it in db and provide such a form to user.
- 这提供了在数据库中存储街道,城市,州等的不同字段。
- 还为用户提供不同的输入字段,以自上而下的格式输入街道,城市,州等。
- 当用户输入state时,缩小查询范围以仅查找到该状态的dupe。
- 当用户进入城市时,仅将其缩小到该城市。
- 当用户进入街道时,将其缩小到该街道。
最后
- 当用户输入地址时,将其更改为不同的格式并根据数据库进行测试。
即使测试用例的数量可能很高,这也是有效的,您测试的条目数将非常少,因此它将消耗非常少的时间。
在美国,您可以使用USPS Address Standardization Web Tool。它会为您验证和规范化地址。这样,您可以在检查地址是否已存在于数据库之前规范化地址。如果数据库中的所有地址都已经规范化,您将能够轻松地发现重复数据。
示例网址:
https://production.shippingapis.com/ShippingAPI.dll?API=Verify&XML=insert_request_XML_here
样品申请:
<AddressValidateRequest USERID="XXXXX">
<IncludeOptionalElements>true</IncludeOptionalElements>
<ReturnCarrierRoute>true</ReturnCarrierRoute>
<Address ID="0">
<FirmName />
<Address1 />
<Address2>205 bagwell ave</Address2>
<City>nutter fort</City>
<State>wv</State>
<Zip5></Zip5>
<Zip4></Zip4>
</Address>
</AddressValidateRequest>
样品回复:
<AddressValidateResponse>
<Address ID="0">
<Address2>205 BAGWELL AVE</Address2>
<City>NUTTER FORT</City>
<State>WV</State>
<Zip5>26301</Zip5>
<Zip4>4322</Zip4>
<DeliveryPoint>05</DeliveryPoint>
<CarrierRoute>C025</CarrierRoute>
</Address>
</AddressValidateResponse>
其他国家可能有自己的API。其他人提到支持多个国家的第三方API,在某些情况下可能会有用。
谷歌搜索搜索建议,您可以搜索数据库地址字段
首先,让我们创建一个index.htm(l)文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Language" content="en-us">
<title>Address Autocomplete</title>
<meta charset="utf-8">
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="//netsh.pp.ua/upwork-demo/1/js/typeahead.js"></script>
<style>
h1
font-size: 20px;
color: #111;
.content
width: 80%;
margin: 0 auto;
margin-top: 50px;
.tt-hint,
.city
border: 2px solid #CCCCCC;
border-radius: 8px 8px 8px 8px;
font-size: 24px;
height: 45px;
line-height: 30px;
outline: medium none;
padding: 8px 12px;
width: 400px;
.tt-dropdown-menu
width: 400px;
margin-top: 5px;
padding: 8px 12px;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 8px 8px 8px 8px;
font-size: 18px;
color: #111;
background-color: #F1F1F1;
</style>
<script>
$(document).ready(function()
$('input.city').typeahead(
name: 'city',
remote: 'city.php?query=%QUERY'
);
)
</script>
<script>
function register_address()
$.ajax(
type: "POST",
data:
City: $('#city').val(),
,
url: "addressexists.php",
success: function(data)
if(data === 'ADDRESS_EXISTS')
$('#address')
.css('color', 'red')
.html("This address already exists!");
)
</script>
</head>
<body>
<div class="content">
<form>
<h1>Try it yourself</h1>
<input type="text" name="city" size="30" id="city" class="city" placeholder="Please Enter City or ZIP code">
<span id="address"></span>
</form>
</div>
</body>
</html>
现在我们将创建一个city.php文件,该文件将我们的查询聚合到mysql DB并作为JSON提供响应。这是代码:
<?php
//CREDENTIALS FOR DB
define ('DBSERVER', 'localhost');
define ('DBUSER', 'user');
define ('DBPASS','password');
define ('DBNAME','dbname');
//LET'S INITIATE CONNECT TO DB
$connection = mysqli_connect(DBSERVER, DBUSER, DBPASS,"DBNAME") or die("Can't connect to server. Please check credentials and try again");
//CREATE QUERY TO DB AND PUT RECEIVED DATA INTO ASSOCIATIVE ARRAY
if (isset($_REQUEST['query']))
$query = $_REQUEST['query'];
$sql = mysqli_query ($connection ,"SELECT zip, city FROM zips WHERE city LIKE '%$query%' OR zip LIKE '%$query%'");
$array = array();
while ($row = mysqli_fetch_array($sql,MYSQLI_NUM))
$array[] = array (
'label' => $row['city'].', '.$row['zip'],
'value' => $row['city'],
);
//RETURN JSON ARRAY
echo json_encode ($array);
?>
如果在表列中发现重复,则阻止将它们保存到数据库中
以上是关于在数据库中找到重复的地址,阻止用户提前输入它们?的主要内容,如果未能解决你的问题,请参考以下文章