尝试在Windows上将Linux与SQL Server连接时出现连接问题

时间:2019-12-20 08:20:13

标签: sql-server sql-server-2012 php

我有2台服务器连接到同一网络。其中之一是Fedora Web服务器,其中包含网页和表单。另一个是包含SQL Server 2012的Windows Server 2008 R2。

我将sqlsrv扩展名安装到Web服务器中,以将表单连接到Windows Server上的数据库。

我已经按照Microsoft教程进行了操作,但是仍然无法使用。当我尝试输入表单时,发生了一些错误。

在phpinfo中出现sqlsrv和pdo_sqlsrv。因此,我尝试在不同的文件中使用不同的代码,但是它们都给出了不同的错误。

testpdo.php

<?php
    $serverName = "192.168.9.10:1433";
    $database = "logytel";
    $uid = 'sa';
    $pwd = 'pass';
    try {
        $conn = new PDO(
            "odbc:mssql=$serverName;Database=$database",
            $uid,
            $pwd,
            array(
                //PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            )
        );
    }
    catch(PDOException $e) {
        die("Error connecting to SQL Server: " . $e->getMessage());
    }
    echo "<p>Connected to SQL Server</p>\n";
    echo "<p>PDO::ATTR_PERSISTENT value:</p>\n";
    echo "<pre>";
    echo var_export($conn->getAttribute(PDO::ATTR_PERSISTENT), true);
    echo "</pre>";
    echo "<p>PDO::ATTR_DRIVER_NAME value:</p>\n";
    echo "<pre>";
    echo var_export($conn->getAttribute(PDO::ATTR_DRIVER_NAME), true);
    echo "</pre>";
    echo "<p>PDO::ATTR_CLIENT_VERSION value:</p>\n";
    echo "<pre>";
    echo var_export($conn->getAttribute(PDO::ATTR_CLIENT_VERSION), true);
    echo "</pre>";
    $query = 'select top 5 * from tbl_users';
    $stmt = $conn->query( $query );
    echo "<pre>";
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        print_r($row);
    }
    echo "</pre>";
    // Free statement and connection resources.
    $stmt = null;
    $conn = null;
?>

尝试连接到它时会发生此错误

  

连接到SQL Server时出错:找不到驱动程序

testsql.php

<?php
    function FormatErrors( $errors )
    {

     /* Display errors. */

     echo "Error information: <br/>";


      if(!$errors || is_array($errors) ) {
           return ;
      }

     foreach ( $errors as $error );

     {

     echo "SQLSTATE: ".$error['SQLSTATE']."<br/>";

     echo "Code: ".$error['code']."<br/>";

     echo "Message: ".$error['message']."<br/>";

     }

    }

$q = isset($_GET['q'])? intval($_GET['q']) : 0;
$serverName = "192.168.9.10:1433";
$conInfo = array ( "Database"=>"logytel", "UID"=>"sa", "PWD"=>"pass");
$con = sqlsrv_connect($serverName, $conInfo);
if ($con) {
    echo "Conexión establecida.<br>";
}else{
    echo "La conexión no se pudo establecer.<br>";
    die( print_r(sqlsrv_errors(), true));
}

    sqlsrv_select_db($con,"ajax_demo");
    $sql="SELECT * FROM prueba1 WHERE codigo = '".$q."'";

    $getResults= sqlsrv_query($con, $sql);

    if ($getResults == FALSE) {

      die(FormatErrors(sqlsrv_errors()));
    }


    $cantidad_encontrado = sqlsrv_num_rows($getResults);

    if ($cantidad_encontrado > 0) {
            // solo se pone los ; (punto y comas) al finalizar la sentencias, no entre lineas de tu echo.
            echo "<table>
                  <tr>
                  <th>Código</th>
                  <th>Nombre</th>
                  <th>Apellidos</th>
                  <th>Proyecto</th>
                  </tr>";  //<- aqui termina la sentencia, lo que esta arriba es solo texto plano que el compilador interpreta como STRING y no como sentencia

            while($row = sqlsrv_fetch_array($getResults)) {
                echo "<tr>";                                 // en cada uno de estos puntos, debes de colocar el ;
                echo "<td>" . $row['codigo'] . "</td>";    
                echo "<td>" . $row['nombre'] . "</td>";    
                echo "<td>" . $row['apellidos'] . "</td>";  
                echo "<td>" . $row['proyecto'] . "</td>";
                echo "</tr>";
            }

            echo "</table>";


    sqlsrv_free_stmt($getResults);
    sqlsrv_close($con);


    }else{
        echo "<h1>NO ENCONTRE DATOS </h1>";
    }

    ?>

    <!DOCTYPE html>
    <html>
    <head>
    <script>
        function showUser(str) {
        if (str == "") {
            document.getElementById("txtHint").innerHTML = "";
            return;
        } else {
            if (window.XMLHttpRequest) {
                // code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp = new XMLHttpRequest();
            } else {
                // code for IE6, IE5
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    document.getElementById("txtHint").innerHTML = this.responseText;
                }
            };
            xmlhttp.open("GET","getuser.php?q="+str,true);
            xmlhttp.send();
        }
        }
    </script>
    </head>

    <body>
      <form>
        <select name="users" onchange="showUser(this.value)">
          <option value="">Select a person:</option>
          <option value="1">Luis</option>
          <option value="2">Nora</option>
          <option value="3">Aron</option>
        </select>
      </form>
      <br>
      <div id="txtHint"><b>Selecciona tu nombre</b></div>
    </body>
    </html>

发生此错误

  

