【问题标题】:How to add case statement to add break after every record?如何在每条记录后添加case语句以添加break?
【发布时间】:2017-11-04 13:19:04
【问题描述】:

当查找LIKE 'B%' 的下一条记录时,每行LIKE 'A%' 之后应该有一个中断。

$stmt = $con->prepare("SELECT * FROM fistevent WHERE Event_Id=? AND TicketType=? AND row_name REGEXP '^[A-Z]' ORDER BY row_name ASC");

$stmt->bind_param("ss", $_POST['EventId'],$_POST['TicketType']);
$stmt->execute();
$result = $stmt->get_result();
$numRows = $result->num_rows;
if($numRows > 0) {
    echo ' <div class="register">';
    while($r = $result->fetch_assoc()) {
        $EvntId = $r['Event_Id'];
        $RowName = $r['row_name'];

        echo '<ul id="sub" class="sub">';
            if($r['seats'] == null){ 
                echo '<li class="BlankSeat" ></li>';
            }elseif($r['Status'] == 'Y' || $r['Status'] == 'Hold'){
                echo '<li class="occupied" title="Row'.$r["seats"].'" name="'.$RowName.'" value="'.$r["seats"].'"></li>'; 
            }else{
                echo '<li class="Available" title="Row'.$r["seats"].'" name="'.$RowName.'" value="'.$r["seats"].'"></li>';
            }
        echo "</ul>";
   }
   echo '</div>';

I am getting the following output, but I want after `LIKE 'A%'` the next `LIKE 'B%'` should be in the next row.

更新代码在这里

$stmt = $con->prepare("SELECT * FROM fistevent WHERE Event_Id=? AND TicketType=? AND row_name REGEXP '^[A-Z]' ORDER BY row_name ASC");
$stmt->bind_param("ss", $_POST['EventId'],$_POST['TicketType']);
$stmt->execute();
$result = $stmt->get_result();
$numRows = $result->num_rows;
if($numRows > 0) {
    echo ' <div class="register">';
    $prev='A';  
    while($r = $result->fetch_assoc()) {
        $EvntId = $r['Event_Id'];
        $RowName = $r['row_name'];
        if($prev!=$RowName){
            echo "<br>";
            $prev=$RowName;
        }
        echo '<ul id="sub" >';
            if($r['seats'] == null){ 
                echo '<li class="BlankSeat" ></li>';
            }elseif($r['Status'] == 'Y' || $r['Status'] == 'Hold'){
                echo '<li class="occupied" title="Row'.$r["seats"].'" name="'.$RowName.'" value="'.$r["seats"].'"></li>'; 
            }else{
                echo '<li class="Available" title="Row'.$r["seats"].'" name="'.$RowName.'" value="'.$r["seats"].'"></li>';
            }
        echo "</ul>";
    }
    echo '</div>';
}else{
    echo "No seats Available";
}

**in responsive**

【问题讨论】:

  • @mickmackusa 先生,我只想在 LIKE 'A%' 记录之后添加中断。
  • @mickmackusa sir.看看更新的代码。看看我从这段代码中执行了什么
  • @mickmackusa 先生。我还更新了数据库表结构

标签: php mysql while-loop line-breaks sql-like


【解决方案1】:

这应该在每个唯一行之间(而不是在第一行之前)添加换行符,并将row_name 字母添加到每个唯一行的开头。

$prev='';
while($r=$result->fetch_assoc()) {
    if($prev!=$r['row_name']){
        if($prev!=''){echo "<br>";}                             // add breaks between rows
        echo "<ul id=\"sub\" class=\"sub\">{$r['row_name']} ";            // label the row
        $prev=$r['row_name'];                                 // store new row_name letter
    }else{
        echo "<ul id=\"sub\" class=\"sub\">";   // not a new row_name, extend existing row
    }
        if($r['seats']==null){ 
            echo "<li class=\"BlankSeat\"></li>";
        }elseif($r['Status']=='Y' || $r['Status']=='Hold'){
            echo "<li class=\"occupied\" title=\"Row{$r['seats']}\" name=\"{$r['row_name']}\" value=\"{$r["seats"]}\"></li>"; 
        }else{
            echo "<li class=\"Available\" title=\"Row{$r['seats']}\" name=\"{$r['row_name']}\" value=\"{$r['seats']}\"></li>";
        }
    echo "</ul>";
}

为了克服 OP 的 li {float:left} 样式,他在 css 中做了这个调整:

ul{display: table-cell; }


旧答案从这里开始:

我不知道 Bijender 的回答对您有何帮助,也不知道您为什么需要函数调用。我也不知道您所说的“在 LIKE 'A% 之后添加中断”是什么意思。

由于row_name 是一个单字母值,并且您只想返回值为 A、B、C、D、E、F、G、H、I 或 J 的行,那么您会希望这个更简单/ 更精细的查询:

SELECT *
FROM fistevent
WHERE Event_Id=? AND TicketType=? AND row_name IN ('A','B','C','D','E','F','G','H','I','J')
ORDER BY row_name ASC

我在您的帖子中发现的错误是您的表格列是EventIdEvent_Id。为了清楚起见,您应该更正这个错字。

【讨论】:

  • 首先非常感谢先生的回复。正如您在查询中所说,我刚刚更新了我的代码。我希望当循环获得“A%”的所有记录之后,下一个“B%”必须在下一行开始。这就是我要问的问题
  • @krish 这似乎是一个样式问题。您是否有影响此代码的 CSS?
  • @mickmackusa .. #seatarea { padding-top: 30px;宽度:100%; } ul{ 左边距:3%; }李{宽度:27px;向左飘浮;列表样式:无; }
  • @mickmackusa sir .i 添加了 ul{display: table-cell; } 并且它正在工作
  • @mickmackusa 是的,先生,一切都很好。你是非常聪明和聪明的人。非常感谢
【解决方案2】:

由于您是按 row_name 排序的,因此您只需检查新值是否与之前的值不同。

//setting firstLetter
$firstLetter = '1';
  while($r = $result->fetch_assoc()) {
        $EvntId = $r['Event_Id'];
        $RowName = $r['row_name'];


       echo '<ul id="sub" class="sub">';
        if($r['seats'] == null)
        { 
        echo '<li class="BlankSeat" ></li>';
        }
        else if($r['Status'] == 'Y' || $r['Status'] == 'Hold')
        {
        echo '<li class="occupied" title="Row'.$r["seats"].'" name="'.$RowName.'" value="'.$r["seats"].'"></li>'; 
        }
        else
        {
         echo '<li class="Available" title="Row'.$r["seats"].'" name="'.$RowName.'" value="'.$r["seats"].'"></li>';
        }
        //comparing current first letter with previous first letter,also skipping the break if it is the first row
         if($RowName[0] != $firstLetter &&  $firstLetter !='1'  ){
         echo "<br />";
        }
        $firstLetter = $RowName[0];

       echo "</ul>";
       }

【讨论】:

  • 我看到有一些关于另一个答案的讨论,其中包含对该答案的剽窃推断。我不认为这是有建设性的,所以我已经向版主报告了所有相关的 cmets。 FWIW,我认为人们无论如何都可以使用答案作为自己的基础。
【解决方案3】:

你可以在php中对like使用这个函数

function like_match($pattern, $subject)
{
    $pattern = str_replace('%', '.*', preg_quote($pattern, '/'));
    return (bool) preg_match("/^{$pattern}$/i", $subject);
}

例子

like_match('%A','Apple'); //TRUE
like_match('%c', 'coop'); //TRUE
like_match('%l', 'deke'); //FALSE
like_match('%m', 'flip-flop'); //FALSE

【讨论】:

  • 我只是像这样使代码更短。选择所有匹配的记录。
  • 使用查询 - $stmt = $con->prepare("select * from fistevent WHERE Event_Id =? and TicketType=? order by row_name ASC");
  • 现在我如何在获得名称 B 或 C 或 D 的记录时添加中断..是否可以添加以防万一
  • @mickmackusa 先生。当行字母更改时,下一个字母从下一行开始..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2020-01-21
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多