【问题标题】:Unable to insert data into MS SQL Server using PHP in IIS无法在 IIS 中使用 PHP 将数据插入 MS SQL Server
【发布时间】:2016-05-18 05:18:55
【问题描述】:

由于我是 PHP 新手,我想将在 IIS 服务器上运行而不是 WAMP/XAMP 服务器的 PHP 表单数据插入 MS SQL Server。

我已经安装了 PHP 连接 MS SQL Server 所需的所有驱动程序。

以下是我尝试过的简单代码。我可以连接到 MS SQL Server,但无法执行任何操作。

<html>
<head>
<title>PHP Test</title>
</head>
<body>
<form action="md.php" method="post">
    <input name="empName" type="text"><br><br>
    <button name="submit" id="submit" value="submit">Submit</button>
</form>
<?php
$serverName = "MD\MSSQLSERVER,1433";
$conn = new PDO("sqlsrv:Server=$serverName;Database=CTest", "sa", "P@ssw0rd");

if($conn)
{
echo "Connection established.</br></br>";

if(isset($_POST['submit']) && !empty($_REQUEST['emp_name']))
{
    $empName = $_POST['empName'];
    echo $emp_name;
    $sql = "INSERT INTO EMP_DETAILS VALUES('$empName')";
    //$params = array($empName);  
    $stmt = sqlsrv_query($conn, $sql);
    sqlsrv_close($conn);
}

}
else
{
    echo "Connection could not be established.</br>";
    die(print_r(sqlsrv_errors(), true));
}
?>
</body>
</html>

错误日志也是空的!

【问题讨论】:

  • 尝试在$stmt = sqlsrv_query($conn, $sql);之后添加if( $stmt === false ) { die( print_r( sqlsrv_errors(), true)); },看看数据库是否返回任何错误
  • 在您的 php 起始标签 &lt;?php 之后添加 error_reporting(E_ALL); 并重试,如果您遇到任何错误,请告诉我们..!
  • @Gvidas,我之前也试过这个。即使现在也是。但是没有用。错误日志中也没有报告。
  • @UmairShahYousafzai,我做了,但没有结果。
  • @MohammedAhmedF:您确定您的 MS SQL 凭据正确吗?尝试使用相同的 MS SQL 登录凭据通过SHELL 登录,以确认凭据正确..!

标签: php sql-server iis


【解决方案1】:

嗨,

我猜这是一个权限问题。首先通过在你的 php 脚本的开头插入这个来检查这个。

echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";

选择指定的用户并转到 IIS 管理器 - 应用程序池。 在那里您更改相应的用户并从 ApplicationPoolIdentity -> 高级设置更改。

您可以在这里看到我通过更改 ASP.NET 1.1 的默认值来通过 IIS 7.5 访问某个 ODBC DNS 所做的更改:

您可以使用 SQL-Server-Authentication 或 Windows-Authentication。

然后您可以使用本地/系统。这将使您的应用程序在 NT AUTHORITY\SYSTEM 下运行,默认情况下这是 sql 数据库的现有登录名,或者将其更改为您喜欢的登录名。这是简单的方法,但自然也必须考虑安全性。这需要进一步的步骤。这只是为了让它工作。

在此处查看 SQL 服务器端权限作为图像。

还有一些其他的先决条件,可能很重要:

检查 phpinfo() 中的 PDO 支持: “sqlsrv”应该在“启用”列表中。 连接字符串:sqlsrv:Server=xxxxxxxxxxx;Database=cTest

IIS 7.0 中的 PHP 管理器转到 PHP 管理器 ->PHP 扩展 ->启用禁用扩展 ->禁用列表 启用您的 PHP_PDO_SQLSRV_5(xx)_nts.dll。

它可能 - 结合您使用的 php 版本 - 取决于 Microsoft 驱动程序:3.1 到 2.0 dll 文件

https://msdn.microsoft.com/en-us/library/cc296170%28v=sql.105%29.aspx

而且 - 如果你必须通过防火墙 - 打开端口 1433

但我想这些先决条件都在您的环境中得到满足,因为如果您没有得到 php 错误输出。 IIS 只是因为权限问题而挂起。

好的 - 我阅读了您的修正案 1 首先是从你的 php 脚本中指示用户的问题。

exec('whoami');

请告诉我,如果你愿意的话。我需要它来做进一步的解释。

好的 - 我阅读了您的修正案 2 NT_AUTHORITY/iusr - 啊,好吧 - 他属于 IIS_IUSRS 组。这有点奇怪,IIS 7.5 在 IUSR 之下运行。但是,好的,让我反思一下。 ... 就是这个

我从来没有为 IUSR 这样做过,但让我们尝试一下。记住所有回滚步骤。

首先进入 IIS 管理器,单击应用程序池,然后将指定右侧的屏幕截图发送给我(“用户”)。通常它是 ASP.NET 1.1。而不是IUSR。这是非常不安全的!

