我正在使用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
答案 0 :(得分:2)
任何时候你得到......
&#34;致命错误:致电会员功能......&#34;
...可能是因为您的查询存在问题。 prepare()
可能会返回FALSE
(布尔值),但这个通用的失败消息并没有给您留下太多线索。你怎么知道你的查询有什么问题?你问!
首先,确保错误报告已打开且可见:在打开<?php
标记后立即将这两行添加到文件顶部:
error_reporting(E_ALL);
ini_set('display_errors', 1);
如果您在php.ini中设置了错误报告,则您不必担心这一点。只需确保您优雅地处理错误,并且永远不会向用户透露任何问题的真正原因。向公众展示真正的事业可以为那些想要伤害您的网站和服务器的人提供金色邀请函。如果您不想将错误发送到浏览器,则可以始终监视Web服务器错误日志。日志位置因服务器而异,例如,在Ubuntu上,错误日志通常位于/var/log/apache2/error.log
。如果您正在检查Linux环境中的错误日志,则可以在控制台窗口中使用tail -f /path/to/log
来查看实时发生的错误....或者在您制作错误时。
一旦您对标准错误报告进行了平衡,就会对数据库连接添加错误检查,并且查询将为您提供有关正在进行的问题的更多详细信息。看一下列名不正确的示例。首先,返回通用致命错误消息的代码:
$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'
}
如果出现问题,您可以吐出一条错误消息,直接告诉您该问题。在这种情况下,表中没有foo
列,解决问题是微不足道的。
如果您选择,您可以在函数或类中包含此检查,并通过如前所述优雅地处理错误来扩展它。
答案 1 :(得分:1)
您忘记使用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 }?>