ISAM Table 未找到,SQL 在 SQLExecDirect 中状态 S0000
ISAM Table Not Found, SQL state S0000 in SQLExecDirect
- PHP版本:7.0.14
- 正在 Windows Server 2012
- 数据库文件在D:盘
- Website/Application 已正确分配给应用程序池
- 分配的应用程序池具有 D: 驱动器的权限
正在尝试连接 ToppSpeed 数据库并从中获取信息。
使用 Topspeed ODBC 驱动程序正确创建 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 Warning: odbc_exec(): SQL error: [SoftVelocity Inc.][TopSpeed ODBC Driver][ISAM]ISAM Table Not Found, SQL state S0000 in SQLExecDirect in C:\inetpub\wwwroot\projectFolder\odbctest.php on line 9
工作: 当我在 PHP 内置服务器上 运行 相同文件使用命令 > php -S localhost:8002
和 运行 文件在浏览器中 http://localhost:8002/odbctest.php
一切正常。
工作: 当我在命令行 运行 文件时 > php odbctest.php
它工作正常我从 table.
不工作: 我已经在 IIS 管理器中添加了网站,将网站(物理路径是 C:\inetpub\wwwroot\projectFolder
)与本地 IP
当我在具有本地 IP 的浏览器中打开 odbctest.php
时,我得到 Table NOT Found error.
相同的脚本,唯一的区别是它是 运行ning 在命令行上而不是在 IIS 服务器上,它是 运行ning 在 PHP 内置服务器上而不是在 IIS 上工作。
其他技术差异是
我已经放了一个 PHP 文件来查看两台服务器上的 PHP 信息。
这是我发现的唯一区别。
- 正在 PHP 内置服务器上工作:在 PHP 信息中 服务器 API 是:内置 HTTP 服务器
- 无法在 IIS 服务器上工作:在 PHP 信息 服务器 API 中是:CGI/FastCGI
DSN 字符串中没有问题,因为当我将 DSN 字符串更改为未知时,它发现 DSN 字符串中存在错误。
我认为尝试从 IIS 服务器(PHP 运行s on CGI/FastCGI)访问数据时可能存在一些权限问题。
我想知道是否存在权限问题,为什么错误显示 table 未找到!!
我找不到任何关于 TopSpeed 数据库连接错误的好文档,因为这个数据库没有被广泛使用。
有什么建议或想法吗?请指教。提前谢谢你。
数据库 SQL 错误没有说明任何关于权限的信息,
所以我创建了一个简单的另一个 PHP 脚本来将数据附加到 TEXT 文件。
我运行那个PHP脚本在IIS服务器上有两个测试用例
测试用例1:写入驻留在项目目录(同一服务器)中的文本文件
PHP 脚本正确执行并将数据写入文本文件。
测试案例2:我用文件D:\some_directory\logfile.txt
更改文本文件路径(驻留在D盘)
当我再次 运行 它再次编写脚本时,我收到以下错误:
Warning: file_put_contents(D:\some_directory\logfile.txt):
failed to open stream: Permission denied in
C:\inetpub\wwwroot\project-directory\write.php on line 12
确认权限有问题
应用程序池分配给IIS管理器中的网站已经有D: Driver.
的权限所以这不是问题.
在更多研究中,我发现
我们需要先确定USER,我们需要提供权限,用户就是"Anonymous user identity"
的值
我看到匿名用户身份的值不是应用程序池!!
我将其更改为应用程序池标识。
现在 website/application 的 匿名用户身份 成为 应用程序池 并且具有正确的权限。
Afthesethis 更改后,一切正常,因为没有权限问题。
- PHP版本:7.0.14
- 正在 Windows Server 2012
- 数据库文件在D:盘
- Website/Application 已正确分配给应用程序池
- 分配的应用程序池具有 D: 驱动器的权限
正在尝试连接 ToppSpeed 数据库并从中获取信息。
使用 Topspeed ODBC 驱动程序正确创建 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 Warning: odbc_exec(): SQL error: [SoftVelocity Inc.][TopSpeed ODBC Driver][ISAM]ISAM Table Not Found, SQL state S0000 in SQLExecDirect in C:\inetpub\wwwroot\projectFolder\odbctest.php on line 9
工作: 当我在 PHP 内置服务器上 运行 相同文件使用命令
> php -S localhost:8002
和 运行 文件在浏览器中http://localhost:8002/odbctest.php
一切正常。工作: 当我在命令行 运行 文件时
> php odbctest.php
它工作正常我从 table.不工作: 我已经在 IIS 管理器中添加了网站,将网站(物理路径是
C:\inetpub\wwwroot\projectFolder
)与本地 IP
当我在具有本地 IP 的浏览器中打开odbctest.php
时,我得到Table NOT Found error.
相同的脚本,唯一的区别是它是 运行ning 在命令行上而不是在 IIS 服务器上,它是 运行ning 在 PHP 内置服务器上而不是在 IIS 上工作。
其他技术差异是
我已经放了一个 PHP 文件来查看两台服务器上的 PHP 信息。 这是我发现的唯一区别。
- 正在 PHP 内置服务器上工作:在 PHP 信息中 服务器 API 是:内置 HTTP 服务器
- 无法在 IIS 服务器上工作:在 PHP 信息 服务器 API 中是:CGI/FastCGI
DSN 字符串中没有问题,因为当我将 DSN 字符串更改为未知时,它发现 DSN 字符串中存在错误。
我认为尝试从 IIS 服务器(PHP 运行s on CGI/FastCGI)访问数据时可能存在一些权限问题。
我想知道是否存在权限问题,为什么错误显示 table 未找到!!
我找不到任何关于 TopSpeed 数据库连接错误的好文档,因为这个数据库没有被广泛使用。
有什么建议或想法吗?请指教。提前谢谢你。
数据库 SQL 错误没有说明任何关于权限的信息,
所以我创建了一个简单的另一个 PHP 脚本来将数据附加到 TEXT 文件。
我运行那个PHP脚本在IIS服务器上有两个测试用例
测试用例1:写入驻留在项目目录(同一服务器)中的文本文件 PHP 脚本正确执行并将数据写入文本文件。
测试案例2:我用文件
D:\some_directory\logfile.txt
更改文本文件路径(驻留在D盘) 当我再次 运行 它再次编写脚本时,我收到以下错误:
Warning: file_put_contents(D:\some_directory\logfile.txt): failed to open stream: Permission denied in C:\inetpub\wwwroot\project-directory\write.php on line 12
确认权限有问题
应用程序池分配给IIS管理器中的网站已经有D: Driver.
的权限所以这不是问题.
在更多研究中,我发现
我们需要先确定USER,我们需要提供权限,用户就是"Anonymous user identity"
的值我看到匿名用户身份的值不是应用程序池!!
我将其更改为应用程序池标识。
现在 website/application 的 匿名用户身份 成为 应用程序池 并且具有正确的权限。
Afthesethis 更改后,一切正常,因为没有权限问题。