【问题标题】:Preselect dropdown option during while loop based on value在while循环期间根据值预选下拉选项
【发布时间】:2019-04-08 07:23:07
【问题描述】:

我有两个表,一个 Workorder 表,其中有一个名为 status_id 的列,它让我知道订单的状态,如果它未触及、进行中或已完成。它只是保存状态的数值。

我有另一个名为 Status 的表,它具有匹配的 status_id 和状态文本。

我有一个下拉式 while 循环,可以拉出状态表并将其显示出来。

我正在尝试让它选择与工作订单表状态关联的下拉选项。

<select name="status" class="form-control input-default" required>
<option selected disabled>Status</option>       
<?php
$status_sql = "SELECT * FROM STATUS";   
$result_status = $conn->query($status_sql);
while ($status_row = $result_status->fetch_assoc()) {
$status_id   = $status_row['status_id'];
$status_name = $status_row['status_text'];
//select status based on value in workorder row
$select_status = (1 == 1)? 'selected="selected"':'';
echo '<option value="' . $status_id . '" '.$select_status.'>'.$status_name . '</option>';   
}
?>
</select>

我正在使用这个 php 代码作为一个等于来回显所选的 html 标记

我正在尝试将两个表合二为一

$sql = "SELECT *, w.status_id as wid, s.status_id as sid 
FROM WORKORDER w 
INNER JOIN STATUS s 
ON w.status_id = s.status_id
";

然后把语句变成这个

$select_status = ( $status_row['sid'] == $status_id  = $status_row['status_id'])? 'selected="selected"':'';

我无法弄清楚是否有人可以帮助我。谢谢!

【问题讨论】:

  • 提示:切勿使用SELECT *
  • 1 查询是否返回您期望它返回的内容? 2 在您问题的示例表中,status_id == 2,但在 Status 表中没有 status_id == 2。 3 您的查询应至少返回 order_id 和 status_id。 4 供您选择,获取所有现有状态。循环时,如果循环元素的status_id ==正在处理的order_id的status_id,则添加selected = "selected"5 所以 2 个循环。 1:工单。 2:状态,在循环 1 内。
  • 这一行:$select_status = (1 == 1)? 'selected="selected"':''; 1 总是等于 1,所以它总是设置为选中。这个(1 == 1) 比较应该类似于($Workorder-&gt;status_id == $status_id)

标签: php mysql loops select while-loop


【解决方案1】:

试试这个,获取数组中的状态以显示选择并将 status_id 与您的工单的 status_id 进行比较

   $status_sql = "SELECT status_id,status_text FROM STATUS";   // keep this query out of while, else will run n times //
    $result_status = $conn->query($status_sql);
    //$statuses = $result_status->fetch_all(MYSQLI_ASSOC); //requires MySQL Native Driver (mysqlnd)
    $statuses = []; 
    while($status_row = $result_status->fetch_assoc()){
       $statuses[] = $status_row;
    }

    $workorder_sql = "SELECT first_name, status_id FROM wordorder LIMIT 0,30";  // or do a where id= if this is a single workorder page 
    $result_workorder = $conn->query($workorder_sql );
    while ($workorder_row = $result_workorder->fetch_assoc()) {

    //rest of code/logic/form fields
    ?>

    <select name="status" class="form-control input-default" required>
    <option selected disabled>Status</option>       
    <?php
    foreach($statuses as $status) {
    $status_id   = $status['status_id'];
    $status_name = $status['status_text'];
    //select status based on value in workorder row
    $select_status = ($workorder_row['status_id']  == $status['status_id'])? 'selected="selected"':'';
    echo '<option value="' . $status_id . '" '.$select_status.'>'.$status_name . '</option>';   
    }
    ?>
    </select>
}

【讨论】:

  • 嗨,谢谢@Manpreet 的帮助,我已经对其进行了一些编辑,以获取基于 $_GET 的单个工作订单 ID。它给了我错误 Uncaught Error: Call to undefined method mysqli_result::fetch_all() in editorder.php:169 Stack trace: #0 {main} throw in editorder.php on line 169 line @ 987654322@
  • 更新了答案。
  • 太棒了,感谢支持!我会要求我的主机安装 mysqlnd。
【解决方案2】:

因为您要加入ON w.status_id = s.status_id,所以这两个值在SELECT *, w.status_id as wid, s.status_id as sid 中将是相同的(另外,您没有使用别名列$status_row['wid'])。

把你的赋值和比较逻辑拼凑在一起,看看你给自己造成的麻烦:

代码:(Demo)

$status_row['sid'] = $status_row['status_id'] = 3;
foreach (range(1, 5) as $status_id) {
    $select_status = ( $status_row['sid'] == $status_id  = $status_row['status_id'])? 'selected="selected"':'';
    var_dump($select_status);
}

输出:

string(19) "selected="selected""
string(19) "selected="selected""
string(19) "selected="selected""
string(19) "selected="selected""
string(19) "selected="selected""

你应该使用这个:Demo

$select_status = $status_row['sid'] == $status_id ? 'selected="selected"' : '';

输出:

string(0) ""
string(0) ""
string(19) "selected="selected""
string(0) ""
string(0) ""

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多