【问题标题】:How to fill <select> with options using PHP and SQL?如何使用 PHP 和 SQL 填充 <select> 选项?
【发布时间】:2016-10-03 17:10:08
【问题描述】:

我的问题是:我想使用 php 从&lt;select&gt; 中的特定表中显示所有 SQL 答案。

我试图让它工作,但没有多大成功,因为它只显示一个结果。

<?php
error_reporting(E_ALL);
include 'connect.php';
include 'header.php';
set_time_limit(10);


$cat = $bdd->query('SELECT cat_id,cat_name,cat_description FROM categories');
$categories_list = $cat->fetch();


While ($categories_list = $cat->fetch()) {
$cat_name = $categories_list['cat_name'];
}


$cat->closeCursor();

echo '<form method="post" action="accès/create_topic_post.php">';
echo '<label for="sujet">Sujet :';
echo '<input type="text" name="sujet" id="sujet" required autofocus>';
echo '</label>';
echo '<label for="cat">Catégories :';
echo '<select name="topic_name">';
echo "<option value=\"".$cat_name."\" >$cat_name </option>";
echo '</select>';
echo '<input type="submit" value="Envoyer">';
echo '</form>';

?>

【问题讨论】:

  • 你必须为此使用循环。
  • 欢迎来到 Stack Overflow。

标签: php mysql pdo forum


【解决方案1】:

这完全不是这样做的方法。将 PHP 和 HTML 分开。并确保在循环内回显option。像这样的:

<form method="post" action="accès/create_topic_post.php">
  <label for="sujet">Sujet :
    <input type="text" name="sujet" id="sujet" required autofocus>
  </label>
  <label for="cat">Catégories :
    <select name="topic_name">
    <?php
    // Loop it here.
    while ($categories_list = $cat->fetch()) {
        $cat_name = $categories_list['cat_name'];
        echo "<option value=\"".$cat_name."\" >$cat_name </option>";
    }
    ?>
    </select>
  </label><!-- You forgot this -->
  <input type="submit" value="Envoyer" />
</form>

【讨论】:

  • 有些人想看世界因你的反对票而燃烧,对吧?什么原因?
  • 我认为这个答案没有明显的 DV 理由
  • @RiggsFolly 没错,正如我所说,“有些人想看着世界燃烧”。大声笑。
  • 你是对的,DV没有分享理由或改进,不好的方法
【解决方案2】:

有两种方法可以实现您想要的输出。

方法一:

cat_name 存储在一个新数组中,并在您的 HTML 或任何您想使用的地方使用它。

<?php
$cat_name = array();
while($categories_list = $cat->fetch()) {
  $cat_name[] = $categories_list['cat_name'];
}
?>

<select name="topic_name">
<?php
foreach ($cat_name as $key => $value) {
?>
  <option value="<?=$value?>" ><?=$value?> </option>
}
?>
</select>

方法2:

<?php
while ($categories_list = $cat->fetch()) {
?>
   <option value="<?=$categories_list['cat_name']?>" ><?=$categories_list['cat_name']?> </option>
<?php
}
?>

您的代码有什么问题:

$cat_name = $categories_list['cat_name']; 这只会存储查询的最后一个值,您必须将值存储在数组中或在while() 循环中使用&lt;option&gt;

【讨论】:

    【解决方案3】:

    每次从 SQL 服务器读取数据时,您都会不断替换 cat_name。你需要将它存储在一个数组中

    <?php
        error_reporting(E_ALL);
        include 'connect.php';
        include 'header.php';
        set_time_limit(10);
    
    
        $cat = $bdd->query('SELECT cat_id,cat_name,cat_description FROM categories');
        //$categories_list = $cat->fetch(); This line discards a row of data
    
    
        $cat_names = array();   //array for category names
        While ($categories_list = $cat->fetch()) {
            //Add newest 'cat_name' to the array
            $cat_names[] = $categories_list['cat_name'];
        }
    
    
        $cat->closeCursor();
    
        echo '<form method="post" action="accès/create_topic_post.php">';
        echo '<label for="sujet">Sujet :';
        echo '<input type="text" name="sujet" id="sujet" required autofocus>';
        echo '</label>';
        echo '<label for="cat">Catégories :';
        echo '<select name="topic_name">';
        //Loop and read back each category name
        foreach ($cat_names as $cat_name){
            echo "<option value=\"".$cat_name."\" >$cat_name </option>";
        }
        echo '</select>';
        echo '<input type="submit" value="Envoyer">';
        echo '</form>';
    
    ?>
    

    【讨论】:

    • 这是迄今为止发布的最佳答案。看到它是唯一一个在业务逻辑和输出生成之间明确区分关注点的方法。我唯一要改变的是删除closeCursor()调用,因为在这个例子中不需要它,并在回显$cat_name时使用htmlspecialchars()来防止XSS。
    • @YourCommonSense:为什么不呢?
    • @YourCommonSense:您指的是由于循环外的fetch() 语句,它会删除第一行吗?诸如“它不起作用,自己找出原因”之类的神秘问题。通常是非常无用的,至少没有提示作者应该看哪里。
    【解决方案4】:

    您不必手动循环遍历结果,因为 PDO 已经有一个可以为您完成的函数,称为 fetchAll()。如果要获取行数组,则必须使用它而不是 fetch()。

    但是,除此之外,您还需要学习 PHP 和一般编程。因为您当前的代码没有什么意义。要输出一个数组,你必须使用一个循环:

    $cat = $bdd->query('SELECT cat_name FROM categories');
    $categories_list = $cat->fetchAll(PDO::FETCH_COLUMN); // here it is
    
    echo '<form method="post" action="accès/create_topic_post.php">';
    echo '<label for="sujet">Sujet :';
    echo '<input type="text" name="sujet" id="sujet" required autofocus>';
    echo '</label>';
    echo '<label for="cat">Catégories :';
    echo '<select name="topic_name">';
    foreach ($categories_list as $cat_name)
    { 
        echo "<option value='$cat_name'>$cat_name</option>";
    }
    echo '</select>';
    echo '<input type="submit" value="Envoyer">';
    echo '</form>';
    

    【讨论】:

    • 更好但是,它只是一些int
    • 哦,是的。我盲目地复制粘贴了您的查询。现在已经修复了
    • 非常感谢:D
    【解决方案5】:

    将 fetch 循环移动到代码的输出部分。

    所以不要这样:

    echo "<option value=\"".$cat_name."\" >$cat_name </option>";
    

    移动循环,使其看起来像这样:

    While ($categories_list = $cat->fetch()) {
      $cat_name = $categories_list['cat_name'];
      echo "<option value=\"".$cat_name."\" >$cat_name </option>";
    }
    

    【讨论】:

      【解决方案6】:

      在选择 option 中输出类别时使用 while 循环。

      这样,

      While ($categories_list = $cat->fetch()) {
             echo "<option value=\"".$categories_list['cat_name']."\" >$categories_list['cat_name'] </option>";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        相关资源
        最近更新 更多