【问题标题】:How can i put a column of results into an array and compare then with another column with PHP?如何将一列结果放入数组中,然后与 PHP 的另一列进行比较?
【发布时间】:2012-04-03 21:19:13
【问题描述】:

我的系统是基于驾照申请的。如果用户可以申请不同级别的许可证,例如用户要申请 5 级许可证,则必须具备 2 级和 3 级的先决条件。

在我的数据库中,我有 2 个相关表,其中 1 个是存储用户已申请或正在等待批准的所有许可证的许可证。另一个表格是许可证类型的描述,它指示用户可以申请的每个可用许可证及其先决条件和描述。

许可(PID、EID、PTYPE、STATUS、DATETIMEAPP)

类型(TYID、PTYPE、PREREQ1、PREREQ2、REQEXP、DES)

我的计划是从数据库中检索数据

$query= "select PTYPE from permit where eid = $user"
$result = mysql_query($query, $conn);

将结果存储为数组

while ($row = mysql_fetch_assoc($result))
{
    $result_array[] = $row;
}

从类型表中检索先决条件

$query= "select PREREQ1 , PREREQ2 from type where TYID = $appliedPermit"
$result = mysql_query($query, $conn);

将 2 个结果与布尔值进行比较(我不确定如何编码)

如果结果为真,则继续,否则返回上一页并弹出一个窗口,通知用户他们尚未满足先决条件。 (我知道我需要 if else 语句但不知道如何写条件)

你们认为我在正确的道路上吗?我不确定它是否会起作用......但希望这里的任何人有更好的建议。

稍微重组:

我的系统旨在让用户申请驾驶许可证...总共有 9 个许可证 - Class 1, Class 2, Class 3. Cat 2PG, Cat 3PG, Car4PG, Cat 1OR, Cat 2OR, Cat 3OR 、Cat 2TT 和 Cat 3TT。例如 Cat 3TT 要求用户拥有 Cat 2TT 和 Cat 2PG。也就是说,Cat 3TT 的先决条件是 Cat 2TT 和 Cat 2PG。

我想使用 PHP 从数据库中提取所有需要的值并比较它们,看看用户是否满足了先决条件,然后如果他得到 1,则允许他继续进行医疗问卷调查。

问题是:我不知道如何从逻辑上编码出来,我试过了,但没有用。希望能得到更多的意见和解决我的问题。非常感谢您。非常感谢您的帮助。

【问题讨论】:

  • 在阅读了您的问题几次之后,我仍然不太确定您真正想要比较的是什么。您能否详细说明或重新表述您的问题?
  • @thrau 嗯...我对问题进行了重组...希望它更好...我将其添加到编码的底部。

标签: php database comparison


【解决方案1】:

您只能在一个查询中检查先决条件:

$query = "SELECT t.tyid, t.prereq1, t.prereq2
, (CASE WHEN (t.prereq1 IS NOT NULL) AND (p1.ptype IS NULL) THEN 1 ELSE 0 END) AS missing1
, (CASE WHEN (t.prereq2 IS NOT NULL) AND (p2.ptype IS NULL) THEN 1 ELSE 0 END) AS missing2
FROM type AS t
LEFT JOIN permit AS p1 ON (t.prereq1=p1.ptype) AND ( p1.eid = $user )
LEFT JOIN permit AS p2 ON (t.prereq2=p2.ptype) AND ( p2.eid = $user )
WHERE ( t.tyid IN (".implode(',', $appliedPermit).") )";

$result = mysql_query($query, $conn);
while ($row = mysql_fetch_assoc($result)) {
  echo "permit ".$row['tyid']. " : "
  echo "prerequisites = ".$row['prereq1'].", ".$row['prereq2'];
  if ( ($row['missing1']==1) && ($row['missing1']==1) ) {
    echo ", result = ok <br>";
  } else {
    echo ", result = failed <br>";
  }
}

此查询返回两个先决条件 id ;但如果先决条件 #1 缺失,missing1 的值为 1,如果先决条件 #2 缺失,missing2 的值为 1。

注意:我已经更新了我的帖子以回复您下面的两个 cmets。

【讨论】:

  • 如果不是我所有的许可证都有 2 个先决条件,例如在数据库中,一些先决条件将具有空值,这个查询仍然有效吗?非常感谢
  • 是的,它会起作用,但需要稍作调整才能更好地理解 missing1missing2。用(CASE WHEN (t.prereq1 IS NOT NULL) AND (p1.ptype IS NULL) THEN 1 ELSE 0 END) 替换missing1 表达式,因此用一个表示missing2。那么只有当实际存在一个先决条件并且它缺失时,missing1 和 missing2 才会等于 1。
  • 我的 $appliedPermit 将是一个结果数组......我如何让它单独比较?我可以像我如何从数据库中排出数据一样使用 while 循环吗?提前谢谢
  • 或者我应该使用 foreach() 吗?
  • 嗨...你介意解释一下LEFT JOIN permit AS p1 ON (t.prereq1=p1.ptype) AND ( p1.eid = $user ) LEFT JOIN permit AS p2 ON (t.prereq2=p2.ptype) AND ( p2.eid = $user ) 做了什么吗?是不是只能比较过去的两个许可证?
【解决方案2】:

运行以下查询,然后将结果作为用户需要的先决条件打印给用户。

 SELECT prereq1, prereq2 from type 
 where tyid = $appliedPermit 
 and prereq1 not in (select  ptype from permit where eid = $user) 
 and prereq2 not in (select ptype from permit where eid= $user);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多