SQL选择不输出数据

时间:2015-06-21 20:42:44

标签: php mysql

首先,我在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只输出:“无法显示类别,请稍后再试。”

2 个答案:

答案 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;
}