创建独特的页面标题 slugs php

2024-03-27

我有一个为页面标题创建独特的标题的功能。它检查该 slug 在页面表中是否可用,然后通过相应地添加“-int”来创建唯一的 slug。该函数对于前三个条目运行良好,例如,输入三次“test slug”将创建“test-slug-1”、“test-slug-2”和“test-slug-3”。然后,第四个条目出现错误“致命错误:超出最大执行时间 30 秒”。逻辑应该有问题,谁能帮我看看。代码如下:

function createSlug($title, $table_name, $field_name) {

global $db_connect;

$slug = preg_replace("/-$/","",preg_replace('/[^a-z0-9]+/i', "-", strtolower($title)));

$counter = 1;

do{

  $query = "SELECT * FROM $table_name WHERE  $field_name  = '".$slug."'";
  $result = mysqli_query($db_connect, $query) or die(mysqli_error($db_connect));


  if(mysqli_num_rows($result) > 0){
      $count = strrchr($slug , "-"); 
      $count = str_replace("-", "", $count);
      if($count > 0){

          $length = count($count) + 1;
          $newSlug = str_replace(strrchr($slug , "-"), '',$slug);
          $slug = $newSlug.'-'.$length;

          $count++;

      }else{
          $slug = $slug.'-'.$counter;
      }  

  }

  $counter++; 
  $row = mysqli_fetch_assoc($result);

}while(mysqli_num_rows($result) > 0);

return $slug;

}


只需访问数据库一次,立即获取所有内容,很可能这是最大的瓶颈。

$query = "SELECT * FROM $table_name WHERE  $field_name  LIKE '".$slug."%'";

然后将结果放入数组中(假设$slugs)

//we only bother doing this if there is a conflicting slug already
if(mysqli_num_rows($result) !== 0 && in_array($slug, $slugs)){
    $max = 0;

    //keep incrementing $max until a space is found
    while(in_array( ($slug . '-' . ++$max ), $slugs) );

    //update $slug with the appendage
    $slug .= '-' . $max;
}

我们使用in_array()检查是否是蛞蝓my-slug the LIKE还会返回诸如

my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules

等会引起问题的in_array()检查确保我们只检查输入的确切段。

为什么我们不直接计算结果并+1?

这是因为,如果您有多个结果,并删除了一些结果,那么您的下一个 slug 很可能会发生冲突。

E.g.

my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5

删除 -3 和 -5 留给我们

my-slug
my-slug-2
my-slug-4

所以,这给了我们 3 个结果,下一个插入将是my-slug-4这已经存在了。

我们为什么不直接使用ORDER BY and LIMIT 1?

We can't just do an order by in the query because the lack of natural sorting would make my-slug-10 rank lower than my-slug-4 as it compares character by character and 4 is higher than 1

E.g.

