为了让代码焕发新的活力,我大部分时间都是在 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)。当我尝试修复损坏的东西时,我正在努力加快这些事情的进展。
已经看过的地方:
- PHP mysql 在 WHERE 子句中使用数组 https://stackoverflow.com/questions/907806/php-mysql-an-array-in-where-clause
- PHP/MySQL小规模模糊搜索 https://stackoverflow.com/questions/1914671/php-mysql-small-scale-fuzzy-search
- MySQL 子字符串模糊搜索 https://stackoverflow.com/questions/39145910/mysql-substring-fuzzy-search
- 复杂的名称查找 https://forums.mysql.com/read.php?20,282935,282935#msg-282935