【问题标题】:Checking if a url is already submitted in database in php检查 url 是否已经在 php 中的数据库中提交
【发布时间】:2010-02-25 11:03:52
【问题描述】:

我需要做的是检查一个 url 是否已经使用 php 在数据库中提交。

我有一个数据库表,用于存储用户提交的 URL。但我想在将其插入数据库之前检查 url 是否已在数据库中提交。 例如, http://www.example.comhttp://www.example.com/http://example.comhttp://example.com/ 等 URL 如果其中任何一个已插入数据库,则应返回 false,因为它们都是相同的 URL。 我认为我们可以通过使用正则表达式来完成这项工作。但是我在正则表达式方面有点弱,所以需要你的帮助。 谢谢

已编辑

您好,让我们假设 URL 是否在数组中而不是数据库中,只是为了弄清楚。我知道唯一键和与数据库结果匹配的 url。但是这里我有一个

如果你仔细看的话,会有不同的问题。

$urls = array('http://www.example.com/newpage.html', 'http://www.example.com/newpage.html');

案例 用户提交一个 url。假设http://example.com/newpage.html

现在作为 URL http://www.example.com/newpage.html 在 $urls 数组中可用,http://www.example.com/newpage.htmlhttp://example.com/newpage.html(userinput 没有 www) 是相同的页面,所以我需要一个函数来检查它,如果 url 在数组中可用则返回 false。我希望我现在澄清了自己。

所以到目前为止我认为它没有检查域或在 mysql 表中为 url 字段创建唯一键。我认为我们需要为此使用 regExp。有什么帮助吗?

【问题讨论】:

  • www.example.comexample.com相同的网址。
  • 但我想假设它们都是一样的,因为大部分时间都是一样的。
  • 在检查之前尝试删除任何尾随的/。这将使http://www.example.com/http://www.example.com 匹配。至于www 部分,Ben 是对的。如果您确实确定假设 www 并且没有任何相同之处,请尝试在添加任何 URL 时将 www. 替换为空白。这样一来,您的数据库中的所有记录都将使用example.com 而不是www.example.com,从而可以正确匹配。
  • 在这种情况下,如果 url 是 examplewww.com
  • $url = preg_replace('/http(s?):\/\/www\./i','http${1}://',$url) 然后。 :3

标签: php mysql regex


【解决方案1】:

不清楚您问题中的网址是什么。 URL 是资源。如果您的意思是提交保存到数据库的 GET 方法发送的 HTTP 变量,您可以使用其中一个变量的值作为在数据库中搜索的主键。

【讨论】:

    【解决方案2】:

    数据库是应用程序中的不同层。正则表达式在这里没有帮助,因为您必须首先检查数据库中的内容才能在结果集上使用正则表达式。

    但是,您可以只创建存储 URL 的列 UNIQUE 并使用 INSERT IGNORE

    来自 MySql 手册

    如果您使用 IGNORE 关键字,则在执行 INSERT 语句时发生的错误将被视为警告。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,行仍然没有插入,但不会发出错误。

    这仍然会插入 example.comwww.example.com 虽然它们是真正不同的字符串。您可以使用parse_url 在插入前检查和准备它们。

    相关:

    【讨论】:

      【解决方案3】:

      也许使字段“唯一”有助于mysql检查值。如果你得到一个 1062 的返回码,那么你就会知道它已经在数据库中了。

      当然,如果您的帐户数量过多,这可能不是一个好主意。并且您应该使用始终以相同方式插入它们的 php 检查 URL。 (例如添加或删除“http://”或 www)

      【讨论】:

        【解决方案4】:

        正如 Ben James 所说,www.example.com 和 example.com 并不相同。另外你的 URL 的意思有点模糊。

        但是如果你想检查 example.com 是否已经存在。只需使用 like 选项对您的数据库进行计数:

        select count(*) from table where url like '%.example.com%'

        example.com 是从完整的 url 中提取的。如果 count > 0,则域已经在数据库中。你必须微调这个解决方案,但我应该使用类似的东西。

        【讨论】:

        • @nickf:基本上它打破了很多,这就是我提到微调的原因。为您的问题添加了一个小修复。
        • 另外,example.com/test 和 example.com/blue 应该一样吗?我想不是。将请求 URI 添加到检查应该会有所帮助。所以WHERE `url` LIKE '%example.com/test%'.
        • 我认为如果 url 也是 example.com/newpage.html 也会匹配。但它不是同一个网址。我不希望匹配同一个域站点,而是匹配 url
        • 在这种情况下并没有太大的不同。只需使用“url = 'www.example.com/whatever/comes/after' 或 url = 'example.com/whatever/comes/after'”
        猜你喜欢
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多