找不到ISAM表,SQLExecDirect中的SQL状态S0000

问题描述 投票:1回答:1
  • PHP版本:7.0.14
  • 在Windows Server 2012上工作
  • 数据库文件位于D:驱动器中
  • 网站/应用程序正确分配给应用程序池
  • 分配的应用程序池具有D:驱动器的权限

尝试连接并从ToppSpeed数据库获取信息。

使用Topspeed ODBC Driver正确创建DSN。

我创建了一个示例脚本来验证它是否正常工作。

odbctest.php

       $conn=odbc_connect("DSN_NAME",'',''); //Make a coonection to DSN

        if (!$conn){
            exit("Connection Failed: " . $conn);
        }

        $sql="SELECT * FROM ExampleTableName"; // Query String

        $rs=odbc_exec($conn,$sql);            //Execute Query <--- Error Line

        if (!$rs) {
            exit("Error in SQL");
        }

        while (odbc_fetch_row($rs)){
            var_dump(odbc_result($rs,1));
        }

        odbc_close($conn);

错误:

PHP警告:odbc_exec():SQL错误:[SoftVelocity公司] [TopSpeed ODBC驱动程序] [ISAM] ISAM表未找到,SQL状态S0000在SQLExecDirect中的C:\ inetpub \ wwwroot \ projectFolder \ odbctest.php在第9行

  • 工作:当我使用命令> php -S localhost:8002在PHP内置服务器上运行相同的文件并在http://localhost:8002/odbctest.php的浏览器中运行文件一切正常。
  • 工作:当我在命令行中运行文件> php odbctest.php它工作正常我从表中获取数据。
  • 不工作:我在IIS管理器中添加了网站,将网站绑定(物理路径为C:\inetpub\wwwroot\projectFolder)与本地IP 当我在具有本地IP的浏览器中打开odbctest.php时,我得到了Table NOT Found error.

相同的脚本,唯一的区别是它在命令行上而不是在IIS服务器上运行,它在PHP内置服务器上运行而不在IIS上运行。

其他技术差异是

我已经放了一个PHP文件来查看两台服务器上的PHP信息。这是我发现的唯一区别。

  • 使用PHP内置服务器:在PHP中,info Server API是:内置HTTP服务器
  • 不在IIS服务器上工作:在PHP中,Info Server API是:CGI / FastCGI

DSN字符串中没有问题,因为当我使用unknown更改DSN字符串时,它会识别DSN字符串中存在错误。

我认为在尝试从IIS服务器访问数据时可能存在一些权限问题(PHP在CGI / FastCGI上运行)。

我想知道是否存在权限问题为什么错误表没有找到表!!

我找不到TopSpeed数据库连接错误的任何好文档,因为该数据库没有被广泛使用。

有什么建议或想法吗?请指教。先感谢您。

php iis permissions odbc windows-server-2012
1个回答
0
投票

数据库SQL错误没有说明权限,

所以我创建了一个简单的另一个PHP脚本来将数据附加到TEXT文件。

我在IIS服务器上运行了带有两个测试用例的PHP脚本

  • 测试用例1:写入驻留在项目目录中的文本文件(同一服务器)并且PHP脚本正确执行并将数据写入文本文件。
  • 测试用例2:我用文件D:\some_directory\logfile.txt更改文本文件路径(驻留在D盘上)当我再次运行它脚本时,我收到以下错误:

警告:file_put_contents(D:\ some_directory \ logfile.txt):无法打开流:第12行的C:\ inetpub \ wwwroot \ project-directory \ write.php中的权限被拒绝

它确认了权限存在一些问题

在IIS管理器中分配给网站的应用程序池已获得D: Driver.的许可所以这不是问题所在。在更多的研究中,我发现了

我们需要首先识别我们需要提供权限的USER,并且用户是“匿名用户身份”的值

https://stackoverflow.com/a/32033941/5236174

https://www.iis.net/configreference/system.webserver/security/authentication/anonymousauthentication?showTreeNavigation=true

我看到匿名用户身份的价值不是应用程序池!!

我将其更改为应用程序池标识。

所以现在网站/应用程序的匿名用户身份成为应用程序池并具有正确的权限。

Aftheset这个变化,一切都很好,因为没有权限问题。

© www.soinside.com 2019 - 2024. All rights reserved.