没有视线的东西。数组([0] =>数组([0] => HYT00   [SQLSTATE] => HYT00 [1] => 0 [code] => 0 [2] => [Microsoft] [ODBC   SQL Server驱动程序17]登录超时已过期[消息] =>   [Microsoft] [SQL Server的ODBC驱动程序17]登录超时已过期)[1]   =>数组([0] => 08001 [SQLSTATE] => 08001 [1] => 87 [代码] => 87 [2] => [Microsoft] [SQL Server的ODBC驱动程序17] MAX_PROVS:连接字符串不是有效[87]。[消息] => [Microsoft] [ODBC Driver 17 for   [SQL Server] MAX_PROVS:连接字符串无效[87]。 )[2] =>   数组([0] => 08001 [SQLSTATE] => 08001 [1] => 87 [code] => 87 [2] =>   [Microsoft] [用于SQL Server的ODBC驱动程序17]与网络相关或   建立连接时发生特定于实例的错误   到SQL Server。找不到服务器或无法访问服务器。检查是否   实例名称正确,并且SQL Server是否配置为允许   远程连接。有关更多信息,请参见SQL Server联机丛书。   [消息] => [Microsoft] [SQL Server的ODBC驱动程序17] A   与网络相关或特定于实例的错误发生在   建立与SQL Server的连接。找不到服务器   无障碍。检查实例名称是否正确以及SQL Server是否正确   配置为允许远程连接。有关更多信息,请参见SQL。   服务器联机丛书。 )

conect.php

<?php
$serverName = "192.168.9.10\mssqlserver, 1433"; //serverName\instanceName, portNumber
$connectionInfo = array( "Database"=>"logytel", "UID"=>"sa", "PWD"=>"pass");
$conn = sqlsrv_connect( $serverName, $connectionInfo); var_dump($conn);

if( $conn ) {
     echo "Conexión establecida.<br />";
}else{
     echo "Conexión no se pudo establecer.<br />";
     die( print_r( sqlsrv_errors(), true));
}
?>
  

找不到驱动程序

conect1

<?php
$SqlServer = "192.168.9.10:1433\MSSQLSERVER";

$SqlServerCon = new PDO("odbc:mssql=$SqlServer;Database=logytel", "sa", "pass");

if (!$SqlServerCon) {die('Unable To Connect to Sql Server');}

else
{echo "Connection Successful";} 
?>
  

致命错误:未捕获的PDOException:在以下位置找不到驱动程序   /var/www/html/conexion1.php:4堆栈跟踪:#0   /var/www/html/conexion1.php(4):PDO-> __ construct('odbc:mssql = 192 ....',   'sa','pass')#1 {main}在/var/www/html/conexion1.php中抛出   4

conect2.php

<?php
$SqlServer = "192.168.9.10:1433\MSSQLSERVER";

$DbConnInfo = array( "Database"=>"logytel", "UID"=>"sa", "PWD"=>"pass");

$SqlServerCon = sqlsrv_connect( $SqlServer, $DbConnInfo);

if( $SqlServerCon ) {echo "Connection established";}

else

{echo "Connection could not be established.<br />";

die( print_r( sqlsrv_errors(), true));}
?>
  

无法建立连接。数组([0] =>数组([0] =>   HYT00 [SQLSTATE] => HYT00 [1] => 0 [代码] => 0 [2] => [Microsoft] [ODBC   SQL Server驱动程序17]登录超时已过期[消息] =>   [Microsoft] [SQL Server的ODBC驱动程序17]登录超时已过期)[1]   =>数组([0] => 08001 [SQLSTATE] => 08001 [1] => 87 [代码] => 87 [2] => [Microsoft] [SQL Server的ODBC驱动程序17] MAX_PROVS:连接字符串不是有效[87]。[消息] => [Microsoft] [ODBC Driver 17 for   [SQL Server] MAX_PROVS:连接字符串无效[87]。 )[2] =>   数组([0] => 08001 [SQLSTATE] => 08001 [1] => 87 [code] => 87 [2] =>   [Microsoft] [用于SQL Server的ODBC驱动程序17]与网络相关或   建立连接时发生特定于实例的错误   到SQL Server。找不到服务器或无法访问服务器。检查是否   实例名称正确,并且SQL Server是否配置为允许   远程连接。有关更多信息,请参见SQL Server联机丛书。   [消息] => [Microsoft] [SQL Server的ODBC驱动程序17] A   与网络相关或特定于实例的错误发生在   建立与SQL Server的连接。找不到服务器   无障碍。检查实例名称是否正确以及SQL Server是否正确   配置为允许远程连接。有关更多信息,请参见SQL。   服务器联机丛书。 )

最后一个似乎连接了,但没有显示任何内容。 try.php

<?php
$serverName = "192.168.9.10\mssqlserver, 1433"; //serverName\instanceName, portNumber (por defecto es 1433)
$connectionInfo = array( "Database"=>"logytel", "UID"=>"sa", "PWD"=>"pass");
$conn = sqlsrv_connect( $serverName, $connectionInfo); var_dump($conn);

if( $conn ) {
     echo "Conexión establecida.<br />";
}else{
     echo "Conexión no se pudo establecer.<br />";
     die( print_r( sqlsrv_errors(), true));
}
?>
  

资源类型(SQL Server连接)Conexiónestablecida。

当我使用telnet 192.168.9.10访问时,出现连接被拒绝,但是在SQL Server中端口是开放的,存在防火墙例外,我使用了用户 SA 用于远程连接。

我不知道该怎么办,我需要连接两个服务器。我卸载了所有内容,然后重新安装了所有内容,例如3次,但没有解决问题。我尝试了其他方法来执行此操作,我尝试了FreeTDS,但实际上也不知道如何使用它。除了我之前提到的安装以外,它没有给我安装任何错误。

我没有创建或编辑任何文件吗?我在做什么错了?

0 个答案:

没有答案