【问题标题】:PHP How to make a dropdown with database dataPHP如何使用数据库数据制作下拉菜单
【发布时间】:2018-08-28 20:23:03
【问题描述】:

所以我有这个database,它有一个名为selectedDates 的列。在该列中有一行的值

2018-08-22
2018-08-15
2018-08-20

请记住,这是 3 组日期,但在一行中。如何使用这三个值制作选择标签/下拉列表。这可能吗?如果需要更多信息,请告诉我,我会进行编辑。

下面是我的代码,用于让它在一列中执行下拉选项,但在不同的行中。比如

 Column 1
Row 1 -  Dog
Row 2 - Cat
Row 3 - Mouse

我需要它像

Column 1 
Row 1 - Dog,Cat,Mouse 

然后将下拉选项设置为狗猫鼠标

第 1 列下面的示例代码,3 个不同的行

 <?php
$con = new mysqli('localhost', 'root', '', 'races');

if($con->connect_errno) {
// error reporting here
}

$result = $con->query("SHOW TABLES");

if($result->num_rows > 0) {
echo '<select id="myTable" onchange="myFunction()">';
while($row = $result->fetch_array(MYSQLI_NUM)) {
    echo '<option value="Test" name="SelectedDate">' . $row[0] . '</option>';
}
echo '</select>';
} ?>

编辑回复评论 示例数据库

Id | Info | SelectedDates 
1    hi    2018-18,2018-19 
2    hi    2018-20,2018-21 

在您提供的代码中,在我的示例中,它只会创建一个 id 为 1 的下拉菜单,但如果我有另一行(如 id 2),我可以将 $row[0] 更改为 $row[1] 以让我的下拉菜单显示第二行选定的日期?

【问题讨论】:

标签: php html-select dropdown


【解决方案1】:
  • 如果您想在不明确检查connect_errno 属性的情况下检查连接,您可以简单地检查false $con 值。
  • 您应该指定要从结果集中访问的确切列。如果您只定位一行,则只查询那一行。
  • 作为更简洁的语法,您可以删除 &gt; 0 并检查非错误的 $result-&gt;num_rows 值。
  • 如果您想通过索引识别结果集列,可以使用$result-&gt;fetch_row()(同样更短的语法)
  • myTable 是您的 &lt;select&gt; 标记的不合适的 id 值——因为它不是“表格”。我不能推荐一个更好的,因为我不知道你更大的形式结构是什么。
  • &lt;option&gt; 标签不采用 name 属性,该属性位于父 &lt;select&gt; 标签中。
  • Test 的静态value 属性值设置为将导致所有选项提交相同的值:Test(显然这没有意义)。事实上,除非你需要重新格式化/修改日期值,否则根本不要写value 属性;只需依靠选项的文本来包含值。

未经测试的建议:(假设您只处理一行数据)

if (!$con = new mysqli('localhost', 'root', '', 'races')) {
    // connection error
} elseif (!$result = $con->query("SELECT selectedDates FROM `your_table` WHERE id = " . (int)$id)) {
    // query syntax error
} elseif (!$row = $result->fetch_row()) {
    // possible logic error, no row found
} else {
    echo '<select id="myTable" name="SelectedDate" onchange="myFunction()">';
    foreach (explode(",", $row[0]) as $date) {
        echo "<option>$date</option>";
    }
    echo "</select>";
}

【讨论】:

  • 这可行,但如果它来自不同的行,我可以相应地更改 $row[0] 吗?
  • 你的意思是你有几行有逗号分隔的值?您是否希望将所有行中的所有日期都作为 &lt;option&gt;s 在单个 &lt;select&gt; 中?还是您的意思是要为结果集的每一行创建一个新的&lt;select&gt;
  • [0] of $row[0] 是列标识符。如果您使用关联键,逗号分隔的值将通过$row['selectedDates'] 访问。
  • 如果您想要来自多行的所有selectedDates 数据,那么我建议在查询本身中进行分组(用逗号连接)。如果您想要单独的&lt;select&gt;s,则将第二个elseif 替换为else 并在其中编写一个while($row = $result-&gt;fetch_row()){ 循环。
  • 没关系,我想通了。基本上我只需要做'WHERE Id = 17'就可以了
【解决方案2】:

你说你必须把所有日期都放在同一列,为什么?

这不是对数据库的误解吗?如果一个值需要多行,您应该有一个带有“id | selectedDate”的表,这样您所说的问题就不会发生。

如果你一定要这样继续,你应该试试看这个:https://secure.php.net/manual/fr/function.explode.php

希望对你有帮助。

【讨论】:

  • 我需要一行中的所有日期,而不是列。我希望我可以添加图像来显示我的数据库的样子。我将所有行都设置为 Id 作为我的自动 int 主键。我不能使用explode,因为我没有使用任何数组。
  • 我们不需要你的数据库的图像,你可以去 phpmyadmin 并导出结构和行——事实上从志愿者的角度来看这是首选,因为这样细节是 100% 准确的我们可以复制粘贴。 explode() 不需要数组,它会创建一个。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2011-11-12
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多