在 field_data() 中添加 is_nullable 属性会导致 MySQLi 驱动程序
功能请求: 向 field_data() 的输出添加 is_nullable (MySQLi 驱动程序) 摘要: $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 驱动程序,因为这是我们在生产环境中使用的,但向每个其他受支持的数据库驱动程序添加同一行(暴露已经提取的“此列是否可为空”数据,只是没有暴露出来)也是可行的。
内容来源: bcit-ci/CodeIgniter