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

Database 在数据库中找到重复的地址,是否阻止用户提前输入?,database,sanitization,street-address,Database,Sanitization,Street Address,如何在数据库中找到重复的地址,或者在填写表单时更好地阻止人们?我想越早越好 有没有什么好的方法来提取街道、邮政编码等信息,以便能够检测到打字错误和简单的2次注册?比如: Quellenstrasse 66/11 Quellenstr. 66a-11 我说的是德语地址。。。 谢谢 通常在数据库中使用约束,以确保数据在基于数据的意义上是“唯一的” 关于“同构”,我认为你是自己写代码的。如果在数据库中可以使用触发器。越早停止人员,从长远来看就越容易 由于不太熟悉您的db模式或数据输入表单,我建议采

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

有没有什么好的方法来提取街道、邮政编码等信息,以便能够检测到打字错误和简单的2次注册?比如:

Quellenstrasse 66/11 
Quellenstr. 66a-11
我说的是德语地址。。。
谢谢

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


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

越早停止人员,从长远来看就越容易

由于不太熟悉您的db模式或数据输入表单,我建议采用如下方式:

  • 在数据库中为每个地址“部分”设置不同的字段,例如街道、城市、邮政编码、州等

  • 将数据输入表格进行类似的分解,例如街道、城市等

上面的理由是,每个部分都可能有自己的特定“规则”来检查稍微更改的地址(“Quellenstrase”->“Quellenstr.”,“66/11”->“66a-11”上面),因此验证代码可以检查每个字段的值是否存在于各自的db字段中。如果没有,您可以有一个类为每个给定字段应用转换规则(例如,“strasse”词干为“str”),并再次检查重复项

显然,上述方法有其缺点:

  • 它可能很慢,这取决于您的数据集,让用户等待

  • 用户可能会试图通过将地址“部分”放在错误的字段(将邮政编码附加到城市等)来绕过它。 但根据经验,我们发现,即使引入上述简单的检查,也会阻止大部分用户输入预先存在的地址

一旦基本检查就绪,就可以考虑优化所需的数据库访问、细化规则等,以满足特定的模式。您还可以查看一下,了解如何编写类似的文本。

您可以使用


事实上,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');
    }
?>