首先,我在PHP / SQL的黑暗中磕磕绊绊,并且真的不知道如何进行错误测试,所以请原谅我对问题的确切性质的模糊性。继续前进。
我有一些代码可以从SQL表中获取类别ID,名称和描述,并将结果保存到变量中。这是通过声明准备避免SQL注入的可能性来完成的。然后将此值提供给某些PHP,该PHP检查查询是否有任何响应,如果是,则将其打印到表中。
<?php
//create_cat.php
include_once (__DIR__ . '/../includes/db_connect.php');
include_once (__DIR__ . '/../includes/functions.php');
include_once (__DIR__ . '/header.php');
ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1);
$stmt = "SELECT
cat_id,
cat_name,
cat_description
FROM
categories";
if (login_check($mysqli) == true) {
if(!$result = $mysqli->query($stmt)){
echo 'The categories could not be displayed, please try again later.';
} else {
if ($result->num_rows === 0) {
echo 'No categories defined yet.';
} else {
//prepare the table
echo '<table border="1">
<tr>
<th>Category</th>
<th>Last topic</th>
</tr>';
while ($row = $result->fetch_assoc()) {
echo '<tr>';
echo '<td class="leftpart">';
echo '<h3><a href="category.php?id">' . $row['cat_name'] . '</a></h3>' . $row['cat_description'];
echo '</td>';
echo '<td class="rightpart">';
echo '<a href="topic.php?id=">Topic subject</a> at 10-10';
echo '</td>';
echo '</tr>';
}
}
}
} else {
echo <<<error
<p>
<span class="error">You are not authorized to access this page.</span> Please <a href="../index.php">login</a>.
</p>
error;
}
include_once (__DIR__ . '/footer.php');
?>
但是,表SQL表肯定有值,但PHP只输出:“无法显示类别,请稍后再试。”
答案 0 :(得分:1)
好的,让它运转起来。我删除了$ stmt_prep命令,确保只使用mysqli命令,并修复了一些语法错误。代码仍然破坏了HTML,但我问的问题是固定的。
答案 1 :(得分:0)
如果你想保持面向对象的风格,那么主要的错误就是在获取结果之前关闭语句。 PHP无论如何都会释放脚本末尾的语句,但是一旦你调用$stmt->close();
,你将无法从查询中读取任何数据。由于PHP通过引用进行复制,$result = $stmt;
不复制数据,因此它只引用相同的闭合语句。
fetch语法也不是你所拥有的:你需要用例如$stmt->bind_result($name, $description);
绑定一些占位符变量,然后调用$stmt->fetch()
而不是fetch_assoc。
我不清楚login_check
究竟是做什么的,但在我看来,您希望提前进行此检查,以便在用户未经授权的情况下不执行查询。
您的原始代码最终会看起来像:
<?php
if (login_check($mysqli) == true) {
$stmt = $mysqli->prepare($prep_stmt);
if ($stmt) {
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 0) {
echo 'No categories defined yet.';
} else {
//prepare the table
echo '<table border="1">
<tr>
<th>Category</th>
<th>Last topic</th>
</tr>';
$stmt->bind_result($name, $description);
while ($stmt->fetch()) {
echo '<tr>';
echo '<td class="leftpart">';
echo '<h3><a href="category.php?id">' . $name . '</a></h3>'
. $description;
echo '</td>';
echo '<td class="rightpart">';
echo '<a href="topic.php?id=">Topic subject</a> at 10-10';
echo '</td>';
echo '</tr>';
}
}
} else {
echo 'The categories could not be displayed, please try again later.';
}
} else {
echo <<<error
<p>
<span class="error">You are not authorized to access this page.</span> Please
<a href="../index.php">login</a>.
</p>
error;
}