【问题标题】:selecting age group using dob during search在搜索期间使用 dob 选择年龄组
【发布时间】:2013-07-04 04:06:35
【问题描述】:

我正在尝试实现用户可以搜索 18 岁以上或以下的候选人的搜索。

搜索中年龄组件的html:

  Age<select id ='eighteen' name="eighteen" size="1" >
  <option value="Below Eighteen">Below Eighteen</option>
  <option value="Above Eighteen">Above Eighteen</option>
  <option value="Any">Any</option>
   </select> 

php代码:

$age = trim($_POST['eighteen']);    

$query2 = mysql_query("SELECT * FROM p_candidate WHERE YEAR(CURDATE())-YEAR(`age`) >= 18");
$query = mysql_query("SELECT * FROM p_candidate WHERE YEAR(CURDATE())-YEAR(`age`) < 18");
if ($age =="Below Eighteen") {$dob = $query;}
if ($age == "Above Eighteen") {$dob = $query2;}



$Odata = mysql_query("SELECT * FROM p_candidate WHERE(`gender` LIKE '%".$Gender."%') AND (`age` LIKE '%".$dob."%')") or die(mysql_error());

当我在不填写搜索表单中的性别字段的情况下运行此代码时,我没有得到任何结果。我怎样才能让它工作?我需要修改哪个部分?

我的数据库在 mysql 中,候选人的出生日期存储在名为 age 的列中

【问题讨论】:

  • 2 if 语句 ???一个人的年龄怎么可能同时低于 18 岁或高于 18 岁?尝试其他如果:)
  • 如果他们正好是 18 岁呢?
  • 我已将 query2 更改为 $query2 = mysql_query("SELECT * FROM p_candidate WHERE YEAR(CURDATE())-YEAR(age) >= 18");
  • @HardikThaker - 试过 elseif 但没用
  • $data = mysql_query("SELECT * FROM p_candidate WHERE (gender LIKE '%".$Gender."%') AND (age LIKE '%".$dob."% ')") 或死(mysql_error());

标签: php html mysql


【解决方案1】:

要查看他们是否至少 18 岁,您可以从当前日期减去 18 岁,然后将他们的出生日期(似乎是 age 列)与该日期进行比较。

18 岁或以上

SELECT * FROM p_candidate WHERE age <= CURDATE() - INTERVAL 18 YEAR

18 岁以下

SELECT * FROM p_candidate WHERE age > CURDATE() - INTERVAL 18 YEAR

我也会避免在您不需要时使用LIKE。如果您正在检查性别F 或性别M,那么只需说WHERE gender = 'F'WHERE gender = 'M'。过度使用 LIKE 将一无所获,并且可能会降低原本可优化的查询速度。

【讨论】:

  • 感谢@EdGibbs,但我仍然无法让代码返回值。
  • 可能是你的 PHP 代码。在您的示例中,您将$dob 设置为$query$query2,但是当您实际执行查询(代码的最后一行)时,您正在运行一个完全不同的查询。如果您将$dob 设置为我的查询之一(加上性别逻辑),然后运行$dob 查询,它应该可以正常工作。另请注意,您不应该使用 mysql_* 系列函数,因为它们可能导致 SQL 注入 - 有许多来自编码人员的帖子,他们的网站因使用 mysql_* 方法而被黑客入侵,这是一种职业 -限制您的网站被黑客入侵。
  • 感谢@EdGibbs - 我终于让它工作了:) 我已经在答案中发布了代码 sn-ps。非常感谢您的意见!!!
  • 不客气,但请注意,您减去年份的逻辑不太正确。假设候选人的出生日期为9/27/1995。你的逻辑会让他们到今天才 18 岁,但他们实际上不会再过三个月才 18 岁。如果这足够接近,那么没有问题。如果没有,请尝试我的解决方案,它一直有效。
【解决方案2】:

强制为您的选择设置默认值,以便该字段始终填充一些内容。 像这样:

 Age<select id ='eighteen' name="eighteen" size="1" >
  <option value="Below Eighteen">Below Eighteen</option>
  <option value="Above Eighteen">Above Eighteen</option>
  <option value="Any" selected>Any</option>
  </select> 

【讨论】:

  • 这是一个非常有价值的建议@GuiGreg
【解决方案3】:

这是我最终使用的 - 现在可以使用了

if ($age == "Above Eighteen") {
$Odata = mysql_query("SELECT * FROM p_candidate WHERE(`gender` LIKE '%".$Gender."%') AND     (YEAR(CURDATE())-YEAR(`age`) >= 18)") or die(mysql_error());}

if ($age == "Below Eighteen") {
$Odata2 = mysql_query("SELECT * FROM p_candidate WHERE(`gender` LIKE '%".$Gender."%') AND     (YEAR(CURDATE())-YEAR(`age`) < 18)") or die(mysql_error());}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多