简体   繁体   English

PHP PDO Sqlsrv 总是将每个值作为字符串返回

[英]PHP PDO Sqlsrv always return every values as string

How do I get value from DB with correct field type?如何使用正确的字段类型从数据库中获取价值?

I'm using PDO Sqlsrv to fetch data from DB and I always receive data as string like: customer_id : "1" My customer_id field type is integer it should be customer_id : 1 But phone_number field type is varchar it return to correct type as string like: phone_number : "12345678"我正在使用 PDO Sqlsrv 从数据库中获取数据,并且我总是以字符串形式接收数据,例如: customer_id : "1"我的customer_id字段类型是整数,它应该是customer_id : 1但是phone_number字段类型是 varchar 它以字符串形式返回正确的类型如:电话phone_number : "12345678"

EDIT:编辑:

I'm using PHP 5.5.我正在使用 PHP 5.5。 I've tried this.我试过这个。

$this->dbh->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE, true);

And I got this error Fatal error: Undefined class constant 'SQLSRV_ATTR_FETCHES_NUMERIC_TYPE'我收到了这个错误Fatal error: Undefined class constant 'SQLSRV_ATTR_FETCHES_NUMERIC_TYPE'

My PDO code :我的 PDO 代码:

$this->dbh = new PDO('sqlsrv:Server=' . $_ENV['DB_HOST'] . ';Database=' . $_ENV['DB_NAME'], $_ENV['DB_USER'], $_ENV['DB_PASS']);
$this->dbh->exec('set names ' . $_ENV['DB_CHAR_SET']);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$this->dbh->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE, true); // Got Error 
$this->dbh->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);

Solution:解决方案:

I will answer exactly to your question and what you may try is to use PDOStatement::bindColumn .我将准确回答您的问题,您可以尝试使用PDOStatement::bindColumn You use PHP 5.5 and based on support matrix , your PHP Driver version should be 3.1 or 3.2.您使用 PHP 5.5 并且基于支持矩阵,您的 PHP 驱动程序版本应该是 3.1 或 3.2。 In this version, based on change log , SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is not supported.在此版本中,基于 更改日志,不支持SQLSRV_ATTR_FETCHES_NUMERIC_TYPE

...
$stmt->bindColumn('customer_id', $customer_id, PDO::PARAM_INT);
$stmt->bindColumn('phone_number', $phone_number, PDO::PARAM_STR);
while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
    var_dump($customer_id);
    var_dump($phone_number);
    echo '<br>';
}
...

You don't say what version of SQLSRV you are using but chances are that it's older than 4.0.8 , when the directive was implemented:您没有说明您使用的是什么版本的 SQLSRV,但很可能在实现指令时它早于4.0.8

 [Added] - SQLSRV_ATTR_FETCHES_NUMERIC_TYPE attribute support.

I don't think there's a simple generic way to determine what your version is ( phpinfo() 's output does not display it) but you can just upgrade to latest version.我认为没有一种简单的通用方法来确定您的版本是什么( phpinfo()的输出不显示它),但您可以升级到最新版本。

Update: try sqlsrv_client_info() .更新:尝试sqlsrv_client_info()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM