php - Laravel PDO 设置?

标签 php sql-server laravel

我想从我的数据库中以整数形式返回 INT。目前所有值都作为字符串加载。数据库是 MSSQL 2012,我使用 PDO 驱动程序(适用于 v5.6)。

尝试在这里设置属性(如图 here on fideloper.com ,但我不知道是否仍然可以):

   'sqlsrv' => [
        'driver'   => 'sqlsrv',
        'charset'  => 'utf8',
        'prefix'   => '',
         ......
        'options'   => array(
            PDO::ATTR_STRINGIFY_FETCHES => false,
            PDO::ATTR_EMULATE_PREPARES => false,
        ),
    ],

但总是报错:

SQLSTATE[IMSSP]: The given attribute is only supported on the PDOStatement object.

如何设置 PDO 驱动程序的任何设置以将 INT 作为整数而不是字符串返回。

这仍然不起作用:

 $pdo = DB::connection()->getPdo();
 $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
 .. do ORM Query

带来同样的错误。

也许有人可以帮助我?

最佳答案

我知道这是一个旧线程,但我找到了针对 MSSQL 驱动程序和 PHP 7 的此问题的全局解决方案(影响所有表/模型的单一更改)。希望这会帮助其他正在为同样的事情苦苦挣扎的人。

  1. 从 Git 存储库 (Microsoft/msphpsql) 获取最新版本的驱动程序。 Microsoft 下载页面上发布的当前版本是旧版本,无法使用(截至 2016 年 9 月 13 日)。
  2. 将适当的 DLL 复制到您的 php/ext 文件夹中(替换/删除旧版本)。您可能需要停止/启动您的 Web 服务器(当然,如果是 IIS)以释放原始文件以供替换/删除。 如果文件名与您之前安装的版本不同,请更新您的 php.ini 文件。
  3. 更新驱动程序配置以包含新的 PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE 参数:

    'sqlsrv' => [
        'driver' => 'sqlsrv',
        'host' => env('DB_HOST', 'localhost'),
        'database' => env('DB_DATABASE', 'database'),
        'username' => env('DB_USERNAME', 'laravel'),
        'password' => env('DB_PASSWORD', 'password#1'),
        'charset' => 'utf8',
        'prefix' => '',
        'options'   => array(
            PDO::ATTR_STRINGIFY_FETCHES => false,
            PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true
        ),
    ],
    

对于解决方案的解释,我通过 Git 存储库上的源代码找到了它。当然,如果我先阅读 README 文件的公告部分,事情会容易得多:

July 28, 2016 (4.1.0): Thanks to the community's input, this release expands drivers functionalities and also includes some bug fixes:

  • SQLSRV_ATTR_FETCHES_NUMERIC_TYPE connection attribute flag is added to PDO_SQLSRV driver to handle numeric fetches from columns with numeric Sql types (only bit, integer, smallint, tinyint, float and real). This flag can be turned on by setting its value in PDO::setAttribute to true, For example, $conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE,true); If SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is set to true the results from an integer column will be represented as an int, likewise, Sql types float and real will be represented as float. Note for exceptions:
    • When connection option flag ATTR_STRINGIFY_FETCHES is on, even when SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is on, the return value will still be string.
    • When the returned PDO type in bind column is PDO_PARAM_INT, the return value from a integer column will be int even if SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is off.

关于php - Laravel PDO 设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31563747/

相关文章:

sql-server - 计算一列中的所有行,并在结果上获得 2 个不同的计数列,即使没有要计数的记录

javascript - PHP 中的 HTML 数组字段解析

PHP Composer 更新 "cannot allocate memory"错误(使用 Laravel 4)

PHP - 检查变量既不是空也不是字符串

sql-server - 允许最终用户动态地将列添加到表中

php - 如何使水平导航菜单居中对齐

mysql - 如何编辑DB文件并在其表之一中插入多条记录?

testing - Laravel 4 - 单元测试

php - 使用 PHP 的 Foreach 循环在单独的文本框中显示数据库中的每个条目

php - 我想检查用户名在注册页面是否可用