该类用于通过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);
答案 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();