为 MySQL/MariaDB 添加 field_data 函数
功能请求: 向 field_data() 的输出添加 is_nullable (MySQLi 驱动程序) 标题: 在 MySQLi 驱动程序中,向 field_data() 的结果添加 is_nullable 属性 目前,$this->db->field_data($table) 返回的对象包含 name、type、max_length、primary_key 和 default 等信息,但不包含有关列是否可为空 (NOT NULL 与 NULL) 的信息。这使得无法构建通用的、基于元数据的表单,从而正确标记必填和可选字段,而无需第二次手动执行 SHOW COLUMNS 或 information_schema 查询。 理由 我们构建了一个通用的 CRUD 表单渲染器,通过迭代 field_data($table) 来渲染每一列的标签和输入,并且需要了解每列的可为空性,以便: 在 UI 中标记必填字段 (星号 / required 属性) 决定默认值/验证行为 由于 field_data() 已经运行了 SHOW COLUMNS FROM <table> (MySQLi 驱动程序),其中包括一个 Null 列 (YES/NO),并且 MySQLi 的原生 mysqli_result::fetch_fields() 已经暴露了每个字段的 is_nullable 标志,因此这些数据可以"免费"获得,无需额外查询。它们只是没有在返回对象中显示。 当前行为 system/database/drivers/mysqli/mysqli_driver.php::field_data() 根据 SHOW COLUMNS 结果构建每个 $retval[$i],但停止在 primary_key 之前: $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); system/database/drivers/mysqli/mysqli_result.php::field_data() 根据 mysqli_result::fetch_fields() 构建每个 $retval[$i],并且在使用 MySQLi 已提供的原生 is_nullable 标志之前也停止: $retval[$i]->default = $field_data[$i]->def; 建议的更改 向上述两个函数中添加一行: mysqli_driver.php (field_data($table), 基于 SHOW COLUMNS): $retval[$i]->default = $query[$i]->Default; $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); $retval[$i]->is_nullable = (int) ($query[$i]->Null === 'YES'); mysqli_result.php (field_data(), 基于 mysqli_result::fetch_fields()): $retval[$i]->default = $field_data[$i]->def; $retval[$i]->is_nullable = $field_data[$i]->is_nullable; 后向兼容性 纯粹是增量性 – 向返回的 stdClass 对象中添加了一个新属性,不改变或删除任何现有属性,也不更改方法签名。忽略新属性的现有代码不受影响。 注意 此报告涉及 MySQLi 驱动程序 (我们在生产环境中使用的那个)。其他驱动程序中也可能存在相同的缺陷,具有 field_data() 实现 (例如传统的 MySQL 驱动程序) – 如果维护者希望在各个驱动程序之间保持一致性,也很乐意为它们提供相同的一行代码,但 MySQLi 是当前大多数 CodeIgniter 3 安装中正在积极使用的驱动程序。
内容来源: bcit-ci/CodeIgniter