如何从具有正确字段类型的数据库中获取值?
我正在使用 PDO Sqlsrv 从数据库获取数据,并且我总是以字符串形式接收数据,如下所示:customer_id : "1"我的customer_id字段类型应该是整数,customer_id : 1但phone_number字段类型是 varchar 它返回正确的字符串类型,例如:phone_number : "12345678"
编辑:
我正在使用 PHP 5.5。我已经尝试过这个。
$this->dbh->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE, true);
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误Fatal error: Undefined class constant 'SQLSRV_ATTR_FETCHES_NUMERIC_TYPE'
我的 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);
Run Code Online (Sandbox Code Playgroud) 我设置了一台服务器,安装并运行了以下内容:
Ubuntu 20.04
NGINX 1.17.10
PHP 7.4.5
PHP 安装确实已安装 PDO SQLSRV 驱动程序并正常工作。
我需要将 PHP 5.6 添加到旧网站的同一服务器上。我能够成功安装 PHP 5.6。但我似乎无法正确安装 SQLSRV 驱动程序部分。
我之前在设置 PHP 7.4 时在服务器上安装了 mssql 工具:
apt-get install msodbcsql17 -y
apt-get install mssql-tools
apt install unixodbc-dev
pecl install sqlsrv
pecl install pdo_sqlsrv
Run Code Online (Sandbox Code Playgroud)
在尝试将其设置为 5.6 时,我确实遵循了原始安装的步骤。我运行了以下命令:
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/5.6/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/5.6/mods-available/pdo_sqlsrv.ini
phpenmod -v 5.6 sqlsrv pdo_sqlsrv
pecl config-set php_ini /etc/php/5.6/fpm/php.ini
ls /etc/php/5.6/fpm/conf.d/*sqlsrv.ini
Run Code Online (Sandbox Code Playgroud)
所有命令均成功运行。然后我将以下行添加到相关的 php.ini 文件 /etc/php/5.6/fpm/php.ini
extension=sqlsrv.so
extension=pdo_sqlsrv.so
Run Code Online (Sandbox Code Playgroud)
我重新加载并重新启动 php5.6-fpm,然后重新启动 NGINX。PHP 5.6 已成功安装,我可以通过运行 phpinfo() 查看信息。我在安装过程中没有遇到任何错误。然而,在 PDO …
我很难绑定我的 SQL 查询,而且我只剩下几个脑细胞了。
基本上,此代码有效但容易受到 SQL 注入:
return DB::connection('sqlsrv_rfo_user')
->table('dbo.tbl_rfaccount')
->insert([
'Email' => $email,
'id' => DB::raw("CONVERT(binary, '$username')"),
'password' => DB::raw("CONVERT(binary, '$password')"),
'birthdate' => $birthday,
'accounttype' => 0,
'BCodeTU' => 1
]);
Run Code Online (Sandbox Code Playgroud)
我想弄清楚如何绑定这些代码行:
'id' => DB::raw("CONVERT(binary, '$username')"),
'password' => DB::raw("CONVERT(binary, '$password')"),
Run Code Online (Sandbox Code Playgroud)
我确实尝试过:
'id' => DB::raw("CONVERT(binary, ?)", [$username]),
'password' => DB::raw("CONVERT(binary, ?)", [$password]),
Run Code Online (Sandbox Code Playgroud)
并收到此错误:
SQLSTATE[07002]: [Microsoft][ODBC Driver 13 for SQL Server]COUNT field incorrect or syntax error (SQL: insert into [dbo].[tbl_rfaccount] ([Email], [id], [password], [birthdate], [accounttype], [BCodeTU]) values (user@example.com, CONVERT(binary, 2011-11-11 00:00:00), CONVERT(binary, …Run Code Online (Sandbox Code Playgroud) 我们在Windows上运行php 5.3.27,nts.
我们刚刚因PCI中的会话固定漏洞而无法进行PCI扫描,需要重新获得PCI合规性.
这有点令人沮丧,因为我们在登录后使用session_regenerate_id(),所以在我看来(也许我错了)我们的应用程序即使是php也不容易受到攻击.
要通过扫描,我们需要升级到PHP 5.5.2.
我们使用Microsoft的sqlsrv驱动程序扩展,我注意到他们还没有发布php 5.5.x的版本
有没有人为这个问题提供生产可行的解决方案?
__ _ __ _更新_ __ _ __ _ __ _ _
我发现这 是一个非供应商版本http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e1d37219-88a3-46b2-a421-73bfa33fe433/unofficial-php-55-drivers-x86.
有没有人在生产中使用过这个版本?
谢谢
我有一个存储过程,它创建一个临时表(#test),用另一个表中的数据填充它,在这个时态表上运行3选择并删除它.
原始表大于20 GB,3个SELECT语句在原始SP上包含许多不同的条件.
我正在使用SQLSRV从PHP执行SP但是我只能设法检索2个第一个结果集.
如果我从MSSMS运行SP,它将运行得很好,并按预期返回3个结果集.但是从PHP它只会返回2(尝试每个组合).
不确定这是否是驱动程序sqlsrv_fetch_array或sqlsrv_next_result的问题.
SP的示例(选择语句太大,所以我只是恢复它们):
CREATE PROCEDURE sp_transfers
@dt date,
@campaign varchar(16)
AS
BEGIN
CREATE TABLE #test ( [column definitions...] )
BEGIN
INSERT INTO #test SELECT * FROM sometable WHERE dt = @dt AND campaign = @campaign
SELECT * FROM #test ...
SELECT * FROM #test ...
SELECT * FROM #test ...
DROP TABLE #test
END
Run Code Online (Sandbox Code Playgroud)
现在从PHP开始,这是我的测试代码:
$q = sqlsrv_query($conn,"EXEC sp_transfers @dt='2013-10-01',@campaign='1234'");
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as …Run Code Online (Sandbox Code Playgroud) 系统信息
内容管理系统:WordPress
网络服务器:XAMPP
PHP 版本:5.5.30
微软管理工作室 17
目标
使用 PHP 建立 MSSQL 数据库连接
已经做了什么
C:\xampp\php\extextension=php_pdo_sqlsrv_55_ts.dll:extension=php_pdo_sqlsrv_55_nts.dll代码
$serverName = "technology-pc\sqlexpress";
// The connection will be attempted using Windows Authentication.
$connectionInfo = array( "Database"=>"example_db");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.<br />";
} else {
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
Run Code Online (Sandbox Code Playgroud)
错误 …
在为 PHP7 安装 sqlsrv 模块时,我收到以下错误 -
没有可用于包“pecl.php.net/sqlsrv”的版本
使用的命令
sudo pecl install sqlsrv
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
我在我的项目中使用sqlsrv 数据库连接,因为我需要连接到 Microsoft SQL 数据库。
我已经成功安装了sqlsrv 驱动程序,因为我可以连接到数据库来检索数据。
但是当我尝试进行 Laravel 迁移时,它显示了一个错误:
Illuminate\Database\QueryException : could not find driver (SQL: select * from sysobjects where type = 'U' and name = migrations)
Run Code Online (Sandbox Code Playgroud)
下面是我的 .env
DB_CONNECTION=sqlsrv
DB_HOST=**********.database.windows.net
DB_PORT=1433
DB_DATABASE=****************_4cd1_9d18_2a7d9ddbcd13
DB_USERNAME=***************_4cd1_9d18_2a7d9ddbcd13_ExternalWriter
DB_PASSWORD=***************
Run Code Online (Sandbox Code Playgroud)
配置文件
extension=php_xmlrpc.dll
extension=php_xsl.dll
extension=php_pdo_sqlsrv_7_nts_x64.dll
extension=php_pdo_sqlsrv_7_nts_x86.dll
extension=php_pdo_sqlsrv_7_ts_x64.dll
extension=php_pdo_sqlsrv_7_ts_x86.dll
extension=php_pdo_sqlsrv_71_nts_x64.dll
extension=php_pdo_sqlsrv_71_nts_x86.dll
extension=php_pdo_sqlsrv_71_ts_x64.dll
extension=php_pdo_sqlsrv_71_ts_x86.dll
extension=php_sqlsrv_7_nts_x64.dll
extension=php_sqlsrv_7_nts_x86.dll
extension=php_sqlsrv_7_ts_x64.dll
extension=php_sqlsrv_7_ts_x86.dll
extension=php_sqlsrv_71_nts_x64.dll
extension=php_sqlsrv_71_nts_x86.dll
extension=php_sqlsrv_71_ts_x64.dll
extension=php_sqlsrv_71_ts_x86.dll
Run Code Online (Sandbox Code Playgroud) 我尝试将 mssql 连接到我的 symfony 项目,但收到错误 SQLSTATE[08001]: [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:1416F086:SSL 例程:tls_process_server_certificate:证书验证失败:自签名证书]所以我想在 pdo 概念上设置“TrustServerCertificate=yes”,但无法弄清楚它在
我尝试在 .env 中编写的symfony 上的表现
DATABASE_MSSQL_URL="mssql://用户:密码@ip:端口/db_name?Trusted_Connection=yes&Encrypt=yes&TrustServerCertificate=yes"
在 config/packages/doctrine.yaml 中:
dbal:
jtl:
url: '%env(resolve:DATABASE_MSSQL_URL)%'
driver: 'pdo_sqlsrv'
server_version: '13'
charset: utf8mb4
Run Code Online (Sandbox Code Playgroud)
这没有帮助
我正在尝试使用 Xampp 将我的 SQL 服务器与 PHP 连接。我已经在ext文件夹中上传了dll文件,但无法连接它。我的PHP版本是7.2.6。上传的dll文件是-php_pdo_sqlsrv_72_ts.dll、php_sqlsrv_72_ts.dll。我编写了这段代码来使用 PHP 连接我的 SQL 数据库-
<?php
$serverName = "INDO-SERV\SQLEXPRESS,1443";
$uid = "sa";
$pwd = "XXXXXX";
$databaseName = "web";
$connectionInfo = array("UID" => $uid, "PWD" => $pwd, "Database"=>$databaseName);
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn )
{
echo "Connection established.\n";
}
else
{
echo "Connection could not be established.\n";
die( print_r( sqlsrv_errors(), true));
}
sqlsrv_close( $conn);
?>
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我收到此错误 -
致命错误:未捕获错误:调用 C:\xampp\htdocs\biometric\db.php:7 中未定义的函数 sqlsrv_connect() 堆栈跟踪:#0 {main} 抛出 C:\xampp\htdocs\biometric\db.php 7号线。
任何人都知道我做错了什么或者如何连接数据库。