P粉6747571142023-09-05 11:18:10
如果您的用户要提供要使用的 SQL 语句,他们必须知道他们想要的表和列的名称。
您可以查询information_schema.COLUMNS
表来查找表和列的名称和数据类型。
或者,执行查询后,您可以获得列元数据。对于 PDO,请使用 $stmt->getColumMeta($columnNumber);。使用 mysqli 使用 ->result_metadata() 类似这(未调试)。
$stmt = $mysqli->prepare("SELECT what,ever,else FROM table"); $stmt->execute(); $metadata = $stmt->result_metadata(); $column_count = $mysqli->field_count(); $column_names = []; for ($colnum = 0; $colnum < $column_count; $colnum++) { $field = $metadata->fetch_field(); $column_names [] = $field->name; } $metadata->close();
这使用->fetch_field()获取有关结果集中每一列的大量有用信息。
但是让用户向您提供 SQL 语句是一个很大的安全风险。如果您信任用户向您提供 SQL 语句,您还必须相信他们不会破坏或损坏您的数据。如果您的系统向全球互联网开放,您将丢失数据。有时问我怎么知道这一点。