【问题标题】:PHP: Getting recipient idPHP:获取收件人 ID
【发布时间】:2010-11-04 22:08:47
【问题描述】:

嘿,我的表单中有一个收件人字段,您可以在其中输入用户的全名,例如“john derek”。

现在我将它分解为 $firstname 和 $lastname

list($firstname, $lastname) = array_map('ucfirst', explode(' ', $recipient, 2));

如果有任何完全匹配,我如何检查数据库,获取 id。

表用户有“名字”和“姓氏”列

如果有一半匹配,如果只存在 firstname (john) 或 lastname(derek) 而不是两者,则 echo "Did you mean: John Derek?";

$qur = mysql_query('
 SELECT id, firstname, lastname, 
 (firstname = "$firstname" AND lastname = "$lastname") AS full FROM users 
 WHERE (firstname = "$firstname" AND lastname="$lastname") 
 OR (firstname LIKE "$firstname%" AND lastname LIKE "$lastname%")
 ORDER BY (firstname = "$firstname" AND lastname="$lastname") DESC');
 $get = mysql_fetch_array($qur);
 echo $get["full"] ."<br>";

我没有得到任何东西,即使 $firstname 是“John”而 $lastname 是“Derek”

也试过了:

echo $get["id"];
echo $get["lastname"]
echo $get["firstname"]

好像什么都没找到?怎么了?

【问题讨论】:

  • 如果您的收件人有三个或更多姓名怎么办?无论哪种方式,我认为您应该添加更多细节。是否有现成的收件人列表,用户只能在其中查找?或者“你的意思是”机制是如何发挥作用的?你的数据库表是什么样的?当用户输入“John D”时找到“John Derek”的 LIKE 搜索是否也是可行的,或者您是否需要分别匹配名字和姓氏?
  • 假设收件人没有。
  • 在收件人字段,我有一个自动提示,所以你不必写全名。回声“你的意思是”只是给我的,稍后再编辑,因为我想问用户他是否输入了这个名字(显示全名) - 如果它不是完全匹配。
  • @Johnson 但自动建议从何而来?是否有现有的收件人列表?您的数据库结构是什么样的?
  • 如果您输入“John Der”,它应该首先检查 John Der 上是否有任何完全匹配,如果没有则检查姓氏中的 John 和 LIKE 'Der',如果是,请显示您的意思是 John derek 吗?

标签: php mysql


【解决方案1】:

最简单的方法是进行 LIKE 查询:

 SELECT id, firstname, lastname FROM users 
 WHERE firstname LIKE "$firstname%"
 AND lastname LIKE "$lastname%"

(当然,别忘了清理变量)

这将匹配的用户输入:

Jo De
J Derek
John D

它会给你一个结果集。如果搜索John Der,有John DerekJohn Der,但不能保证John Der 会排在第一位。为此,您必须首先检查文字匹配:

 SELECT id, firstname, lastname, 
 (firstname = "$firstname" AND lastname="$lastname") AS full FROM users 
 WHERE (firstname = "$firstname" AND lastname="$lastname") 
 OR (firstname LIKE "$firstname%" AND lastname LIKE "$lastname%")
 ORDER BY (firstname = "$firstname" AND lastname="$lastname") DESC

这将首先给出完整匹配,然后是部分匹配。

可能需要进一步调整,但这应该是一个开始。

【讨论】:

  • 感谢您的回答。如果完全匹配您所写的内容,我该如何回应,如果不是,那么“您的意思是 john derek”
  • @Johnson 我更新了第二个大查询。它会在名为“full”的结果中为您提供第四个虚拟列。如果完全匹配,它将是“1”或“TRUE”(现在不确定,您必须对其进行测试)。
  • @Johnson 请注意,只有当大小写也匹配时,完整匹配才会匹配(“John Derek”而不是“jon derek”)。如果你想要这个更宽松,你需要strtolower() PHP 中的术语,并在 SQL 语句中的字段名称周围包裹一个LCASE()
  • @Johnson 是字符串问题,与查询无关。如果您使用 IDE,语法突出显示应该会告诉您问题出在哪里(通常是一些微不足道的东西,例如被遗忘的引号)。否则,打开一个新问题
  • 我有你的代码在 $qur = mysql_query("...");我得到了这个,当我删除 $qur 时我没有错误。-我使用记事本++
猜你喜欢
  • 2015-04-20
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多