我需要屏幕截图,因为您的应用程序池身份设置中似乎设置了一些非常奇怪的东西。

在此处查看我关于尝试将 IUSR 设置为身份的消息:

我必须反思。请稍等片刻。有一点很奇怪。

好的 - 我看到了你的截图和修改 3

IIS 使用 IUSR 因为 PDO 权限 - 这没关系。 所以我们从 SQL Server 权限的另一端来做:

1 将“NT AUTHORITY\IUSR”用户添加到 SQL 的安全性

2 将服务器角色设置为public或DBcreator,并设置用户也可以访问的数据库的映射(db_owner的成员)

你知道在哪里制作吗?

如果没有 - 我们可以在 DefaultAppPool 设置中尝试一个非常简单的事情。我现在离开办公室两个小时。

您可以先尝试一下。如果您的数据库权限包括通常包含的 NT_AUTORITY/SYSTEM,则它可以运行。

您在 DefaultAppPool 的高级设置中进行了设置

如果 SQL-Server 端具有这些权限,这可以简单地使其运行 - 我猜是这样。

好的 - 我读了你的修正案 4


现在将您的连接字符串用户名和密码设置为 NULL

$conn = new PDO("sqlsrv:Server=$serverName;Database=CTest", NULL, NULL);


并在 SQL 管理中进行更改:

我尝试了 SQL EXPRESS:

echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
$serverName = "RWTH-SAP1\SQLEXPRESS,1433";
try {
    $conn = new PDO("sqlsrv:Server=$serverName\SQLEXPRESS;Database=master",NULL, NULL);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
    echo $e;
    die("Error connecting to SQL Server");
}

echo "Connected to SQL Server\n";

我在 SQL Server 2008 R2 上试用过

<?php
echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
try {
        $conn = new PDO("sqlsrv:Server=RWTH-SAP1\RWTH-SAP1,1433;Database=ECC", NULL, NULL);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected to SQL Server\n";
    } catch (PDOException $e) {
        echo $e;
        die("Error connecting to SQL Server");
    }


?>

它在我的环境中使用我们尝试过的设置。也可以用对应的连接字符串测试一下吗?

$conn = new PDO("sqlsrv:Server=$serverName\xxxxxxxx;Database=xxxx",NULL, NULL);

<?php
echo "Server Software: ".$_SERVER['SERVER_SOFTWARE']."<br>"."Server builtin account: ".exec('whoami')."<br><br>";
try {
        $conn = new PDO("sqlsrv:Server=RWTH-SAP1\SQLEXPRESS;Database=", NULL, NULL);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected to SQL Server<br>";
        $sqlDB = "CREATE DATABASE testStackoverflow";
        $connSQL = $conn->exec($sqlDB);
        echo "Database Created<br>"; 
        $conn->query("use testStackoverflow");

        // sql to create table
        $sql = "CREATE TABLE MyGuests (
        firstname VARCHAR(30) ,
        lastname VARCHAR(30)  ,
        email VARCHAR(50)     ,
        reg_date TIMESTAMP
        );";
        // use exec() because no results are returned
        $conn->exec($sql);
        echo "Table MyGuests created successfully";
    }
catch (PDOException $e) {
        echo $e;
        die("Error connecting to SQL Server");
    }
$conn = null;
?>

调试也可以。所以所有 PDO 的东西都能正常工作。

同样重要的是,您可以更改您的 PHP APP_POOL_ID,就我而言:

_SERVER["APP_POOL_ID"]  ASP.NET 1.1  

这里:

_SERVER["APP_POOL_CONFIG"]  C:\inetpub\temp\apppools\ASP.NET 1.1\ASP.NET 1.1.config   

最好的问候

Axel Arnold Bangert - 2016 年黑措根拉特

【讨论】:

  • 我试过了。但没有结果。是的,你是对的,IIS 因 MS SQL 的权限问题而挂起。但是,我不明白 SQL 权限配置部分。能否请您详细说明。谢谢。
  • exec('whoami'); -> nt 权限\iusr
  • 现在我收到此错误:[18-May-2016 16:31:01 Asia/Kolkata] PHP 致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[28000]: [Microsoft] [SQL Server Native Client 11.0][SQL Server]用户“sa”登录失败。在 C:\inetpub\wwwroot\md.php:23 堆栈跟踪:#0 C:\inetpub\wwwroot\md.php(23): PDO->__construct('sqlsrv:Server=M...', 'sa ', 'P@ssw0rd') #1 {main} 在第 23 行的 C:\inetpub\wwwroot\md.php 中抛出
【解决方案2】:

我想我对查询有疑问。您应该使用
$query = "INSERT INTO TABLENAME (id,name) VALUES ('$id','$name')"; 像这样。

【讨论】:

  • 谢谢。我的查询是正确的,因为 ID 是自动递增的。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多