2016-10-03 42 views
-1

我的问题是:我想使用php显示<select>中的特定表中的所有SQL答案。如何填写使用PHP和SQL的选项<select>?

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

<?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>'; 

?> 
+3

你必须为此使用循环。 –

+3

欢迎来到堆栈溢出。 –

回答

1

您不必遍历结果手动,作为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>'; 
+0

更好,但它只是一些'int' –

+0

噢。我一味地复制粘贴你的查询。现在修好了 –

+0

非常感谢:D –

2

这完全不是这样做的。将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> 
+1

有些人想看看世界燃烧与你的downvotes权利?什么原因? –

+1

我在这个答案上看到没有明显的DV原因 – RiggsFolly

+0

@RiggsFolly正如我所说的那样,“有些人想看世界烧钱”。大声笑。 –

2

你不断替换每次从SQL Server读取数据时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>'; 

?> 
+0

这是迄今发布的最好的答案。看到它是唯一明确区分顾虑,业务逻辑和输出产生之间的关系。只有我会改变的是删除'closeCursor()'调用,因为在这个例子中不需要这个调用,并且在回显'$ cat_name'时使用'htmlspecialchars()'来防止XSS。 – ChristianF

+0

@YourCommonSense:为什么不呢? –

+0

@YourCommonSense:您是否指的是由于循环外的'fetch()'语句,它会删除第一行?这样的评论“不起作用,找出为什么你自己”。通常是无益的,至少没有暗示作者应该看的地方。 – ChristianF

1

将提取循环移至代码的输出部分。

因此,不是这样的:

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

移动的循环,这样它看起来就像这样:

当你在选择 option输出类别
While ($categories_list = $cat->fetch()) { 
    $cat_name = $categories_list['cat_name']; 
    echo "<option value=\"".$cat_name."\" >$cat_name </option>"; 
} 
1

使用while循环。

这样,

While ($categories_list = $cat->fetch()) { 
     echo "<option value=\"".$categories_list['cat_name']."\" >$categories_list['cat_name'] </option>"; 
} 
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'];这只会存储您的查询的最后一个值,你必须需要存储的值在数组中使用<option>或在while()循环内使用<option>