如何在HTML块中回显转义的PHP代码中的MySQLi行

时间:2015-01-04 02:45:37

标签: php html mysqli

我想知道什么是合适的语法是在HTML文本块中回显MySQLi代码中的一行。我正在开发一个页面,该页面在开始时使用PHP代码来确定会话是否已启动并在从MySQLi数据库中提取所述注释后发布用户已发布的注释。有趣和令人困惑的部分是,我已经完成了我在一个HTML div中尝试做的事情,但我似乎无法让它在下一个工作。

    <?php
    $page_title = "store";
    require_once('connectvars.php');
    require_once('startsession.php');
    require_once('header.php');

    // Connect to the DB
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    // Grab location data from the DB
    // Grab post data
    $query2 = "SELECT sp.post_id, sp.admin_id, sp.post, sp.date, sa.admin_id, s.store_name, s.store_city, s.store_state, s.store_zip,s.store_phone, s.store_email, s.store_address FROM store_posts sp, store_admin sa, stores s WHERE sp.admin_id='$admin_id' and sa.admin_id='$admin_id' and s.admin_id='$admin_id'ORDER BY date DESC";
    $data = mysqli_query($dbc, $query2);
    if (mysqli_num_rows($data) == 0) {
        $blankwall = "Empty feed? '<a href=manage.php><u>Click here</u></a> to manage posts and communicate with your customers!";
    }
?>
<body>
<div id="content">
<!-- BANNER & CONTENT-->
    <h2>Recent Posts</h2>
  <div id="store_wrap">
        <div id="left_col">
        <br />
        <?php
            **// Loop through posts and show them
            if (mysqli_num_rows($data) == 0) {
                echo $blankwall;
            }
                else {
            while ($row = mysqli_fetch_array($data)) {
                // Show the posts
                echo '' . $row['post'] . ' | ';
                echo date('M j, Y g:i A', strtotime($row['date']));
                echo '<br /><hr />';
            }**
            }
        ?>
        </div><!-- closes left_col -->

所以上面的所有代码都是为了查询数据库以获取正确的数组,然后在PHP代码下面的HTML div中显示$ row [&#39; posts&#39;],标题为left_col。我试图在下一个div中做同样的事情,但不是回应$ row [&#39;帖子&#39;],我想回显诸如$ row [&#39; store_city&#39;]之类的行将页面从先前选择的阵列中拉出后,页面显示商店的位置。这是我那部分无效的代码:

<div id="right_col">
            <div id="store_picture">
          <img src="images/store.jpg" style="width:325px;"/>
            </div><!-- closes picture --><br />
            <div id="store_address">
                <br /><br /><h2>Location Info</h2>
                <?php
                if (mysqli_num_rows($data) == 1) {
                    while ($row = mysqli_fetch_array($data)) {
                    echo '<p>' . $row['store_city']. '</p>';
                    }
            }
                mysqli_close($dbc);
                ?>

            </div><!-- closes store_address -->
            <div id="store_info">
                <p></p>
            </div><!-- closes store_info -->
        </div><!-- closes right_col -->
        <div class="clear"></div>
    </div><!-- closes store_wrap -->
</div><!-- closes content -->

无论出于何种原因,第二次,当我尝试从该数组中回显数据时,我在该div中只有空白空间。我没有收到任何错误。我只是不知道......什么都没有。因此,我认为这是一个语法问题。我尝试了与我回调$ row [&#39; post&#39;]的部分完全相同的事情,但它并没有工作。

1 个答案:

答案 0 :(得分:0)

您面临的主要问题是您在已经提取过一次后,再次尝试从$data MySQLi结果资源对象中获取行。这不会按预期工作,因为MySQL保留了一个内部记录集指针,每次调用mysqli_fetch_array()时它都会前进。因此,当到达第一个循环的末尾时,指针位于记录集的末尾,后续调用将返回FALSE

因此,你的第二个循环无处可去,因为它首次调用mysqli_fetch_array()会返回FALSE,退出循环。你有两个选择。

最快的解决方法是回滚记录指针using mysqli_data_seek()。在第二个循环之前调用,它会将指针设置回第一个记录,允许您再次获取它们。

if (mysqli_num_rows($data) == 1) {
  // Rewind the record pointer back to the first record
  mysqli_data_seek($data, 0);

  while ($row = mysqli_fetch_array($data)) {
    // note addition of htmlspecialchars() to escape the string for HTML!
    echo '<p>' .htmlspecialchars($row['store_city']). '</p>';
  }
}

如果你的记录集很小,也许更好的选择是将所有行提取到数组中一次,然后使用带有foreach循环的数组用于后续输出循环:

// To hold all rows
$rows = array();
// Do the query
$data = mysqli_query($dbc, $query2);
// (don't forget to check for errors)
if ($data) {
  while ($row = mysqli_fetch_array($data)) {
    // Append the row onto the $rows array
    $rows[] = $row;
  }
}
else{
  // handle the error somehow...
}

稍后,您将不再使用$data,而是使用$rows循环遍历foreach

// use count($rows)
if (count($rows) == 0) {
  echo $blankwall;
}
else {
  foreach ($rows as $row) {
    // Show the posts
    echo '' . $row['post'] . ' | ';
    echo date('M j, Y g:i A', strtotime($row['date']));
    echo '<br /><hr />';
  }
}

...然后在代码中再次为你的第二个循环做同样的事情。建议在适当的情况下对查询输出的字符串字段使用htmlspecialchars()