我升级了我的PHP 5.6.30(https://www.apachefriends.org/de/download.html)到PHP 7.0(https://bitnami.com/stack/wamp/installer)
到目前为止,一切都很好,当我使用MySQL数据库时,它将页面的加载时间从1秒2缩短到了300毫秒。但现在我正试图用以下简单的脚本连接到MSSQL数据库,该脚本在我的旧安装(PHP 5.6)中运行良好:
<?php
//Use the machine name and instance if multiple instances are used
$server = 'Server-Adress';
$user = '';
$pass = '';
//Define Port
$port='Port=1433';
$database = 'Databasename';
$connection_string = "DRIVER={SQL Server};SERVER=$server;$port;DATABASE=$database";
$conn = odbc_connect($connection_string,$user,$pass);
if ($conn) {
echo "Connection established.";
} else{
die("Connection could not be established.");
}
$sql = "SELECT * FROM st3_200 WHERE identifier = 1";
$result = odbc_exec($conn,$sql);
// Get Data From Result
while ($data[] = odbc_fetch_array($result));
// Free Result
odbc_free_result($result);
// Close Connection
odbc_close($conn);
// Show data
print_r($data);
?>
但现在我的日志中出现了一个错误,上面写着:
【2015年12月10日星期四11:55:26.629956】【:错误】【pid 260:tid 968】【客户端:1:63003]PHP致命错误:未捕获错误:调用未定义中的函数odbc_connect()C: ''Bitnami''wampstack-0.0.0-0''apache2''htdocs''test''query.php:11''n堆栈跟踪:''n#0{main}''n抛出C: 上的''Bitnami''wampstack-0.0.0-0''apache2''htdocs''test''query.php11号线
首先我想,我的php.ini缺少一个扩展,所以我启用了"extension=php_pdo_odbc.dll"
与5.6版本中的php.ini的不同之处在于它有一个扩展名:"extension=php_mssql.dll"已启用。但我在新的PHP 7.0.ini 中找不到它们
所以我的意图是目前还没有odbc和PHP7的驱动程序?我在这里找到了一些Linux驱动程序:https://aur.archlinux.org/packages/php7-odbc/
但我的Windows环境需要一些东西。
有人有同样的问题并且已经解决了吗?
谢谢和问候Domi
查看php.ini中的字符串
extension=php_odbc.dll
似乎在新安装中丢失了,至少我不得不在新的XAMPP安装中手动添加它(7.0.1)并且意外地刚刚激活了pdo_odbc.dll
PHP7默认情况下禁用了一些以前在PHP5中启用的模块。
不过,这是一个简单的修复方法,因为扩展应该已经存在于PHP7附带的'ext'
文件夹中。您只需要修改php.ini
文件以包含以下行:
extension=php_odbc.dll
上面的行不是已经存在并被注释掉;你实际上需要添加它
PHP在C:'Windows'
中查找php.ini
文件,但它也可能位于您机器上的其他位置。因此,请检查C:'Windows'
和C:'php'
,或者您可能在其他地方安装了PHP。
做出更改后,您可以从命令行检查结果,如下所示:
C:'php'php.exe -m
或者(在重新启动网络服务器/机器之后)从.phtml
文件中,如下所示:
<? phpinfo(); ?>
这将输出一个已启用模块的列表,这些模块现在应该包括odbc;如果没有,那么您可能修改了错误的php.ini
文件(继续查找)或忘记重新启动web服务器/机器。
温馨提示:
如果你有一个非标准的安装,你可以使用这样的绝对路径:
extension=C:'php7x64'ext'php_odbc.dll
extension=php_mssql.dll。
延迟的原因似乎是打算将SQL 2016包含在该驱动程序中,以便将来可以更轻松地迁移。
更新(2016/02/12):
如前所述(见bhagdev回复),github上提供了适用于Windows的PHP sqlsrv驱动程序的"早期技术预览"。
打开php.ini文件并取消注释或添加以下行:
extension_dir = "C:'PHP'ext" ;<- your PHP path
extension=php_pdo_odbc.dll
extension=php_odbc.dll
重置Internet信息服务:在命令提示符下,管理员权限类型:
iisreset
这为我解决了这个问题。
作为Adrian B's提到官方驱动程序的补充,您也可以检查https://github.com/thomsonreuters/msphpsql这是一个非官方港口。不过暂时有限制。
- 仅支持sqlsrv ODBC,不支持PDO
- 不支持ZTS,仅支持NTS
- 仅支持x86
- 它支持ODBC函数的子集,您可以在页面上看到列表
我们需要微软的x86驱动程序。http://www.microsoft.com/ja-jp/download/details.aspx?id=13255*对不起,"ja-jp"是我的。请选择您的国家/地区。有两个驱动程序,一个是32位,但我们需要64位(x86)版本。然后我们可以设置"ODBC数据源(64位)"。它出现在窗口上。最后,查看您的网站。也许它有效。3月29日。2016 Naio
我想你是对的,你需要为你的PHP客户端平台和操作系统下载SQL Server ODBC驱动程序
以下是类似问题的链接:调用未定义的函数odbc_connect()
你也可以尝试为MySQL安装这个连接器(如果你使用MySQL):连接器/ODBC
或者,如果您使用MSSQL:ODBC Driver 11 for SQL Server
我知道这个问题相当古老。但我最近遇到了同样的问题。。。
@Naio是对的:确实有不同版本的ODBC驱动程序,基于体系结构(32位或64位)。PHP使用的驱动程序取决于它自己的版本。
换句话说,如果您使用32位ODBC环境,请确保使用32位版本的PHP。。。
我的猜测是,通过从PHP 5.6切换到PHP 7.0,您也从32位版本切换到了64位版本。