显示列名称

时间:2013-02-09 15:00:10

标签: php mysql database class mysqli

该类用于通过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 - >准备是错的。

编辑:显然我通过了$ mysqli

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

2 个答案:

答案 0 :(得分:2)

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

例如,

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

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

接下来,您无法通过预准备语句绑定标识符 因此,根据documentation

,您必须将其正确列入白名单

顺便说一句,我认为这样的功能并不多。我正在使用控制台来实现此目的,而其他人通常会通过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更好,尝试一下

如果您需要某种在线表格编辑器,很少可以直接使用。总是存在一些需要预处理或后处理数据的问题。对于任何复杂的数据结构,您总是会得到专用代码。例如,显示不错的列标题 但是对于一些普通的字符串值,它会起作用。

答案 1 :(得分:0)

按照设计,表名和列名不能参数化。但是你仍然可以在字符串上连接它并用反引号包装它作为防止sql注入的第一级防御。

    $stmt = $mysqli -> prepare("SHOW COLUMNS FROM `" . $tableName . "`");
    $stmt -> execute();