m = m
y = y
- = -
s = s
l = l
u = u
g = g
- = -
4 > 1 !!!
  < 0 (But the previous number was higher, so from here onwards is not compared)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建独特的页面标题 slugs php 的相关文章

  • 如何在 Laravel 中使用数据库进行邮件设置

    我想让用户远离编辑配置文件 所以我在管理面板中制作了 Web 界面 用于设置邮件服务器 用户名 密码 端口 加密 我在 Laravel 4 2 中工作得很好 但是现在当应用程序被重写为 Laravel 5 时 出现错误 Class Sett
  • PHP 浮点错误与基本数学[重复]

    这个问题在这里已经有答案了 可能的重复 为什么十进制数不能用二进制精确表示 https stackoverflow com questions 1089018 why cant decimal numbers be represented
  • 本地化 html 文档(事后看来)

    我正在用 PHP 构建一个 Web 应用程序 我已经决定 在整个过程中 以不同的语言提供该应用程序 我的问题是这样的 我不想费力地浏览模板文件中的所有 HTMl 代码来查找需要用动态生成的 lang 变量替换的 单词 有没有一个工具可以突出
  • 安全灵活的跨域会话

    我有一个问题希望你能帮忙解决 假设我在一家名为 Blammo 的假设公司工作 我们有一个名为 Log 的假设产品 我正在尝试建立一个系统 人们可以登录 logfromblammo com 并订购我们的一些产品 然后当他们准备好购买时 前往
  • PHP 中的冒泡排序实现? [复制]

    这个问题在这里已经有答案了 我需要用 PHP 做一个冒泡排序算法 我想知道是否有人有我可以使用的好例子 或者一个可以做到这一点的开源库 我在一个集合 数组 中有几个空格 我想用对象 一个人 填充这些空间 所以没有空间可以有男性和女性 这就是
  • 有没有办法从 Symfony 应用程序中的 url 中删除 '/web' 而不将 'web' 目录的内容移动到根目录?

    我在使用 Symfony 创建应用程序时遇到一个问题 即 url 中出现 web 我找到了一种方法来摆脱这个问题 将 web 目录的内容移动到根目录 但我认为这不是一个好的开发实践 必须有其他方法 谁能告诉我是否还有其他方法可以做到这一点
  • GCM 卷曲操作超时

    我的服务器上存储了几个负责 GCM 操作的 php 文件 它们似乎在需要时工作得很好 但它们经常返回一个错误 指出 卷曲错误 操作在 0 毫秒后超时 0 中的 0 收到的字节数 这是服务器的问题还是我的 GCM 代码的问题 下面是我的 ph
  • 如何在 suave webpart 中设置 Json 响应

    我从 Suave 和 F 开始 我正在尝试在我的 web 部件中传递一个 json 序列化对象以在我的响应中获取它 在 php 中我有这个 player1Key hdegftzj25 gameKey aegfhzkfszl
  • 错误org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名为“entityManagerFactory”的bean时出错

    我想将我的 java CRUD 应用程序与红色节点连接 但当我运行 Java 应用程序时 我总是收到此错误 我试图解决它 但我不能 这是错误 2022 05 10 11 33 43 959 INFO 12192 restartedMain
  • 将 MySQL 与实体框架结合使用 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在 Google 上找不到任何有关实体框架 MySQL 的信息 所以我希望有人知道 已发布 获取适用于
  • 致命错误:未找到“MongoDB\Driver\Manager”类

    我想使用 MongoDB 驱动程序 但当我使用它时 它抛出一个错误 mongo new MongoDB Driver Manager mongodb localhost 27017 错误 消息 未找到类 MongoDB Driver Man
  • 如何使用我的服务器作为代理通过 PHP 下载文件?

    我需要我的服务器充当第三方服务器 文件最初所在的位置 和最终用户之间的代理 也就是说 我的服务器从第3方服务器下载文件 然后用户从我的服务器下载它 这将导致产生文件大小两倍的带宽 这个过程如何使用PHP来实现呢 fp fopen url r
  • 如何检索使用 Apache 的 mod_ldap 进行身份验证的用户的用户信息?

    我使用 Apache 进行 LDAP 身份验证 现在我需要知道如何获取使用 PHP 登录的用户 有可能吗 我是否必须在 PHP 中进行身份验证才能存储用户名 如果您激活 mod authnz ldap 模块并按如下方式配置您的部分
  • 为什么这个简单的 MySQL 查询不返回该行?

    我在表中有一行users与用户名test 但由于某种原因 此查询返回空结果集 SELECT id FROM users WHERE username test AND id null 但是 如果我删除 id null段 查询返回结果id 1
  • 保护登录和评论表单免受 CSRF 攻击

    我读过很多关于CSRF保护的文章 这个不错 http seclab stanford edu websec csrf csrf pdf 以及关于SO的各种问题 但它们似乎都没有足够的信息来回答我的问题 我正在开发自己的 CMS 我想保护我的
  • Laravel 5:先发送响应,然后在控制器中处理请求

    我正在使用 Classic Paypal API 但在处理请求数据之前遇到了响应问题 public function store Send an empty HTTP 200 OK response to acknowledge recei
  • php 中的 PDOException“找不到驱动程序”

    我已经在 Linux 系统上安装了 Lampp 并且正在学习 symfony2 同时尝试使用 symfony2 命令创建架构 php app console doctrine schema create 我收到以下错误消息 PDOExcep
  • 将 css 应用到 php 表

    我有一个生成的 php 表 我想在样式表中应用样式 例如 top 15px left 10px 等 不知道如何调用该表并将其与 css 链接 echo table border 1 for i 0 i table
  • mysql JOIN,这是如何解释的?

    如果我为 mysql 编写一条 sql 查询 并且只指定 JOIN 没有外连接 内连接 左连接等 那么默认的连接类型是什么 例如 SELECT count FROM Students p JOIN 班级 c ON p studentId c
  • PHP 中字符串限制为前 5 个单词或前 42 个字符

    如果我在 PHP 中有一个字符串 该字符串在 PHP 中是令人讨厌的长字符串 并且我想缩短它 然后向其添加一些内容 我想将其缩短为前 6 个单词或 42 个字符 以较短者为准 然后在缩短后附加一个 唯一不会被缩短且不添加 的情况是它最初少于

随机推荐