0

MySQL に変換された Access データベースがあります。「EmailAddress」、「HideEmailAddress」、「FaxNumber」、「HideFaxNumber」、「PhoneNumber」、および「HidePhoneNumber」フィールドを持つテーブル Contacts があります。非表示フィールドはすべてチェックボックスなので、値は 1 または 0 で、1 が TRUE です。

非表示フィールドの値が 1 の場合、MySQL Select ステートメントまたは PHP クエリで情報を表示しないようにする必要があります。また、3 つのフィールドのうち 1 つだけが非表示としてマークされることもよくあります。 、だから、「これらのいずれかが 1 である場合、すべてを非表示にする」というブランケットを行うことはできません。クエリを Web ページに出力する必要があり、各列の非表示フィールドの値に応じて、上記の 3 つのフィールドを表示または非表示にする必要があります. 私の SELECT ステートメントは 6 つの値すべてを取得し、PHP はそれを配列に変換しています.しかし、ここでは配列の比較が役立つとは思いません。

ここで何をすべきかわかりません。私は数日間探していましたが、必要なものに近づくものは何もないようです. 締め切りまでに完了するために、PHPループで非常にアドホックなif-elseif-elseを実行していますが、それには9または12の異なるステートメントが必要であり、これを行うためのより良い方法があると確信しています.

これが私のコードです。元のクエリから大幅に切り詰めましたが、そのクエリは機能するため、ここにタイプミスがある場合は、切り上げによるものです。別のフィールドの値に基づいてフィールドを抑制する方法がわかりません。これが、SELECT ステートメントに 2 つの AS ステートメントがある理由でもあります。元のクエリでは、5 つの異なるテーブルからの情報があり、両方に "FaxNumber" と "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.

?>
4

4 に答える 4

1
<?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.
于 2013-03-27T19:00:54.970 に答える
1

あなたは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>';
    }
}
于 2013-03-27T18:54:47.070 に答える
0

AND operator(($row['HidePhoneNumber'] == 1) && ($row['HideFaxNumber'] == 1) を使用しています。これは、条件付きコードを実行するには両方の条件が true でなければならないことを意味します。問題を解決するには、次のことができます。 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 を返す場合、関連付けられた配列メンバーがエコーされます。

于 2013-03-27T19:20:51.150 に答える
0

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);

これで始められるはずです。

于 2013-03-27T19:07:58.130 に答える