PHP/MS ACCESS 本地用户可以写入数据库,但远程用户不能

Posted

技术标签:

【中文标题】PHP/MS ACCESS 本地用户可以写入数据库,但远程用户不能【英文标题】:PHP/MS ACCESS Local User can write to DB but remote users cannot 【发布时间】:2017-07-13 19:38:47 【问题描述】:

我正在建立一个从用户那里获取数据并将其放入数据库的站点。我正在使用 MS Access,因为它只会被 20-30 位同事使用。该站点是在 localhost:92 上使用 IIS 7.5 部署的。防火墙规则已启用以允许端口 80-95 上的连接(因为端口上有站点,并且某些端口用于测试站点)。

对于身份验证,我仅启用了 Windows 身份验证并通过授权规则限制用户。

它在网站和访问文件的桌面上运行(Access 2010 accdb 文件存储在我的文档中。我已授予 IIS_IUSRS 访问权限)

所以当我打开网站并输入数据时,它会成功进入数据库。但是,当任何同事尝试使用他们的 PC 时,它会报错:

Fatal error: Uncaught exception 'PDOException' with message 
'SQLSTATE[HY000]: General error: -3035 [Microsoft][ODBC Microsoft Access 
Driver] Operation must use an updateable query. (SQLExecute[-3035] at 
ext\pdo_odbc\odbc_stmt.c:254)' in 
C:\Users\username\Documents\Website\website\index.html:139 
(file:///C:/Users/username/Documents/Website/website/index.html:139) Stack 
trace: #0 C:\Users\username\Documents\Website\website\index.html(139) 
(file:///C:/Users/username/Documents/Website/website/index.html(139)): PDO-
>query('INSERT INTO Tab...') #1 main thrown in 
C:\Users\username\Documents\Website\website\index.html 
(file:///C:/Users/username/Documents/Website/website/index.html) on line 139

我尝试与所有人共享文件夹。数据库上没有锁定。我将 ODBC 注册表项的权限授予 IIS_IUSRS。我给了每个人数据库文件夹权限。也尝试通过授予特定用户权限。没用。

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
$conn = 
    'odbc:Driver=Microsoft Access Driver (*.mdb, *.accdb);' .
    'Dbq=C:\\Users\\username\\Documents\\Website\\Database\\Change.accdb;;ReadOnly=0';

$dbh = new PDO($conn);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if ($_SERVER["REQUEST_METHOD"] == "POST") 
$Change=$_POST["change"];
$Name=$_POST["name1"];
$Inc=$_POST["inc"];
$Waiver=$_POST["waiver"];
$Support=$_POST["support"];
$Environment=$_POST["environment"];
$Attachment=$_POST["attach"];
$SapID=$_POST["sapid"];
$Schedule=$_POST["schedule"];
$ChangeType=$_POST["type"];
$AffectedCI=$_POST["affect"];
$Risk=$_POST["risk"];
$Ref=$_POST["ref"];
$Priority=$_POST["priority"];


$sql = "SELECT * FROM Table2 WHERE UserID LIKE '".$Name."' AND SapID LIKE 
'".$SapID."'";
$result = $dbh->query($sql);
$row = $result->fetch();
if($row == null)
if ($_SERVER["REQUEST_METHOD"] == "POST") 
   echo "<div id='label-text'>Please check your UserID and SapID. If correct 
  mail/ping Anti21</div>";
  
 
else 

$sql1 = 
    "INSERT INTO Table1 (Change,WaiverID,Support,Reviewer,INC_RITM,Attachment,SapID,Schedule,ChangeType,AffectedCI,Risk,Ref,Priority,Environment) " .
    "VALUES ('" .$Change. "','" .$Waiver. "','" .$Support. "','" .$Name. "','" .$Inc. "','" .$Attachment. "','" .$SapID. "','" .$Schedule. "','" .$ChangeType. "','" .$AffectedCI. "','" .$Risk. "','" .$Ref. "','" .$Priority. "','" .$Environment. "')";


$dbh->query($sql1);
echo "Done.\r\n";


?>

编辑:所以我禁用了 Windows 身份验证并切换到匿名身份验证,它开始工作。因此,问题似乎在于 Windows 身份验证。我已在保存网站和数据库的文件夹上授予对 IIS_IUSR 的所有访问权限。我还授予个人用户对该文件夹的完全控制权限并共享该文件夹。那没有用。仍在寻找解决方案。

EDIT2:所以我在另一台未存储 DB 文件的 PC 上使用我的 id 对其进行了测试。它适用于我的身份证。这使我相信问题可能出在权限上。我只需要弄清楚在哪里。

EDIT3:我需要添加想要更改组 IIS_ISURS 的用户。一旦我将它们添加到组中,该站点就停止给出错误。

【问题讨论】:

您对 SQL 注入持开放态度。由于您使用的是 PDO,因此请利用 prepared statements 和 bindparam 或 bindvalue。 这将解决您可能遇到的任何引用问题您还可以尝试回显查询并直接运行它以查看问题所在。 感谢您的建议。我已经在 *** 中,只有授权的人才能访问,所以现在不是优先事项。主要问题是从运行此代码的站点的 PC 上可以正常工作。但是,如果我从其他 PC 上尝试它,它会给我这个错误。所以我认为这与某处的一些权限有关。我可能错了。 第 139 行是哪一行? 回显运行给出 INSERT INTO Table1 (Change,WaiverID,Support,Reviewer,INC_RITM,Attachment,SapID,Schedule,ChangeType,AffectedCI,Risk,Ref,Priority,Environment) VALUES ('ygeuysegr',' SGF ' 'jhgdfjshgjhg', '用户名', 'jhgsdjfhgsdjgf', 'jhgsdjhgfsdhgfj', '51523232', 'hgjfhgsdjfhgsjdfh', 'jhgfsdjhgfjhsdgf', 'jhgsdjgfjgf', 'jhgfsdjgfsjgf', 'jhgfsdjgfsjdfhg', 'jhgjhsdgfjh',' hjgjhsdgfjhg` ') 完成。 $dbh->query($sql1);这是第 139 行 【参考方案1】:

解决了。需要将向数据库中插入数据的用户添加到组 IIS_ISURS。一旦我将它们添加到组中,该站点就停止给出错误。

【讨论】:

以上是关于PHP/MS ACCESS 本地用户可以写入数据库,但远程用户不能的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP/MS Access 的字符编码难题

PHP / MS Access DB 无法查询任何内容

如何使用 C# 正确写入 Access (2002-2003) 数据库

在 Access VBA 中禁止写入冲突消息

如何锁定 Access 数据库以防止写入

什么应用程序可以读取和写入数据到雪花?