1

此类用于通过 mysqli 管理数据库。我坚持使用准备好的语句来显示给定表的所有列名。

class databaseManager {
    function showTable ($tableName, $mysqli) {
        $stmt = $mysqli -> prepare("SHOW COLUMNS FROM ?");
        $stmt -> bind_param('s', $tableName);
        $stmt -> execute();

        while ($stmt -> fetch) {
            $Field;
        }

        $stmt -> free_result();
    }
}

我收到错误“在非对象上调用成员函数 bind_param()”,但 $mysqli 连接存在,所以我认为 mysqli -> prepare 是错误的。

编辑:显然我通过了 $mysqli

$databaseManager = new databaseManager();
$databaseManager -> showTable("blog", $mysqli);
4

2 回答 2

2

首先,您没有进行任何错误处理。始终检查所有数据库交互的结果。

例如,

$stmt = $mysqli->prepare("SHOW COLUMNS FROM ?");
if (!$stmt) {
    throw new Exception($mysqli->error);
}

因此,您将从数据库中收到一条错误消息。

接下来,您不能通过准备好的语句绑定标识符。
因此,根据文档,您必须将其列入白名单或正确格式化

顺便说一句,我认为这样的功能没有多大意义。我为此目的使用控制台,其他人通常通过 PHPMyAdmin 看到他们的数据库结构

此外,使用裸 API 也不是最佳选择。通过使用一些抽象层,您可以在一行中编写代码:

function showTable ($tableName) {
    return $this->db->getCol("SHOW COLUMNS FROM ?n", $tableName);
}

不过,您不需要此查询来显示表格内容,因为列名始终已存在于结果集中。因此,只需先请求您的数据,然后从中提取列名

通过使用上面提到的这样一个库,它会是这样的

$data  = $this->db->getAll("SELECT * FROM ?n", $tableName);
$names = array_keys($data[0]);

但是 PHPMyAdmin 仍然做得更好,试一试

如果您需要某种在线表格编辑器,很少有这样直接的方式工作。总是有一些问题需要对数据进行预处理或后处理。对于任何复杂的数据结构,您总是以专用代码告终。例如,显示漂亮的列标题。
但是对于一些普通的字符串值,它会起作用。

于 2013-02-09T15:07:49.803 回答
0

按照设计,表名和列名不能参数化。但是您仍然可以将它连接到字符串上并用反引号将其包裹起来,作为对 sql 注入的第一级防御。

    $stmt = $mysqli -> prepare("SHOW COLUMNS FROM `" . $tableName . "`");
    $stmt -> execute();
于 2013-02-09T15:01:34.410 回答