如何将PDO MySQL查询转换为MS SQL并获得相同JSON结果?
如何修改MS SQL原生连接代码以匹配PDO MySQL的JSON输出结构?
你提到的PDO代码之所以会输出同时包含字段名和数字索引的JSON,是因为fetchAll()默认使用了PDO::FETCH_BOTH模式——它会把每一行数据同时以关联数组(字段名作为键)和索引数组(数字作为键)的形式返回。而MS SQL原生扩展的默认获取方式不会同时返回两种键,所以我们需要手动构建出和PDO完全一致的结构。
下面是修改后的完整代码,直接就能得到你想要的JSON结果:
$myServer = '你的SQL服务器地址'; $myUser = '用户名'; $myPass = '密码'; // 连接数据库 $con = mssql_connect($myServer, $myUser, $myPass) or die("Could not connect to database: ".mssql_get_last_message()); if($con){ // echo "connected"; } // 选择数据库 mssql_select_db('DB') or die('Could not select a database.'); // 执行查询 $SQL = "SELECT * FROM Details WHERE ID='2'"; $result = mssql_query($SQL); // 先获取所有字段名,用来构建关联键 $fieldCount = mssql_num_fields($result); $fieldNames = []; for ($i = 0; $i < $fieldCount; $i++) { $fieldNames[] = mssql_field_name($result, $i); } // 构建和PDO FETCH_BOTH一致的结果数组 $finalResult = []; while ($row = mssql_fetch_row($result)) { $combinedRow = []; foreach ($row as $index => $value) { // 添加数字索引键 $combinedRow[$index] = $value; // 添加字段名键 $combinedRow[$fieldNames[$index]] = $value; } $finalResult[] = $combinedRow; } // 输出JSON $json = json_encode($finalResult); echo $json; // 关闭连接 mssql_free_result($result); mssql_close($con);
关键步骤说明:
- 获取字段名:通过
mssql_num_fields()拿到字段总数,再用mssql_field_name()逐个获取每个字段的名称,存到数组里备用。 - 合并行数据:用
mssql_fetch_row()拿到纯索引数组的行数据,然后循环每一个值,同时给combinedRow添加数字索引键和对应的字段名键。 - 输出JSON:最后把整理好的数组编码成JSON,和原PDO代码的输出结构完全一致。
这样处理后,你得到的JSON就会和PDO版本的输出一模一样——每个对象里既有"ID"、"TimeID"这类字段名键,也有"0"、"1"这类数字索引键,空值也会保留为null。
内容的提问来源于stack exchange,提问作者Dmitri
相关产品推荐
相关产品推荐

