标题听起来很混乱,但我不知道如何更好地描述它。
我接到的任务是将数据库从程序 A 迁移到程序 B。
程序A使用MSSQL数据库并将其所有文件存储在数据库中。
程序 B 处理以“正常”方式存储的文件,即存储在文件系统中。
现在我必须使用 PHP 提取、转换数据库存储的文件并将其下载到文件系统文件,但我尝试转换它们没有成功。
为了测试目的,我创建了一个简单的.txt
包含内容的文件Test document for migration
程序A将其存储在数据库中:
0x5465737420646F63756D656E7420666F72206D6967726174696F6E'
那是什么格式,如何将其转换为正常格式document.txt
file ?
Edit
非常感谢@PanagiotisKanavos。现在这可以与流一起使用:
$query = "select top(1) DESCRIPTION, FILETYPE, DOCUMENT from dbo.Documents;";
$stmt = sqlsrv_query($this->sqlsrv_conn, $query);
if (sqlsrv_fetch($stmt)) {
$document = sqlsrv_get_field($stmt, 2, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
$fileName = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
$ext = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR));
file_put_contents(
$fileName . '.' . $ext,
stream_get_contents($document),
);
}
现在,对所有文件执行此操作的最有效方法是什么?我是否必须对每一行执行查询?
通过 PDO 我可以使用$stmt->fetchAll(FETCH_ASSOC)
这给了我一个很好的关联数组数组,里面有数据。
sqlsrv
有类似的功能sqlsrv_fetch_array
这是解释的php.net https://www.php.net/manual/en/function.sqlsrv-fetch-array.php和 [docs.microsoft],示例如下:
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
echo $row['LastName'].", ".$row['FirstName']."<br />";
}
但尽管我可以搜索,但我找不到一种方法来循环结果集而不获取结果集,然后单独获取混合流和字符串类型的每一行。sqlsrv_fetch_array
只接受SQLSRV_FETCH_NUMERIC
, SQLSRV_FETCH_ASSOC
and SQLSRV_FETCH_BOTH
然后结果集已经获取,我无法使用sqlsrv_get_field
设置每个字段的类型。
我不是第一个需要这样的东西的人,但我找不到任何相关信息。可能我搜索错误,或者我误解了一个概念。