我正在設置一個站點,該站點從用戶處獲取數據並將其放入數據庫。我使用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。一旦我將它們添加到該組中,該網站就不會再出現錯誤。
您已經開放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
感謝您的建議。我已經在VPN內部,只有授權人員才能訪問,所以現在不是優先考慮的事情。主要的問題是,從網站運行的PC上運行這段代碼。但是,如果我從其他PC上嘗試它,它會給我那個錯誤。所以我認爲這是關於一些權限的地方。我可能是錯的。 – Anti21
哪一行是139? – aynber