Feature Request: Add is_nullable to field_data() output (MySQLi driver)
Title: Add is_nullable property to field_data() results in the MySQLi driver
Summary
$this->db->field_data($table) currently returns objects with name, type, max_length, primary_key, and default — but no information about whether a column is nullable (NOT NULL vs NULL). This makes it impossible to build generic, metadata-driven forms that correctly mark required vs. optional fields without a second, manual SHOW COLUMNS / information_schema query.
Motivation
We built a generic CRUD form renderer that iterates over field_data($table) to render each column's label and input, and needs to know per-column nullability to:
mark required fields in the UI (asterisk / required attribute)
decide default value / validation behavior
Since field_data() already runs SHOW COLUMNS FROM
(MySQLi driver) — which includes a Null column (YES/NO) — and MySQLi's native mysqli_result::fetch_fields() already exposes an is_nullable flag per field, this data is available "for free" with no extra query. It's just not being surfaced in the return object.
Current behavior
system/database/drivers/mysqli/mysqli_driver.php::field_data() builds each $retval[$i] from the SHOW COLUMNS result but stops at 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() builds each $retval[$i] from mysqli_result::fetch_fields() and also stops before using the native is_nullable flag that MySQLi already provides:
$retval[$i]->default = $field_data[$i]->def;
Proposed change
Add one line to each of the two functions above:
mysqli_driver.php (field_data($table), based on 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(), based on mysqli_result::fetch_fields()):
$retval[$i]->default = $field_data[$i]->def;
$retval[$i]->is_nullable = $field_data[$i]->is_nullable;
Backward compatibility
Purely additive — adds a new property to the returned stdClass objects, does not change or remove any existing property, and does not alter the method signature. Existing code that ignores the new property is unaffected.
Scope note
This report covers the MySQLi driver (the one we use in production). The same gap likely exists in other drivers with a field_data() implementation (e.g. the legacy mysql driver) — happy to provide the equivalent one-liner for those too if maintainers want consistency across drivers, but MySQLi is the one actively used by most CodeIgniter 3 installs today.
Feature Request: Add is_nullable to field_data() output (MySQLi driver)
Title: Add is_nullable property to field_data() results in the MySQLi driver
Summary
$this->db->field_data($table) currently returns objects with name, type, max_length, primary_key, and default — but no information about whether a column is nullable (NOT NULL vs NULL). This makes it impossible to build generic, metadata-driven forms that correctly mark required vs. optional fields without a second, manual SHOW COLUMNS / information_schema query.
Motivation
We built a generic CRUD form renderer that iterates over field_data($table) to render each column's label and input, and needs to know per-column nullability to:
mark required fields in the UI (asterisk / required attribute)
(MySQLi driver) — which includes a Null column (YES/NO) — and MySQLi's native mysqli_result::fetch_fields() already exposes an is_nullable flag per field, this data is available "for free" with no extra query. It's just not being surfaced in the return object.decide default value / validation behavior
Since field_data() already runs SHOW COLUMNS FROM
Current behavior
system/database/drivers/mysqli/mysqli_driver.php::field_data() builds each $retval[$i] from the SHOW COLUMNS result but stops at 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() builds each $retval[$i] from mysqli_result::fetch_fields() and also stops before using the native is_nullable flag that MySQLi already provides:
$retval[$i]->default = $field_data[$i]->def;
Proposed change
Add one line to each of the two functions above:
mysqli_driver.php (field_data($table), based on 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(), based on mysqli_result::fetch_fields()):
$retval[$i]->default = $field_data[$i]->def;
$retval[$i]->is_nullable = $field_data[$i]->is_nullable;
Backward compatibility
Purely additive — adds a new property to the returned stdClass objects, does not change or remove any existing property, and does not alter the method signature. Existing code that ignores the new property is unaffected.
Scope note
This report covers the MySQLi driver (the one we use in production). The same gap likely exists in other drivers with a field_data() implementation (e.g. the legacy mysql driver) — happy to provide the equivalent one-liner for those too if maintainers want consistency across drivers, but MySQLi is the one actively used by most CodeIgniter 3 installs today.