【问题标题】:Laravel PDO Settings?Laravel PDO 设置?
【发布时间】:2015-07-22 12:53:45
【问题描述】:

我想从我的数据库中以整数形式返回 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

带来同样的错误。

也许有人可以帮助我?

【问题讨论】:

  • 不设置属性是否有效?你可以考虑在 git repo 上提出一个问题
  • 一切正常,只能从 laravel ORM 获取所有数值作为字符串。生病将其用作 RESTful Web 服务,并且将每个值从 IO 转换为正确的数据类型是愚蠢的;) - 所以如果我可以将值作为数字得到,那就太好了。
  • 要考虑的另一件事是转为EMULATE_PREPARES

标签: php sql-server laravel


【解决方案1】:

我知道这是一个旧线程,但我找到了针对 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 文件的 Announcements 部分会容易得多:

2016 年 7 月 28 日 (4.1.0):感谢社区的投入,此版本扩展了驱动程序的功能并修复了一些错误:

  • SQLSRV_ATTR_FETCHES_NUMERIC_TYPE 连接属性标志被添加到 PDO_SQLSRV 驱动程序以处理从具有数字 Sql 类型(仅位、整数、小整数、小整数、浮点数和实数)的列中获取数字。可以通过将其在PDO::setAttribute 中的值设置为true 来打开此标志,例如, $conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE,true); 如果将SQLSRV_ATTR_FETCHES_NUMERIC_TYPE 设置为true,则整数列的结果将表示为int,同样,Sql 类型float 和real 将表示为float。 例外注意事项:
    • 当连接选项标志ATTR_STRINGIFY_FETCHES打开时,即使SQLSRV_ATTR_FETCHES_NUMERIC_TYPE打开,返回值仍然是字符串。
    • 当bind列返回的PDO类型为PDO_PARAM_INT时,即使SQLSRV_ATTR_FETCHES_NUMERIC_TYPE关闭,整数列的返回值也会是int。

【讨论】:

    【解决方案2】:

    我认为这个问题与使用的 PDO 驱动程序有关(使用 PHP 安装,而不是 laravel 配置)。

    不是您想要的,但可能会解决您的问题。从 laravel 5 开始,eloquent 有一个强制转换功能,您的列会自动转换为您的预定义类型。见http://laravel.com/docs/5.0/eloquent#attribute-casting

    // Eloquent Model
    protected $casts = [
        'int_column'   => 'int',
    ];
    

    当从数据库中检索模型时,您的 int_column 将自动转换为 int

    【讨论】:

    • 谢谢 - 如果手动转换它工作正常 - 但有时需要从不同的表加入,所以我无法转换每个值(或?) - 因为它没有存储在我的模型中。我也会检查默认 PDO 配置 - 但这绝对是一个很好的解决方法。
    • 我们也发现了这个问题,似乎 MSSQL PDO 驱动程序将所有数据作为字符串返回。我们正在使用 ZF 并使用 PDOStatement::getColumnMeta 添加自定义语句类,以自动将数据转换为正确的类型。也许 Lavalel 也有类似的功能。
    • @Wader 也许你可以帮帮我。看看这个:stackoverflow.com/questions/51838922/…
    【解决方案3】:

    如果有人在这里寻找如何让 SQLSRV PDO 驱动程序以 PHP 中的浮点数形式返回十进制或货币值 - 不幸的是,这是不可能的:

    格式化十进制字符串和货币值(PDO_SQLSRV 驱动程序)

    为了保持准确性,十进制或数字类型始终被提取为 具有精确精度和比例的字符串。如果任何值小于 1, 缺少前导零。钱和小钱也是一样 字段,因为它们是固定比例等于 4 的十进制字段。

    https://docs.microsoft.com/en-us/sql/connect/php/formatting-decimals-pdo-sqlsrv-driver?view=sql-server-2017

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2016-04-18
      • 2014-05-29
      • 2013-08-11
      相关资源
      最近更新 更多