【问题标题】:How can I arrange my form with html and php如何用 html 和 php 排列我的表单
【发布时间】:2015-02-27 00:30:36
【问题描述】:

我遇到的问题是"category" 选项中没有结果。我尝试使用两个whiles,但这也不起作用。

这是我的 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>

这就是它的样子:

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

如果我将 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>

现在看起来像这样:

你有什么建议吗?

【问题讨论】:

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

标签: php html mysql pdo


【解决方案1】:

您的第一个 while 循环从 PDOStatement 对象中获取所有行,因此当您第二次调用 while ($sel-&gt;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 属性。

【讨论】:

  • 在我看来,每个演员会有不止一个类别,例如一个级联的sel,在我眼里就是JSON
  • 这工作得很好,如果我把 $rows=$sql->FetchAll(PDO::FETCH_ASSOC);在 $sql->execute() 之前,它不起作用。你还推荐 strip_tags 还是 htmlspecialchars??
  • 调用execute()后只能fetchAll(),否则服务器将没有任何返回。 strip_tags()htmlspecialchars() 非常不同。 strip_tags() 会从输出中删除任何完整的 HTML 标记,而 htmlspecialchars() 会正确地将诸如“String>substring”之类的值编码为“String>substring”,以便在 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
}

?>

您可以根据需要多次循环遍历结果,而无需重新获取数据。

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2017-02-25
    • 2013-04-22
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多