php pdp如何使用foreach获取数据并显示到表单中

php pdp how to use foreach to fetch data and display them into a form

我正在使用 PDO 连接和 foreach loop 来获取数据并将它们显示到表单中,以便允许用户查看输入的数据。在下面的 PHP 代码中,我确实使用 prepared statement 来尝试检索数据 这是 php 代码

    <?php

    /**
     * Simple wrapper around htmlspecialchars() that always passes the correct require options
     *
     * @param string $str
     * @return string
     */
    function html($str)
    {
        return htmlspecialchars($str, ENT_COMPAT | ENT_HTML5, 'utf-8');
    }

    error_reporting(-1);
    ini_set('display_errors', 'On');

    $servername = "xxx";
    $username = "xxxxx";
    $password = "xxxxx";
    $dbname= "xxxxx";
    $charset = 'utf8';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ];

    $dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', $servername, $dbname, $charset);



    try {
        $dbh = new PDO($dsn, $username, $password, $options);
    $sth = $dbh->prepare("SELECT id, cognome, indirizzo FROM req_table");
        $rows = $sth->execute()->fetchAll(PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
        echo $e->getMessage();
    $errorCode = $e->getCode();

        exit("Connection failed: " . $e->getMessage());
    }

    ?>
    <html>
      <head>
        <title>Form</title>
      </head>
      <body>
        <form action="req.php" method="post">
          <table>
            <tr>
              <td>Nome</td>
              <td><input type="text" name="nome"/></td>
            </tr>
            <tr>
              <td>Cognome</td>
              <td>
                <select name="cognome">
    <?php while ($row = $rows->fetch(PDO::FETCH_ASSOC) { ?>
              <option value="<?= $row['id'] ?>"><?= html($row['cognome']) ?></option>
<?php } ?>

                </select>
              </td>
            </tr>
            <tr>
              <td>Indirizzo</td>
              <td>
                <select name="indirizzo">
    <select name="indirizzo">
<?php while ($row = $rows->fetch(PDO::FETCH_ASSOC) { ?>
              <option value="<?= $row['id'] ?>"><?= html($row['indirizzo']) ?></option>
<?php } ?>

                </select>
              </td>
            </tr>
            <tr>
              <td colspan="2" style="text-align: center;">
                <input type="submit" name="Invia" value="Submit" />
              </td>
            </tr>
          </table>
        </form>
      </body>
    </html>

我真的希望上面的代码足够清楚,让你告诉我可以找到什么解决方案来解决这个问题

代码编辑 try/catch

中的错误

第一次编辑

catch(PDOException $e) {
  echo $e->getMessage();
$errorCode = $e->getCode();
exit("Connection failed: " . $e->getMessage());
}

第二次编辑

$rows = $sth->execute();

第三次编辑

<?php while ($row = $rows->fetch(PDO::FETCH_ASSOC) { ?>
          <option value="<?= $row['id'] ?>"><?= html($row['cognome']) ?></option>
<?php } ?>

现在出现 500 服务器错误和空白页 PS error reporting 已启用,我已将 foreach 替换为 while loop

任何时候你得到...

"Fatal error: Call to a member function..."

...这可能是因为您的查询有问题。 prepare() 可能 return FALSE (布尔值),但此一般性失败消息不会给您留下太多线索。您如何找出您的查询有什么问题?你!

首先,确保错误报告已打开且可见:在打开 <?php 标签后立即将这两行添加到文件顶部:

error_reporting(E_ALL);
ini_set('display_errors', 1);

如果您的错误报告已在 php.ini 中设置,您就不必担心这一点。只要确保您优雅地处理错误并且永远不会向您的用户透露任何问题的真正原因。向 public 揭示真正的原因可能是对那些想要破坏您的网站和服务器的人的刻金邀请。如果您不想向浏览器发送错误,您可以随时监控您的网络服务器错误日志。日志位置因服务器而异,例如,在 Ubuntu 上,错误日志通常位于 /var/log/apache2/error.log。如果您正在 Linux 环境中检查错误日志,您可以在控制台 window 中使用 tail -f /path/to/log 来查看实时发生的错误......或者当它们发生时.

一旦您确定了标准错误报告,在您的数据库连接和查询上添加错误检查将为您提供更多关于正在发生的问题的详细信息。查看此示例,其中列名不正确。首先,return 是通用致命错误消息的代码:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

该错误是一般性错误,对您解决问题的帮助不大。

通过多几行代码,您可以获得非常详细的信息,您可以使用这些信息立即解决问题。检查 prepare() 语句的真实性,如果它是正确的,您可以继续绑定和执行。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

如果出现问题,您可以吐出一条错误消息,直接将您带到问题所在。在这种情况下,table 中没有 foo 列,解决问题很简单。

如果您愿意,可以将此检查包含在一个函数中,或者 class 并通过如前所述优雅地处理错误来扩展它。

您忘记使用execute()

试试这个:

$rows = $sth->execute()->fetchAll(PDO::FETCH_ASSOC);

然而,使用 fetchAll() 以在之后使用 foreach() 循环是没有用的。所以替换这个:

$rows = $sth->execute()->fetchAll(PDO::FETCH_ASSOC);

通过这个:

$rows = $sth->execute();

并在您的 HTML 中替换为:

<?php 
foreach ($rows as $row) { ?>
    <option value="<?= $row['id'] ?>"><?= html($row['cognome']) ?></option>
<?php } ?>

通过这个:

<?php 
while($row = $rows->fetch(PDO::FETCH_ASSOC) { ?>
    <option value="<?= $row['id'] ?>"><?= html($row['cognome']) ?></option>
<?php }?>