2014-12-30 43 views
1

我遇到的问题是"category"选项中没有结果。我试图使用两个whiles但这也不起作用。我如何安排我的表格与HTML和PHP

这是我的PHP:

try{ 
      $sel=$pdo->prepare("Select * from 
         actors inner join cat 
         on actors.id=cat.id"); 

    $sel->bindColumn(1,$actors_id); 
    $sel->bindColumn(2,$actors); 
    $sel->bindColumn(3,$cat_id); 
    $sel->bindColumn(4,$cat); 
    $sel->execute(); 




}catch(PDOException $e){ 

    die("error: " . $e->getMessage()); 

} 

,这是我的html:

<form action="" method="post"> 

    <label for="author">Author</label> 
     <Select id="author"> 

     //Show data from php file: 

    <?php while($sel->fetch()):?> 
     <?php echo "<option value='$actors_id'>$actors</option>";?> 
    <?php endwhile; ?> 
     </Select> 

     <label for="category">Category</label> 

     <Select id="category"> 

     //Show data again from php file: 

    <?php while($sel->fetch()):?> 
     <?php echo "<option value='$cat_id'>$cat</option>";?> 
    <?php endwhile; ?> 
     </Select>  
    </form> 

,这是它的样子:

enter image description here

如您所见,“类别”选项中没有信息显示。

如果我更改HTML到这样的事情,它不工作之一:

<Select id="author"> 

    <?php while($sel->fetch()):?> 
     <?php echo "<option value='$actors_id'>$actors</option>";?> 
     </Select> 

     <label for="category">Category</label> 
     <Select id="category"> 

     <?php echo "<option value='$cat_id'>$cat</option>";?> 
    <?php endwhile; ?> 
     </Select> 

现在看起来是这样的:

enter image description here

你有什么建议吗?

+0

第一个循环完成后没有任何结果。要么将结果存储在数组中,要么在数组上循环两次,要么在循环之间再次运行查询。 –

回答

1

您的第一个while循环会从PDOStatement对象中提取所有行,因此当您第二次调用while ($sel->fetch())时,它立即返回false。如果你想在基本上两个单独的循环中使用结果,首先将所有行取出到一个行数组中,然后遍历该数组。用fetchAll()这样做,而不是通过bindColumn()绑定到变量。

事实上,我会几乎总是建议取第一,而不是在显示逻辑,除了非常大的行集,其中的内存立刻将您的系统上繁重获取这一切消耗。

// Get all the rows as an array 
$rows = $sel->fetchAll(PDO::FETCH_ASOC); 

// Later loop for the items you need as many times as you need 
// Each new foreach will iterate the entire $rows array from start to end 
<?php foreach ($rows as $row): ?> 
<?php echo "<option value='{$row['actors_id']}'>" . htmlspecialchars($row['actors']) . "</option>";?> 
<?php endforeach; ?> 

<?php foreach ($rows as $row): ?> 
<?php echo "<option value='{$row['cat_id']}'>" . htmlspecialchars($row['cat']) . "</option>";?> 
<?php endforeach; ?> 

不要忘记在输出上调用htmlspecialchars(),以确保其正确编码为HTML。我还没有在cat_id,actors_id上这样做,因为它们被认为是整数,但如果不是,那么您应该使用htmlspecialchars($row['cat_id'], ENT_QUOTES)来确保HTML属性被正确引用。

+0

对我来说,每个演员会有多个类别,例如级联sel,在我眼里意味着JSON – mplungjan

+0

这工作完美,出于某种原因,如果我把$ rows = $ sql-> FetchAll(PDO :: FETCH_ASSOC);在$ sql-> execute()之前,它不起作用。你也推荐strip_tags或htmlspecialchars? –

+0

你可能在调用execute()后只能调用'fetchAll()',否则服务器将无法返回。 'strip_tags()'和'htmlspecialchars()'是非常不同的。当htmlspecialchars()正确地将一个像“String> substring”这样的值编码为“String > substring”以在HTML中使用时,'strip_tags()'从输出中删除任何完整的HTML标记。 ''strip_tags()'将用于如果你正在输入可能包含HTML但不希望它作为输出。 'htmlspecialchars()'用于其他任何事情。 –

2

你需要在你的回报吸尘器 -

<?php 
$result = $sel->fetchAll(PDO::FETCH_OBJ); //return an object 
foreach($result as $actor) { 
    echo '<option value=' . $actors->actor_id .'>'. $actor->actors .'</option>'; // note the quotes 
} 

?> 

您可以遍历结果多次,因为你需要,无需重新获取数据。