PHP7.4中sqlsrv_fetch_array不返回null值列索引的解决问询
解决方法
方案1:使用sqlsrv官方属性配置(推荐)
sqlsrv扩展默认会移除值为null的查询列索引,你可以通过设置语句属性强制保留null列:
// 预处理SQL语句 $stmt = sqlsrv_prepare($conn, "select col1, col2 from table"); // 开启保留null值列,配置生效后所有null列会保留索引,值为null sqlsrv_set_stmt_attribute($stmt, SQLSRV_ATTR_PRESERVE_NULLS, true); // 执行语句 sqlsrv_execute($stmt); // 后续fetch返回的数组会包含所有查询的列,值为null的列也会保留索引 $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
配置完成后不需要修改任何后续的数组访问逻辑,就能直接兼容PHP7.4+的索引访问规则。
方案2:动态补全列索引(兼容旧版本扩展)
如果你的sqlsrv扩展版本过低不支持上述属性,可以通过获取查询元数据自动补全所有列:
$stmt = sqlsrv_query($conn, "select col1, col2 from table"); // 获取当前查询的所有列名 $fieldMeta = sqlsrv_field_metadata($stmt); $allColumns = array_column($fieldMeta, 'Name'); // 生成包含所有列的默认行模板,可根据需求修改默认值为0、空字符串等 $defaultRow = array_fill_keys($allColumns, null); while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { // 合并默认模板和实际查询结果,自动补全缺失的null列 $row = array_merge($defaultRow, $row); // 正常处理业务逻辑即可 }
这种方案不需要手动枚举所有查询列,即使后续SQL调整增加/减少查询字段,也不需要修改补全逻辑。
内容的提问来源于stack exchange,提问作者ders
相关产品推荐
相关产品推荐

