PHP 使用 sqlsrv 一次检索多行流内容

2024-04-06

这是一种后续行动这个问题 https://stackoverflow.com/questions/67998821/create-file-system-file-from-file-stored-in-microsoft-sql-database.

此代码重试数据库中的一行,其中一列是资源,并用它创建一个文件系统文件。

$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,
        'filename'.'.doc',
        stream_get_contents($document),
    );
} 

现在我必须对数据库中的所有记录执行此操作,而不仅仅是一条记录。实现这一目标的最佳方法是什么?

我在看sqlsrv_fetch_array https://www.php.net/manual/en/function.sqlsrv-fetch-array.php它有一个参数“$fetchType”,但这是定义行分组在一起的格式(编号或关联数组)。
如何为该行数组下的每一列定义 fetchType?就像我可以与sqlsrv_get_field($stmt, 2, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY))当仅获取一行时。

注意:我收到的反馈表明我的问题往往不清楚,如果您发现可以改进的地方以使这个问题更好更容易回答,请告诉我。

Edit

谢谢@Zhorov while 循环确实有效!但我面临一个新的愚蠢问题。
我撒谎了,我发布的代码并不完全适合我。显然我也没有正确测试它并获取文件名和扩展名。只有当我以流的形式获取二进制数据时才有效没有别的.

我根本不明白。以下代码按预期工作:

$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));
    file_put_contents(
        // $fileName . '.doc',
        'filename.doc',
        stream_get_contents($document),
    );
} 

但如果我还想获取文件名或其他任何内容

$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);
    file_put_contents(
        'filename.doc',
        stream_get_contents($document),
    );
} 

我得到以下异常:

错误:stream_get_contents():提供的资源不是有效的流资源文件

I debugged it down to this with xdebug. Here are screenshots of the two scenarios. This is the run with a valid stream and no exception (you can see the "type=stream"): enter image description here

And here, the only thing I did is remove the comment on the line and a breakpoint right before the exception happens (you can see the "type=Unknown"): enter image description here Why does fetching something else break the stream? (This behaviour is the same when I using while loop or not)

Edit 2

更改顺序时,行为确实会改变sqlsrv_get_field叫做。如果我将二进制数据放在文件名后面,$document变量是false。甚至不是“未知”流。

编辑:正如@Zhorov 指出的那样,原因是:

From 文档 https://learn.microsoft.com/en-us/sql/connect/php/sqlsrv-get-field?view=sql-server-ver15 - sqlsrv_get_field 从当前行的指定字段检索数据。必须按顺序访问字段数据。例如,访问第二个字段的数据后,将无法访问第一个字段的数据


@Zhorov 让我走上了解决方案的正确轨道。

看来必须最后访问流内容。如果我在文档之前获取文件名,则流为“未知”并引发异常。但如果我最终得到了流,它就有效了!

你自己看。以下是流无效的版本:

当检索列中的二进制数据时DOCUMENT最后,它有效:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 使用 sqlsrv 一次检索多行流内容 的相关文章

