在数据库中找到重复的地址,阻止用户提前输入它们?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在数据库中找到重复的地址,阻止用户提前输入它们?相关的知识,希望对你有一定的参考价值。

如何在数据库中找到重复的地址,或者在填写表单时更好地阻止人们?我想越早越好?

是否有任何好的方法来抽象街道,邮政编码等,以便可以检测到错别字和简单的尝试获得2次注册?喜欢:

Quellenstrasse 66/11 
Quellenstr. 66a-11

我在说德语地址......谢谢!

答案

约翰:

@PConroy:这也是我最初的thougt。有趣的是,要找到地址不同部分的良好转换规则!有什么好建议吗?

当我们之前处理这类项目时,我们的方法是采用我们现有的地址语料库(150k左右),然后对我们的域应用最常见的转换(爱尔兰,所以“Dr” - >“Drive”,“ Rd“ - >”Road“等)。我担心当时没有全面的在线资源可用,所以我们自己最终基本上都会列出一个列表,检查电话簿之类的东西(按空格键,地址以各种方式缩写! )。正如我之前提到的,只要加上一些常用规则,你就会惊讶地发现有多少“重复”!

我最近偶然发现了一个相当全面的list of address abbreviations页面,虽然它是美国英语,所以我不确定它在德国有多大用处!一个快速的谷歌出现了几个网站,但他们似乎垃圾邮件通讯注册陷阱。虽然那是我用英语搜索谷歌,所以你可能会更多地看看德语中的“德语地址缩写”:)

另一答案

通常,您在数据库中使用约束来确保数据在基于数据的意义上是“唯一的”。

关于“同构”,我认为你是独立的,即自己编写代码。如果在数据库中,您可以使用触发器。

另一答案

我正在寻找解决美国地址问题的答案

有问题的是阻止用户输入重复项

Quellenstrasse 66/11Quellenstr. 66a-11

当您让用户在输入框中输入完整地址时会发生这种情况。

您可以使用一些方法来防止这种情况发生。

1. Uniform formatting using RegEx

  • 您可以提示用户以统一格式输入详细信息。
  • 查询时也非常有效
  • 测试用户对某些正则表达式输入的值,如果失败,请让用户更正它。

2.Use a map api like google maps and ask the user to select details from it.

  • 如果您选择谷歌地图,您可以使用反向地理编码实现它。

来自Google Developer's guide

术语地理编码通常是指将人类可读地址翻译成地图上的位置。执行相反的过程,将地图上的位置转换为人类可读的地址,称为反向地理编码。

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);


?>

如果在表列中发现重复,则阻止将它们保存到数据库中

以上是关于在数据库中找到重复的地址,阻止用户提前输入它们?的主要内容,如果未能解决你的问题,请参考以下文章

openwrt怎么查看在线用户

隐藏/禁用/任何其他阻止用户在浏览器地址栏中输入的方法

在smack中阻止用户[关闭]

HTML textarea标签大小改变[重复]

c语言设计猜数字游戏

html表单在特定输入上按Enter键时阻止提交[重复]