【问题标题】:Php mysql query loop if statementphp mysql查询循环if语句
【发布时间】:2014-02-05 13:43:05
【问题描述】:

我想我正在尝试更改 php 表的 tr 的 bgcolor,它从循环中获取数据。在所有 php html 方面,我都是一个不错的菜鸟。一直在尝试这一天,但无法让它在查找数据时更改 bgcolor。

从 mysql 数据库获取所有数据的循环工作正常,现在我不知道如果超过 30 天并且状态为 OUT,如何进一步更改输出以更改 bgcolor。

这是我目前拥有并尝试的代码。任何帮助将不胜感激。

    $con=mysqli_connect($host, $db_user, $db_pass, $db);
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result = mysqli_query($con,"SELECT * FROM data");

$sql77 = "SELECT * FROM data WHERE dt_in < date_sub(curdate(), INTERVAL 30 DAY) AND status != OUT";
$result77 = mysql_query($con,$sql77);

echo "<table border='1'>
<tr bgcolor='lightgrey'>
<th>Signed in by</th>
<th>Reference Number</th>
<th>Asset Number</th>
<th>Make Model</th>
<th>Operating System</th>
<th>Office</th>
<th>Profile</th>
<th>Extra Apps</th>
<th>Time IN</th>
<th>Status</th>
<th>Time OUT</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
if (!$result77) {
echo "<tr>";
} else {
echo "<tr bgcolor='red'>";
}
  echo "<td>" . $row['who'] . "</td>";
  echo "<td>" . $row['ref'] . "</td>";
  echo "<td>" . $row['asset'] . "</td>";
  echo "<td>" . $row['make_model'] . "</td>";
  echo "<td>" . $row['os'] . "</td>";
  echo "<td>" . $row['office'] . "</td>";
  echo "<td>" . $row['swp'] . "</td>";
  echo "<td>" . $row['ea'] . "</td>";
  echo "<td>" . $row['dt_in'] . "</td>";
  echo "<td>" . $row['status'] . "</td>";
  echo "<td>" . $row['dt_out'] . "</td>";
  echo "</tr>";
  }
echo "</table>";
echo $result77;
mysqli_close($con);
?> 

这最终解决了我的问题。

    while($row = mysqli_fetch_array($result))
{
if(time() - strtotime($row['dt_in']) > 2592000 && $row['status'] != 'OUT') //2592000 sec == 30 days
{
echo "<tr class='MyOut'>";
} else {
echo "<tr>";
}
  echo "<td>" . $row['who'] . "</td>";
  echo "<td>" . $row['ref'] . "</td>";

【问题讨论】:

  • 所以...$result77 到底是在哪里定义的?它不在您的代码中的任何位置,因此if(!$result77) 将始终为真。
  • 这里没有定义 $result77:$sql77 = "SELECT * FROM data WHERE dt_in
  • html5 不支持 bgcolor 属性,在 html 4.01 中已弃用。改用 css。
  • 我很抱歉。我错过了获取电话。
  • 仍然不知道该怎么办,忙着用谷歌搜索并理解它。

标签: php mysql loops if-statement


【解决方案1】:

首先这个查询有一些问题SELECT * FROM data WHERE dt_in &lt; date_sub(curdate(), INTERVAL 30 DAY) AND status != OUT

一个问题是 OUT 需要单引号(因为我假设状态是 varchar?)。此外,通过此查询,我相信您正在尝试获取所有小于 30 天的行或状态!= 'OUT',因为您的背景为红色的标准是 dt_in &gt; 30 days and status == 'OUT' 并且逻辑否定(De摩根定律)是dt_in &lt;= 30 days or status != 'OUT'

也就是说,如果 $result77 查询返回了它应该在你的 php 代码中的推理,如果它超过 30 天,那么如果至少有 1 行小于或等于 30 天或状态不等于 OUT。你应该做的是做两个查询,1个查询less than or equal to 30 days old or status not equal to OUT的数据,1个查询older than 30 days and has status equal to out的数据。或者您可以去掉 $result77 =.. 查询并将 if(!$result77) 替换为

if(time() - strtotime($row['dt_in']) <= 2592000 || $row['status'] != 'OUT') //2592000 sec == 30 days

【讨论】:

  • 这非常适合日期的事情,我将 现在它将所有超过 30 天且状态为红色的行更改为红色,但我需要它变为红色,而不是OUT
  • 我想我终于找到了一个解决方案,主要使用了您建议的所有答案。做了 css 的事情,修改了 if(time() - strtotime($row 的事情......最后得到了这个...... while($row = mysqli_fetch_array($result)) { if(time() - strtotime($ row['dt_in']) > 2592000 && $row['status'] != 'OUT') //2592000 秒 == 30 天 { echo ""; } else { echo ""; } echo "" . $row['who'] . ""; echo "" . $row['ref'] . ""; echo "" . $row['asset'] . "";
【解决方案2】:

使用 CSS 选择器:nth-of-type( ):

table tr:nth-child(odd) { background-color: #ccc; } <br />

有一种脚本方式可以做到这一点,使用 PHP 或 Javascript,但 CSS 更好,因为 CSS 的主要功能是样式,而 PHP 无需这样做就会对服务器产生额外的负载,并且javascript也很好,但可以被用户禁用。
要标记已标记的行,例如超过 30 天,只需使用您拥有的表标志 dt_out 并使用 PHP 条件为行或单元格设置背景颜色。最好从 PHP 条件语句中调用一个类。

【讨论】:

    【解决方案3】:

    如果我没看错

    $result77 = mysql_query($con,$sql77);
    

    $result77 将始终导致 TRUE(查询成功)或 FALSE(查询失败)。在您的 while 循环期间,它不会每行更改。检查 $row 数组中的值应该可以解决问题。

    按照 cmets 中的建议,您可能应该使用 CSS(但出于测试目的,将“class='MyOut'”替换为“bgcolor='red'”应该可行)。

    while($row = mysqli_fetch_array($result))
    {
      echo "<tr";
    
      if ($row['status'] == 'OUT')
      {
        echo " class='MyOut'";
      }
    
      echo ">";
    
      ...remainder of output...
    
    }
    

    while($row = mysqli_fetch_array($result))
    {
      echo "<tr" . ($row['status'] == 'OUT' ? " class='MyOut'" : "") . ">";
    
      ...remainder of output...
    
    }
    

    在while循环之外,运行这一行(这里假设dt_in是一个YYYY-MM-DD字段。如果是别的,你需要在下面的调用中修改“Ymd”):

    $cDate = date("Y-m-d", mktime(0, 0, 0, date("n"), date("j") - 30, date("Y")));
    

    如果两个条件都满足:

    if (($row['status'] == 'OUT') && ($row['dt_in'] <= $cDate))
    

    如果满足任一条件

    if (($row['status'] == 'OUT') || ($row['dt_in'] <= $cDate))
    

    【讨论】:

    • 这是一个非常简单的 JSFiddle,让您了解输出的样子。 jsfiddle.net/ksvJ9
    • 太棒了,我想我正在取得进展...得到一个红色背景的行,你能告诉我我如何为 dt_in 列的日期超过 30 天的地方添加相同的内容吗?我目前在另一个位置使用此代码 SELECT * FROM data WHERE dt_in
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多