随机推荐

  • 运行高优先级 sshd 进程,而不将该优先级继承给子进程

    我使用以下命令给 sshd 进程赋予最高优先级 nice n 20 sbin sshd 但默认情况下它也会给子进程 bin sh 最高优先级 那么 是否可以为子进程赋予普通优先级 0 而不是最高优先级 假设此 sshd 是 OpenSSH
  • Android SQLite CursorWindowAllocationException 崩溃

    当我发出多个cursor moveToNext 请求时 我的程序崩溃了 错误消息如下 android database CursorWindowAllocationException Cursor window allocation of
  • 主管不使用 Gunicorn + Flask

    我正在尝试在 Ubuntu 12 04 系统中从 Supervisor 运行 Gunicorn Gunicorn 运行 Flask 应用程序 使用 Flask 的嵌入式服务器测试的简单 REST Web 服务 我通过克隆 GIT 存储库来安
  • React 项目中 Bootstrap 需要 jQuery

    我正在开发一个 React js 项目 我不使用 React Bootstrap 而是将 Bootstrap 的 CSS 加载到我的项目中 我现在需要导入 jQuery 以便我可以使用下拉菜单等 入口点文件 index js 希望它能起作用
  • Pip“找不到满足 pygame 要求的版本”[重复]

    这个问题在这里已经有答案了 当我尝试使用以下命令安装 PyGame 时 pip install pygame it says 收集pygame 找不到满足要求的版本 要求 pygame 来自版本 未找到匹配的分布 我相信我使用的是最新版本
  • 在 Cygwin 中从源代码构建 Vim

    我正在尝试在 Cygwin 下从源代码包构建 Vim 以启用 Python 支持 我正在按照给出的指示进行操作here http cygwin com ml cygwin 2004 06 msg00540 html 但是当我运行时遇到这个错
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • C++11 future.wait_for() 始终返回 future_status::timeout

    我有一个 C 11 程序 用于检查数字是否为素数 程序等待有一个 future 对象准备好 准备好后 程序会告诉 future 对象的提供者函数是否认为该数字是素数 future example include
  • 如何在 Cython 的 setup.py 中指定 Python 3 源?

    我正在尝试按照本教程在 Cython 中执行 Hello World 程序http docs cython org src tutorial cython tutorial html cython hello world http docs
  • 如何使用 matplotlib 显示两个图形?

    我在同时绘制两个图形时遇到一些麻烦 未在单个图中显示 但根据文档 我写了代码 只有图一显示 我想也许我失去了一些重要的东西 有人能帮我弄清楚吗 谢谢 代码中使用的 tlist first 是数据列表 plt figure 1 plt his
  • 初始化 C 结构的双花括号的含义是什么?

    我目前正在处理遗产C 代码 用gcc 2 9 X成功编译 我被要求将此遗留代码移植到 gcc 3 4 X 大多数错误都很容易纠正 但这个特殊的错误让我感到困惑 上下文 struct TMessage THeader header TData
  • C# 程序员的 C++ [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对 Java 和 C 的 OO 有很好的理解 而且我很幸运在我的工程课程中接触到了汇编程序和 C 的
  • 控制器中的@Transactional

    首先我想说 我完全同意只让服务层具有事务性 但有时世界并不完美 而现在我正处于这种情况之中 基本上我被分配到一个很棒的项目 遗留代码已经有 4 年多了 问题是 开发人员没有遵循任何引入业务逻辑的模式 因此您可以对来自控制器的多个服务调用进行
  • Tomcat 7 连接被拒绝

    我有一个在 Jelastic 上运行的 Tomcat 实例 并且有两个已部署的应用程序 用于 foo 上下文和 bar 上下文 在处理对 foo 的请求期间 我们向 bar 发出 HTTP 请求 用于授权 并且这里总是出现异常 Connec
  • 如何使用 Castle Core 或其他库(只是免费库)编写拦截器(AOP)以解决交叉问题

    我想要一个像这样的属性来处理横切关注点 例如 Logging Exception public class MyService Log Interception AOP ExceptionHandler Interception AOP p
  • 如何通过 CLI 快速重命名 macOS 或 Linux 上的文件?

    这是我的源文件 e2f9eb91 645f 408a 9241 66490b61a617 file module 1 txt d20f06a8 4de1 4da0 8175 93e9b2d81c42 file module 2 txt 67
  • 在 Windows 7 上通过 VPN 使用时 Git 无响应

    这是关于通过 VPN 处理本地存储库时简单 git 命令无响应的问题 我的 Windows 用户帐户 管理员角色 是我用来登录的域帐户 我有一些从 github 源克隆的本地存储库 场景 1 在没有 VPN 的 Windows 上使用本地存
  • xamarin.forms 处理 WebView 上的 Clicked 事件

    我想处理 WebView 控件上的单击 点击事件 我已经尝试过 GestureRecognizers 但没有任何反应 我认为 WebView 可能有某种方式使事件处理为 true
  • 设置 Angular-UI Select2 多重指令的初始值

    我有一个 select2 指令 用于多个选择的国家 地区 并使用自定义查询来获取数据 Directive
  • PHP 使用 sqlsrv 一次检索多行流内容

    这是一种后续行动这个问题 https stackoverflow com questions 67998821 create file system file from file stored in microsoft sql databa