我想从我的数据库中以整数形式返回 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 的此问题的全局解决方案(影响所有表/模型的单一更改)。希望这会帮助其他正在为同样的事情苦苦挣扎的人。
- 从 Git 存储库 (Microsoft/msphpsql) 获取最新版本的驱动程序。 Microsoft 下载页面上发布的当前版本是旧版本,无法使用(截至 2016 年 9 月 13 日)。
- 将适当的 DLL 复制到您的
php/ext
文件夹中(替换/删除旧版本)。您可能需要停止/启动您的 Web 服务器(当然,如果是 IIS)以释放原始文件以供替换/删除。 如果文件名与您之前安装的版本不同,请更新您的php.ini
文件。 更新驱动程序配置以包含新的
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 inPDO::setAttribute
totrue
, For example,$conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE,true);
IfSQLSRV_ATTR_FETCHES_NUMERIC_TYPE
is set totrue
the results from an integer column will be represented as anint
, likewise, Sql types float and real will be represented asfloat
. Note for exceptions:
- When connection option flag
ATTR_STRINGIFY_FETCHES
is on, even whenSQLSRV_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 ifSQLSRV_ATTR_FETCHES_NUMERIC_TYPE
is off.
关于php - Laravel PDO 设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31563747/