2017-07-13 24 views
0

我正在設置一個站點,該站點從用戶處獲取數據並將其放入數據庫。我使用MS Access,因爲這隻會被20-30位同事使用。該站點在localhost上使用IIS 7.5進行部署:92已啓用防火牆規則以允許在端口80-95上進行連接(因爲端口上有站點,某些端口用於測試站點)。PHP/MS ACCESS本地用戶可以寫入數據庫,但遠程用戶不能使用

對於身份驗證我只啓用了Windows身份驗證,並通過授權規則限制用戶。

這對將網站和訪問文件的桌面上運行(訪問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 

我想分享與everyone.There的文件夾在DB沒有鎖。我將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_IRR的全部訪問權限。我也給了個人用戶對該文件夾的完全控制權並共享了該文件夾。這沒有用。仍在尋找解決方案。

EDIT2:所以我在不存儲數據庫文件的其他PC上測試了它。它與我的ID一起工作。這導致我相信這個問題可能與權限有關。我只需要弄清楚在哪裏。

編輯3:我需要添加用戶誰想要更改組IIS_ISURS。一旦我將它們添加到該組中,該網站就不會再出現錯誤。

+0

您已經開放SQL注入。由於您使用的是PDO,請利用[準備好的語句](https://secure.php.net/manual/en/pdo.prepared-statements.php)和[bindparam](http://php.net/ manual/en/pdostatement.bindparam.php)或[bindvalue](http://php.net/manual/en/pdostatement.bindvalue.php)。 **這將解決您可能遇到的任何引用問題**您也可以嘗試回顯查詢並直接運行以查看問題可能存在的位置。 – aynber

+0

感謝您的建議。我已經在VPN內部,只有授權人員才能訪問,所以現在不是優先考慮的事情。主要的問題是,從網站運行的PC上運行這段代碼。但是,如果我從其他PC上嘗試它,它會給我那個錯誤。所以我認爲這是關於一些權限的地方。我可能是錯的。 – Anti21

+0

哪一行是139? – aynber

回答

0

已解決。需要將要將數據插入數據庫的用戶添加到組IIS_ISURS。一旦我將它們添加到該組中,該網站就不會再出現錯誤。

相關問題