比较值以给出不同的输出


Comparing values to give different outputs

我有一个已转换为MySQL的Access数据库。我有一个名为Contacts的表,其中包含字段"EmailAddress"、"HideEmailAddress"、"FaxNumber"、"HideFaxNumber"、"PhoneNumber"answers"HidePhoneNumber"。隐藏字段都是复选框,因此值为1或0,其中1为TRUE。

我需要,无论是在我的MySQL选择语句或在我的PHP查询,能够不显示信息,如果隐藏字段的值为1。此外,三个字段中通常只有一个字段被标记为hide,所以我不能做一个"如果其中任何一个字段是我隐藏所有字段"的毯子。我需要将查询输出到一个网页,并根据每个列的隐藏字段的值显示或隐藏上面的三个字段。我的SELECT语句正在检索所有六个值,PHP正在将其转换为数组,但我认为任何数组比较都不会在这里有所帮助。

我只是不知道我应该在这里做什么。我已经找了好几天了,但似乎什么都找不到。为了在截止日期前完成,我在PHP循环中运行了一个非常特别的if-else - if-else,但这需要9或12个不同的语句,我相信有更好的方法来做到这一点。

这是我的代码。我从最初的查询中删减了很多,但那个查询确实有效,所以如果这里有错别字,那是删减出来的。我只是不知道如何根据另一个字段的值来抑制一个字段。这也是为什么我在SELECT语句中有两个AS语句-在原始查询中,有来自五个不同表的信息,其中两个表中都有"FaxNumber"answers"EmailAddress"。我把AS留了下来,以防它改变了什么。

<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');
$query = 'SELECT Contact.CompanyID, Contact.WebContact, Contact.FirstName, Contact.LastName, Contact.WorkPhone, Contact.HidePhoneNumber, Contact.FaxNumber AS ConFaxNumber, Contact.HideFaxNumber, Contact.EmailAddress AS ConEmailAddress, Contact.HideEmailAddress FROM Contact WHERE TDAT_Contact.WebContact = "1"';
mysqli_query($dbc, $query);    
if($r = mysqli_query($dbc, $query)) { 
   while ($row = mysqli_fetch_array($r)) {
        if(($row['HidePhoneNumber'] == 1) && ($row['HideFaxNumber'] == 1)) {
    echo '<hr><div align="query"><span class="strong">Contact:</span> ' . $row['FirstName'] . ' ' . $row['LastName'] . '<br /><br /><span class="strong">Direct Email Address: </span>' . $row['ConEmailAddress'] . '</div>';    
        } elseif($row['HidePhoneNumber'] == 0) && ($row['HideFaxNumber'] == 0) {
    echo '<hr><div align="query"><span class="strong">Contact:</span> ' . $row['FirstName'] . ' ' . $row['LastName'] . '<br /><span class="strong">Direct Telephone: </span>' . $row['WorkPhone'] . '<br /><span class="strong">Direct Fax: </span>' . $row['ConFaxNumber'] . '<br /><span class="strong">Direct Email Address: </span>' . $row['ConEmailAddress'] . '</div>';}
}
     ...                          
     else { // Query didn't run.
          echo '<p style="color: red;">Could not retrieve the data because:<br />' . mysqli_error($dbc) . '.</p><p>The query being run was: ' . $query . '</p>';
               }
            }}
   mysqli_close($dbc); // Close the connection.
?>
<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.');
$query = 'SELECT Contact.CompanyID, Contact.WebContact, Contact.FirstName, Contact.LastName, Contact.WorkPhone, Contact.HidePhoneNumber, Contact.FaxNumber AS ConFaxNumber, Contact.HideFaxNumber, Contact.EmailAddress AS ConEmailAddress, Contact.HideEmailAddress FROM Contact WHERE TDAT_Contact.WebContact = "1"';
mysqli_query($dbc, $query);    
if($r = mysqli_query($dbc, $query)) { 
    while ($row = mysqli_fetch_array($r)) {
        echo '<hr><div align="query"><span class="strong">Contact:</span> ' . $row['FirstName'] . ' ' . $row['LastName'] . '<br />';
        if ($row['HidePhoneNumber'] == 0) {
            echo '<span class="strong">Direct Telephone: </span>' . $row['WorkPhone'] . '<br />';
        }
        if ($row['HideEmailAddress'] == 0) {
            echo '<span class="strong">Direct Email Address: </span>' . $row['ConEmailAddress'] . '<br />';
        }
        if ($row['HideFaxNumber'] == 0) {
            echo '<span class="strong">Direct Fax: </span>' . $row['ConFaxNumber'];
        }
        echo '</div>';
    }
} else { // Query didn't run.
    echo '<p style="color: red;">Could not retrieve the data because:<br />' . mysqli_error($dbc) . '.</p><p>The query being run was: ' . $query . '</p>';
}
mysqli_close($dbc); // Close the connection.

你可以在mysql中这样做,避免额外的php代码

类似这样假设隐藏字段是布尔值

$query = 'SELECT Contact.CompanyID, Contact.WebContact, Contact.FirstName,Contact.LastName, 
case when Contact.HidePhoneNumber then '' else Contact.WorkPhone end as WorkPhone,
case when Contact.HideFaxNumber then '' else Contact.FaxNumber end  AS ConFaxNumber,
case when Contact.HideEmailAddress then '' else Contact.EmailAddress and AS ConEmailAddress FROM Contact WHERE TDAT_Contact.WebContact = "1"';

那么在PHP中只需

if($r = mysqli_query($dbc, $query)) { 
    while ($row = mysqli_fetch_array($r)) {
        echo '<hr><div align="query"><span class="strong">Contact:</span> ' . $row['FirstName'] . ' ' . $row['LastName'] . '<br /><span class="strong">Direct Telephone: </span>' . $row['WorkPhone'] . '<br /><span class="strong">Direct Fax: </span>' . $row['ConFaxNumber'] . '<br /><span class="strong">Direct Email Address: </span>' . $row['ConEmailAddress'] . '</div>';
    }
}

将html输出分成小块,观察常见模式,并将其分解为函数:

function hide($field, $label, $row){
    if ($row['Hide'.$field] == 0)
        echo '<span class="strong">'.$label.'</span>'.$row[$field].'<br/>';
}
$hiddenfields = array ('EmailAddress' => 'Email Address', 'PhoneNumber' => 'Direct Telephone' /* etc. */);
foreach($hiddenfields as $field => $label)
     hide($field,$label,$row);

您正在使用AND运算符(($row['HidePhoneNumber'] == 1) &&($row['HideFaxNumber'] == 1),这意味着两个条件必须为真才能执行条件代码。为了解决这个问题,你可以在while循环和检查表达式中使用"嵌套循环",例如:

   $conditions=array("0"=>"phonenumber","1"=>"fax","2"=>"email") //associative array
   for($i=0;$i<count($conditions);$i++){
   if($row[$conditions[$i]]==1){
   echo $row.[$conditions[$i]];
    }
   else{
   echo "user doesn't want to share this information";
   }
  }
如果条件返回1,它将回显相关的数组成员。