【问题标题】:How to echo a MySQLi row in escaped PHP code, inside an HTML block如何在 HTML 块内以转义的 PHP 代码回显 MySQLi 行
【发布时间】:2015-03-01 22:45:14
【问题描述】:

我想知道在 HTML 文本块中从 MySQLi 代码中回显一行的适当语法是什么。我正在处理一个页面,该页面在开始时使用 PHP 代码来确定会话是否已启动并在从 MySQLi 数据库中提取所述 cmets 后发布用户已发布的 cmets。有趣且令人困惑的部分是,我已经在一个 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['posts'],标题为 left_col。我正在尝试在下一个 div 中执行完全相同的操作,但不是回显 $row['posts'],而是回显诸如 $row['store_city'] 之类的行,以便在拉动页面后显示商店的位置出先前选择的阵列。这是我那部分的无效代码:

<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 中只有空白空间。我没有收到任何错误。我就是不明白……什么。因此,我认为这是一个语法问题。我已经尝试了与 echo $row['post'] 部分完全相同的方法,但它不起作用。

【问题讨论】:

  • 您希望对$data 中的同一结果集进行第二次循环?如果是这样,您将需要 1)循环一次并将所有获取的行存储到一个数组中,然后您可以根据需要循环多次,或者 2)将记录指针倒回到结果集的开头mysqli_data_seek($data, 0) php.net/manual/en/mysqli-result.data-seek.php 因为一旦你获取了所有行,下一次调用 mysqli_fetch_array() 将返回 false。
  • 我确实有错误报告,而且我的原始代码没有拼写错误,所以这很奇怪。现在要编辑帖子以解决该问题。关于这个问题,我明白你在说什么。我不知道 mysqli_fetch_array() 在被调用一次后会返回 false。这很可能是我的问题。一旦我弄清楚它应该如何实现,我将尝试使用数据搜索功能,并回复结果。谢谢!
  • 最简单的解决方法是在第二次调用 while ($row = mysqli_fetch_array($data)) 之前立即调用 mysqli_data_seek($data, 0); 这不是最有效的方法,因为它需要 MySQL 提供两次行,但它是最简单的让您的代码工作的路径。
  • 我现在会尝试并报告结果。有没有更好的方法来完成我在这里尝试的事情?我是 PHP 和 MySQLi 的新手(显然),我有点担心对数据库进行多次调用可能会出现问题。出于这个原因,我没有尝试在每个 PHP 块中简单地运行另一个查询。我认为这将是非常低效的,只是感觉......错了。
  • 绝对不要查询两次。如果您只返回少量行(例如,

标签: php html mysqli


【解决方案1】:

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

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

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

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...
}

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

// 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()

【讨论】:

  • 我衷心感谢您的建议。我将尝试使用foreach 循环并查看htmlspecialchars() 的用法。再次感谢您!
  • 使用foreach 循环有点太好用了!因为我从与原始数组相同的数组中循环后面的代码,所以我为查询找到的每一行多次回显该行。我尝试创建一个令牌,但我不知道如何在它运行一次后停止循环并更新令牌。我应该为第二个 foreach 循环创建一个不同的数组吗?另外,我是该网站的新手,不确定这是否是提出后续问题的方式,所以如果这是错误的地方,请原谅。
  • @Kasaius 我不完全理解你在描述什么。通常,如果您在发布答案时需要澄清,最好在 cmets 中询问。但是,在您的情况下,听起来您的代码在集成过程中发生了重大变化,而您现在面临与集成相关的完全不同的问题。用您当前的代码提出一个新问题可能会更好,解释当前的问题是什么。发布后,如果你在这里@我有一个链接,如果社区还没有解决它,我可以看看它。
  • 我一直在努力描述这个问题,同时保持在字符数限制之下。除了实现 foreach 子句外,我没有更改任何内容,但我认为我最初遗漏了一些有关页面布局的信息。我正在遍历由上面的一个查询构建的数组,但该查询选择的行数超过了第二个 foreach 回显块所需的行数。因此,它为初始 echo 块构建了正确的数组,但第二个需要来自 DB 的行更少。我相信我毕竟必须进行两次查询,所以我会尝试一下。
  • 第一个使用哪个第二个不使用的条件是什么?您应该能够对查询进行排序或识别行,这样您就不需要查询两次。要跳出循环,你会做foreach ($rows as $row) {if (some_condition()) break; /* normal loop stuff... */}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多