Database 在数据库中找到重复的地址,是否阻止用户提前输入?
如何在数据库中找到重复的地址,或者在填写表单时更好地阻止人们?我想越早越好 有没有什么好的方法来提取街道、邮政编码等信息,以便能够检测到打字错误和简单的2次注册?比如:Database 在数据库中找到重复的地址,是否阻止用户提前输入?,database,sanitization,street-address,Database,Sanitization,Street Address,如何在数据库中找到重复的地址,或者在填写表单时更好地阻止人们?我想越早越好 有没有什么好的方法来提取街道、邮政编码等信息,以便能够检测到打字错误和简单的2次注册?比如: Quellenstrasse 66/11 Quellenstr. 66a-11 我说的是德语地址。。。 谢谢 通常在数据库中使用约束,以确保数据在基于数据的意义上是“唯一的” 关于“同构”,我认为你是自己写代码的。如果在数据库中可以使用触发器。越早停止人员,从长远来看就越容易 由于不太熟悉您的db模式或数据输入表单,我建议采
Quellenstrasse 66/11
Quellenstr. 66a-11
我说的是德语地址。。。
谢谢 通常在数据库中使用约束,以确保数据在基于数据的意义上是“唯一的”
关于“同构”,我认为你是自己写代码的。如果在数据库中可以使用触发器。越早停止人员,从长远来看就越容易 由于不太熟悉您的db模式或数据输入表单,我建议采用如下方式:
- 在数据库中为每个地址“部分”设置不同的字段,例如街道、城市、邮政编码、州等
- 将数据输入表格进行类似的分解,例如街道、城市等
- 它可能很慢,这取决于您的数据集,让用户等待
- 用户可能会试图通过将地址“部分”放在错误的字段(将邮政编码附加到城市等)来绕过它。 但根据经验,我们发现,即使引入上述简单的检查,也会阻止大部分用户输入预先存在的地址
事实上,Wich给出了两个示例的结果,只是尝试了一下。这样,您就可以得到结构化的结果,并将其保存到数据库中。如果查找失败,请要求用户以另一种方式写入地址。在开始搜索数据库中的重复地址之前,应首先确保以标准格式存储地址 大多数国家都有格式化地址的标准方式,在美国是USPS CASS系统: 但大多数其他国家都有类似的服务/标准。请尝试此网站了解更多国际格式: 这不仅有助于查找副本,而且在向客户发送邮件时也能为您节省资金(如果地址采用标准格式,则邮政服务收费较低) 根据您的应用程序,在某些情况下,您可能希望存储“虚荣”地址记录以及标准地址记录。这让您的VIP客户感到高兴。“虚荣”地址可能类似于: 西九十一街62号
4D公寓
纽约州纽约曼哈顿,邮编:10001 虽然标准地址可能如下所示: 62 W 91街4D公寓
纽约NY 10024-1414您可能需要查看的一件事是搜索,它对于拼写错误和缩略非常有用 然而,这不是一个数据库内验证,所以它可能不是您想要的 约翰尼斯: @这也是我最初的想法。有趣的是为地址的不同部分找到好的转换规则!有什么好的建议吗 当我们以前从事这类项目时,我们的方法是采用现有的地址库(150k左右),然后对我们的域应用最常见的转换(爱尔兰,所以“Dr”->“Drive”、“Rd”->“Road”等)。恐怕当时还没有关于这类事情的全面的在线资源,所以我们最终基本上自己列出了一个清单,检查了电话簿之类的东西(由于空间有限,地址以各种方式缩写!)。正如我前面提到的,您会惊讶地发现,只要添加几个常用规则,您就能检测到多少“重复项”
我最近偶然发现了一个页面,上面有一个相当全面的,虽然是美式英语,所以我不确定它在德国有多有用!谷歌很快发现了几个网站,但它们看起来像是垃圾通讯的注册陷阱。虽然那是我用英语在谷歌上搜索的结果,所以你可以更多地看一下德语中的“德语地址缩写:)来回答我自己的问题: 另一种方法是询问用户的手机号码,向他们发送短信进行验证。这就避免了大多数人弄乱重复地址 我是根据个人经验说的。(谢谢!)他们通过手机进行确认。这阻止了我拥有两个帐户!:-) 另一种可能的解决方案(假设您确实需要可靠的地址数据,并且您不只是使用地址来防止重复帐户)是使用第三方web服务来标准化用户提供的地址 它是这样工作的——您的系统通过在线表单接受用户的地址。表单将用户地址转交给第三方地址标准化web服务。web服务返回相同的地址,但现在数据标准化为离散的地址字段,并应用了标准缩写和格式。在尝试将数据保存到数据库中之前,应用程序会向用户显示此标准化地址,以供其确认 如果所有用户地址都经过标准化步骤,并且只保存标准化地址,则
<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>
<!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>
<?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);
}
?>
<?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");
$city= mysqli_real_escape_string($_POST['city']); // $_POST is an array (not a function)
// mysqli_real_escape_string is to prevent sql injection
$sql = "SELECT username FROM ".TABLENAME." WHERE city='".$city."'"; // City must enclosed in two quotations
$query = mysqli_query($connection,$sql);
if(mysqli_num_rows($query) != 0)
{
echo('ADDRESS_EXISTS');
}
?>