PHP/MySQL 更好的用户搜索

2023-12-22

为了让代码焕发新的活力,我大部分时间都是在 14 多年前编写的。我发现我当时写的可爱的小设置......在某些地方缺乏,即处理用户输入。

Lesson:永远不要低估用户通过验证器注入垃圾、拼写错误和欺骗的能力。

旧方法已达到临界质量,因为 SELECT 下拉列表中现在有 470 个项目。我想重新发明流程的这一部分,这样我就不必担心它会达到临界点。

因此,我们的想法是构建一个模糊搜索方法,以便在打字员输入搜索字符串后,我们检查五个数据,所有这些数据都位于同一行。

我需要根据舞台名称(两个也称为名称)以及它们的法定名称检查提交的名称,并根据其舞台名称对 soundex() 索引进行最终检查(这会捕获一些遗漏的拼写错误)否则)

我尝试了一个复杂的代码块来检查这些事情(它不起作用,主要是因为我认为我对比较的编码太严格)作为 do/while 循环的一部分。

在下面,var$Rin将包含用户提供的名称。

$setr = mysql_query("SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers");
IF ($R = mysql_fetch_array($setr)) {
    do {
        $RT = substr(trim($Rin), 5);
        $RT1 = substr($R[1], 5);
        $RT2 = substr($R[2], 5);
        $RT3 = substr($R[3], 5);
        $RT4 = substr($R[4], 5);
        $RTx = soundex($RT);
        IF ($RT == $RT1) {
            $RHits[] = $R[0];
        }
        IF ($RT == $RT2) {
            $RHits[] = $R[0];
        }
        IF ($RT == $RT3) {
            $RHits[] = $R[0];
        }
        IF ($RT == $RT4) {
            $RHits[] = $R[0];
        }
        IF ($RTx == $R[5]) {
            $RHits[] = $R[0];
        }
    } while ($R = mysql_fetch_array($setr));
}

我的想法是,我将构建一个接近命中的 ID# 数组,将其填充到一个选择下拉列表中,希望该下拉列表的命中数少于整个表的命中数。这意味着从该数组的内容中查询结果集,以便在 SELECT 下拉列表中显示执行者的名称,并将 ID# 作为这些选择的值传递。

就在那时,我遇到了“我需要在 WHERE 子句中使用数组”问题,在找到答案后,我开始怀疑由于下面的规定#2,我运气不好。所以我开始寻找替代的搜索方法,但我不确定我是否已经取得任何进展,但更加困惑。

那么,是否有更好的方法来扫描单个表中的六个字段,根据用户输入检查五个字段,并注意第六个字段是否显示在原始表的子集中?

思考过程:

针对整个表,每条记录,按以下顺序针对这些测试测试 $Rin:

$Rin -> 舞台名称
$Rin -> 又名1
$Rin -> AKA2
$Rin -> 法定姓名
soundex($Rin) -> SoundEx

其中五个操作中任何一个的命中都会将 ID# 添加到结果数组中,该数组用于将结果从 470 个执行者缩小到一个合理的列表以供选择。

规定:

1) 正如所写,我知道这很容易受到 SQL 注入攻击。

2)服务器运行PHP 4.4.9和MySQL 4.0.27-Standard,我无法升级它。在花钱之前我必须证明它有效。

3)这是业余爱好级别的东西,不是我的日常工作。

4) 表演者经常使用非英文名称或名称中的元素,这导致数据输入打字员出现拼写错误和重复。

