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

时间:2017-02-22 15:43:29

标签: php iis permissions odbc windows-server-2012

  • 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 on第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信息服务器API是:内置HTTP服务器
  • 不在IIS服务器上工作:在PHP信息中服务器API是:CGI / FastCGI

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

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

我想知道是否存在权限问题,为什么错误显示表未找到!!

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

有任何建议或想法吗?请指教。提前谢谢。

1 个答案:

答案 0 :(得分: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. 的许可,所以这不是问题。 在更多研究中,我发现

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

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

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

我发现匿名用户身份的值不是应用程序池!

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

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

此后,由于没有权限问题,一切正常。