我已经找到了很多针对此类问题的 mysqli 和 PDO 答案,并且我发现很多事情只有一半有意义(例如下面的链接#4)。当我尝试修复损坏的东西时,我正在努力加快这些事情的进展。

已经看过的地方:

  1. PHP mysql 在 WHERE 子句中使用数组 https://stackoverflow.com/questions/907806/php-mysql-an-array-in-where-clause
  2. PHP/MySQL小规模模糊搜索 https://stackoverflow.com/questions/1914671/php-mysql-small-scale-fuzzy-search
  3. MySQL 子字符串模糊搜索 https://stackoverflow.com/questions/39145910/mysql-substring-fuzzy-search
  4. 复杂的名称查找 https://forums.mysql.com/read.php?20,282935,282935#msg-282935

我在评论中提到,Javascript typeahead 库可能是您的不错选择。我发现 Twitter 的 Typeahead 库和 Bloodhound 引擎非常强大。不幸的是,文档是一个混合包:只要您需要的内容与他们的示例非常相似,您就是黄金,但缺少某些细节(例如标记器的解释)。

在其中之一预先输入几个问题 https://stackoverflow.com/a/22731492/1327983在 Stack Overflow 上,@JensAKoch 说:

老实说,我认为 Twitter 放弃了 typeahead.js。我们看看 13000 颗星,一个没有维护者的完整错误跟踪器和一个损坏的软件,最后一个版本是 2015 年。我认为这不言而喻,或者不是? ...所以,尝试其中一个分支:github.com/corejavascript/typeahead.js

坦率地说,简单检查一下,叉子上的文档看起来更好一些,如果没有别的的话。您不妨检查一下。

服务器端代码:

使用旧版本 PHP 的所有注意事项均适用。我强烈建议重新设计以将 PDO 与 PHP 5 结合使用,但本示例根据要求使用 PHP 4。

完全未经测试的 PHP 代码。json_encode() https://secure.php.net/manual/en/function.json-encode.php会更好,但直到 PHP 5 才会出现。您的端点将类似于:

headers("Content-Type: application/json");
$results = mysql_query(
   "SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers"
);

$fields = array("ID","StageName","AKA1","AKA2","LegalName","SoundEx");

echo "[";

$first =  true;
while ($row = mysql_fetch_array($results)) {
    ($first) ? $first = false : echo ',';

    echo "\n\t,{";
    foreach($fields as $f) {
        echo "\n\t\t\"{$f}\": \"".$row[$f]."\"";
    }
    echo "\n\t}";
}
echo "]";

客户端代码:

这个例子使用了一个静态 JSON 文件 https://gist.github.com/tag/81e4450de8eca805f436b72e6d7d1274作为所有结果的存根。如果您预计结果集将超过 1,000 个条目,您应该查看remote寻血猎犬的选项 https://github.com/twitter/typeahead.js/blob/master/doc/bloodhound.md#remote。这需要您编写一些自定义 PHP 代码来处理查询,但它看起来与转储所有(或至少是最常见的)数据的终点非常相似。

var actors = new Bloodhound({
  // Each row is an object, not a single string, so we have to modify the
  // default datum tokenizer. Pass in the list of object fields to be
  // searchable.
  datumTokenizer: Bloodhound.tokenizers.obj.nonword(
    'StageName','AKA1','AKA2','LegalName','SoundEx'
  ),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  // URL points to a json file that contains an array of actor JSON objects
  // Visit the link to see details 
  prefetch: 'https://gist.githubusercontent.com/tag/81e4450de8eca805f436b72e6d7d1274/raw/792b3376f63f89d86e10e78d387109f0ad7903fd/dummy_actors.json'
});

// passing in `null` for the `options` arguments will result in the default
// options being used
$('#prefetch .typeahead').typeahead(
    {
        highlight: true
    },
   {
        name: 'actors',
        source: actors,
        templates: {
        empty: "<div class=\"empty-message\">No matches found.</div>",
        
        // This is simply a function that accepts an object.
        // You may wish to consider Handlebars instead.
        suggestion: function(obj) {
            return '<div class="actorItem">'
                + '<span class="itemStageName">'+obj.StageName+"</span>"
                + ', <em>legally</em> <span class="itemLegalName">'+obj.LegalName+"</span>"
        }
        //suggestion: Handlebars.compile('<div><strong>{{value}}</strong> – {{year}}</div>')
      },
      display: "LegalName" // name of object key to display when selected
      // Instead of display, you can use the 'displayKey' option too:
      // displayKey: function(actor) {
      //     return actor.LegalName;
      // }
});
/* These class names can me specified in the Typeahead options hash. I use the defaults here. */
    .tt-suggestion {
        border: 1px dotted gray;
        padding: 4px;
        min-width: 100px;
    }
    .tt-cursor {
        background-color: rgb(255,253,189);
    }
    
    /* These classes are used in the suggestion template */
    .itemStageName {
        font-size: 110%;
    }
    .itemLegalName {
        font-size: 110%;
        color: rgb(51,42,206);
    }
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script>


<p>Type something here. A good search term might be 'C'.</p>
<div id="prefetch">
  <input class="typeahead" type="text" placeholder="Name">
</div>

为了方便起见,这里是客户端代码要点 https://gist.github.com/tag/eea4ea2716eb2026d7c459a503935780.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP/MySQL 更好的用户搜索 的相关文章

  • Laravel:使用 Faker 播种多个独特的列

    介绍 怎么样 伙计们 我有一个关于模型工厂和多个独特列的问题 背景 我有一个名为 Image 的模型 该模型将语言支持存储在单独的模型中 图片文字 图片文字 has an image id栏 语言栏和文本栏 图片文字有一个约束MySQL那个
  • 在 laravel 中禁用特定路由的 csrf

    我有一个支付系统 数据被提交到第三方网站然后被拉回 当数据返回时 它会到达特定的 url 比如 ok 路由 REQUEST transaction 但由于 Laravel 中间件 我遇到了令牌不匹配的情况 第三方支付API无法生成token
  • mysql LIKE 查询时间太长

    SQL SELECT COUNT usr id as total results FROM users as usr LEFT JOIN profile as prof ON prof uid usr uid WHERE usr usern
  • 为什么对于小数组,for-of 循​​环比标准 for 循环快,而对于大数组则慢?

    在 JavaScript 中 我注意到 ES6for of循环的性能与传统的有很大不同for start stop step loop 基准 const n 10000 const arr Array n fill map e i gt i
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 将 Laravel 集合/数组转换为 Javascript 数组

    我想将 Laravel 中的数组分配给 JavaScript 数组 我已经从我的AppServiceProvider和 json decoded 它像 View composer function view users Users all
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • laravel 5.3 新的 Auth::routes()

    最近开始使用laravel 5 3写博客 但是运行后出现一个问题php artisan make auth 当我运行这个时 它会在我的web php 这是其中的代码 Auth routes Route get home HomeContro
  • postgresql中数组的区别

    我有两个数组 1 2 3 4 7 6 and 2 3 7 在 PostgreSQL 中可能有共同的元素 我想做的是从第一个数组中排除第二个数组中存在的所有元素 到目前为止我已经取得了以下成果 SELECT array SELECT unne
  • php无法在docker-compose中连接到mysql

    这是我的 docker compose version 2 services nginx image nginx 1 11 8 alpine ports 8081 80 volumes code usr share nginx html h
  • NumPy 和 SciPy - .todense() 和 .toarray() 之间的区别

    我想知道使用是否有什么区别 优点 缺点 toarray vs todense 在稀疏 NumPy 数组上 例如 import scipy as sp import numpy as np sparse m sp sparse bsr mat
  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • 访问 Magento 购物车和/或结帐中的运费

    请注意 这个问题是关于运费 而不是价格 有一个重要的区别 即运输方式为店主支付的费用是多少 而不是客户支付的费用 The shipping tablerate数据库表包括一个cost字段 该字段填充在Mage Shipping Model
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • Doctrine2:入门教程“没有要处理的元数据类”

    我已经将本教程的第一部分运行了三遍 到目前为止 在这里或其他地方进行的大量搜索都无法帮助我使其发挥作用 我收到 没有要处理的元数据类 当我尝试时 php vendor bin doctrine orm schema tool update
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 在多个数组中搜索字符串,然后设置 var - jQuery

    我正在寻找基于字符串存在于哪个数组中设置一个变量 例如 var primary red blue yellow var secondary orange purple green 然后检查 purple 并返回它在 secondary 数组
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐

  • 上述查询中表空间的用途是什么?

    CREATE TABLE ts pcode tb incase TABLESPACE USERS AS SELECT FROM ts pcode tb 上述查询中表空间的用途是什么 表空间是数据库中数据文件的逻辑组 数据库通常包含至少一个表
  • Dart 使用 RegExp 从 String 中获取轨迹元素

    当我从我们的网站 url 检索数据时 会在其余 api 字段之一中返回此输出 并且我尝试查找是否tracks包含我从下面的内容中获取网址tracks来源是我需要得到 String test div class n div class div
  • symfony assetic 在请求文件时给出 500 错误

    EDITED 我正在使用 assetic 和 symfony2 每次我尝试加载页面时 在请求 JS 和 CSS 文件时 我的浏览器都会收到 500 错误 如果我在地址栏中输入该资源的地址 我就可以成功加载其文件 更奇怪的是 每当 Symfo
  • 如何配置用户上下文/表?

    随着新的 ASP NET MVC 5 预览版发布 如何配置用户上下文 表 在 MVC 4 中 我只使用我自己的 User 类 然后将 WebSecurity 初始化指向它 如下所示 WebSecurity InitializeDatabas
  • Fortran编译器

    我正在 Mac 上开发 Android 应用程序 有谁知道android 的fortran 编译器吗 我打算从 C 例程调用一些 Fortran 例程 然后用 java 类包装 C 例程并使用 JNI 来执行此操作 但是 我无法编译 For
  • 将 lambda 表达式应用于数组元素时出现 ValueError

    目前我在处理 numpy array 4x1 即时遇到错误 1 96113883 3 46144244 5 075857 1 77550086 使用 lambda 函数f lambda x x if x gt 0 else x 0 01 错
  • 通过 C# 代码更改货币

    我使用以下内容来显示金额 String Format 0 C item Amount 这个显示器 9 99 没关系 但是如果我希望应用程序能够控制货币并能够更改货币 该怎么办 9 99 如何通过代码更改货币格式 货币符号由 CultureI
  • haskell 检查用户输入错误

    我在 haskell 中编写应用程序 我想知道这是检查用户输入是否正确的最佳方法 例如当我要求 int 时它是 int 还是当要求格式良好的日期时它是日期 感谢帮助 Use maybeRead 该函数是一个候选函数 包含在 Haskell
  • 在 Windows 上配置 package.json

    我正在尝试在 Windows 上管理 React 项目的配置 它之前在 Mac 上运行 我在用着yarn build 在 的里面package json scripts gt build被配置为 rm rf deployment stati
  • Ruby:将两个哈希合并为一个并连接值

    2 hash h1 s1 gt 2009 7 27 s2 gt 2010 3 6 s3 gt 2009 7 27 h2 s1 gt 12 29 15 s2 gt 10 00 17 s3 gt 12 25 52 我想将两个哈希合并为一个 如下
  • sbt 编译时警告:类型模式 List[String] 中的非变量类型参数 String

    我的 sbt 显示警告消息 non variable type argument String in type pattern List String the underlying of List String is unchecked s
  • Eclipse 意外退出 2022-06 [重复]

    这个问题在这里已经有答案了 我开始学习Java 几天来一直遇到这个错误 我安装了 eclipse 并且运行得很好 第二天 当我尝试打开该应用程序时 它打不开 并且收到一条消息 无法打开应用程序 Eclipse 进而 Eclipse 意外退出
  • Python 和 urllib2:如何使用参数发出 GET 请求

    我正在构建一个 API API 它基本上是内部 REST Web 服务的包装器 Web 应用程序将向该服务发出大量请求 一些Web服务调用需要是GET而不是POST 而是传递参数 是否有一种 最佳实践 方法将字典编码为查询字符串 例如 fo
  • 有选择地从 MySQL 中删除大部分重复的记录

    我有一张桌子 PRICE UPDATE id int 5 auto increment primary unique part number varchar 10 non null price float 10 2 non null 一些p
  • 如何从 SQL Server 导出到 XML

    从 SQL Server 表或视图 导出到 XML 的最简单方法是什么 这就是我到目前为止所做的 执行Sql任务 SELECT FROM Production Product FOR XML AUTO TYPE ROOT Data 结果集
  • F# 编译错误

    我有以下导致编译错误的 F 代码 persistence fs 32 21 错误 FS0072 根据此程序点之前的信息查找不确定类型的对象 在此程序点之前可能需要类型注释来约束对象的类型 这可以使查找得以解决 错误出现在 serialize
  • 正则表达式如何匹配除空行之外的所有行尾?

    如果我有文字 AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE FFFFFF GGGGGG HHHHHH 我想匹配除空行之外的所有行尾并将行尾替换为制表符 s 部分有效 但它也匹配非空行的最后一个字符 不起作用 什么是正
  • GNU 语句表达式的编译器支持

    哪些现代编译器支持 Gnu 语句表达式 C 和 C 语言 我应该在什么版本中使用语句表达式 语句表达式就像 code code retval int b 56 int c int a a sin b a 我已经知道一些这样的编译器 海湾合作
  • 如何编写一个以 C++ 代码作为输入的 C++ 代码生成器?

    我们有一个 CORBA 实现 可以为我们自动生成 Java 和 C 存根 由于 CORBA 生成的代码很难使用 因此我们需要围绕 CORBA 代码编写包装器 帮助器 所以我们有一个两步代码生成过程 是的 我知道这很糟糕 CORBA IDL
  • PHP/MySQL 更好的用户搜索

    为了让代码焕发新的活力 我大部分时间都是在 14 多年前编写的 我发现我当时写的可爱的小设置 在某些地方缺乏 即处理用户输入 Lesson 永远不要低估用户通过验证器注入垃圾 拼写错误和欺骗的能力 旧方法已达到临界质量 因为 SELECT