没有 FreeTDS 的 Ubuntu ODBC

Posted

技术标签:

【中文标题】没有 FreeTDS 的 Ubuntu ODBC【英文标题】:Ubuntu ODBC without FreeTDS 【发布时间】:2018-02-21 13:36:26 【问题描述】:

我想知道是否可以仅使用 Microsoft 站点的 ODBC 驱动程序而不使用 FreeTDS 从 php 访问 MS SQL DB?

    我最初在 Ubuntu 16.04 LTS 上关注此页面,并完成了 Ubuntu 14.04、16.04 和 17.10 的 ODBC 驱动程序 v17 的安装:

https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server

    之后我尝试使用“odbc_connect()”从 PHP 进行连接,但结果如下: 致命错误:未捕获的错误:在 /var/www/html/oop/process.php:20 中找不到类 'odbc_connect' 堆栈跟踪:#0 ...

    在尝试失败后,我又阅读了一些内容,发现有些人坚持使用驱动程序管理器(即使文档说 “驱动程序管理器依赖项会在您安装 Microsoft 时由程序包管理系统自动解决ODBC Driver 13、13.1 或 17 for SQL Server on Linux"),其他人说我缺少 FreeTDS ...

所以现在我对自己做错了什么以及如何继续感到非常困惑,但同时我通常希望避免使用 FreeTDS,因为它似乎是建立在 Microsoft 对 TDS 标准的旧定义之上的,并且限制在某些情况下(我之前已经使用过),但更愿意迁移到“Microsoft ODBC Driver for SQL Server on Linux”。

我有一个带有表单的页面,另一个要“POST”到...但是在第二个称为“process.php”的页面中,我什至无法通过与 DB 部分建立连接,更不用说 CRUD。

第一个文件“form.php”:

<!DOCTYPE html>

<html>
  <head>
    <title>PHP OOP Reg Form</title>
    <style>
      body
        padding: 0;
        margin: 0;
        background: black
      

      #form
        width: 30%;
        height: 400px;
        background: white;
        margin: 0 auto;
        padding: 20px;
        border: 1px solid red;
      

      input
        width: 200px;
        height: 30px;
        margin: 5px;
        display: block;
      

      label
        margin: 5px;
        font-weight: bold;
      

    </style>
  </head>

  <body>
    <div id="form">
      <h2>Registration form:</h2>
      <form method="POST" action="process.php">
        <label>User name:</label>
        <input type="text" name="name" placeholder="Enter your username" required="required"/>

        <label>E-mail:</label>
        <input type="text" name="email" placeholder="Enter your e-mail" required="required"/>

        <label>Password:</label>
        <input type="password" name="pass" placeholder="Enter your password" required="required"/>

        <input type="SUBMIT" name="signup" value="Sign up"/>
      </form>
    </div>

  </body>

</html>

<?php

  include "process.php";

  $db = new db();

?>

第二个文件“process.php”:

<?php

  class db
    public $host = "IP ADDRESS\INSTANCE";
    public $user = "sa";
    public $pass = "sa_pass";
    public $db_name = "some_db";

    public $link;

    public function __construct()
      $this->connect();
    

    private function connect()

      $this->link = new odbc_connect("Driver=SQL Server Native Client 10.0;Server=$this->host;Database=$this->db_name;", $this->user, $this->pass);

    
  



?>

【问题讨论】:

恕我直言,这应该在ServerFault 或Database Administrators 上询问,它与PHP 无关。此外,您不应向我们征求意见,而应展示您的所作所为并尝试为您的问题找到答案 @Cemal - 是的,我很抱歉错过了源代码......我已按照建议将代码添加到上面的问题中。感谢您的宝贵时间。 你不需要 odbc 从 php 访问 ms sql 数据库。你也可以使用 pdo 这里有一个 MS article 和 a google search 给你 不,PDO 是一个依赖于驱动程序文件的 php 通用库,PDO_DBLIB 是使用FreeTDS 的驱动程序文件之一。您定义要在 PDO 中的连接 dsn 上使用的驱动程序。 PDO 提供了一组相同(大部分)的功能,与底层 dbms 驱动程序文件无关。 【参考方案1】:

通过使用这些脚本中的任何一个来解决(感谢 Cemal 为我指明了正确的方向):

脚本 1:

// Specify the server and connection string attributes
$serverName = "SERV_IP_ADR\INSTANCE, PORT_NO";

// Get UID and PWD from application-specific files.
$uid = "sa";
$pwd = "sa_pass";
$connectionInfo = array( "UID"=>$uid,
                         "PWD"=>$pwd,
                         "Database"=>"DB_name");

// Connect using SQL Server Authentication.
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )

     echo "Unable to connect.</br>";
     die( print_r( sqlsrv_errors(), true));

脚本 2:

$serverName = "SERVER_IP_ADDRESS\INSTANCE, PORT";

/* Connect using SQL Server Authentication. */
try

$conn = new PDO( "sqlsrv:server=$serverName ; Database=DB_name", "sa", "sa_pass");
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

catch(Exception $e)

die( print_r( $e->getMessage() ) );

【讨论】:

以上是关于没有 FreeTDS 的 Ubuntu ODBC的主要内容,如果未能解决你的问题,请参考以下文章

Perl/DBI/FreeTDS/SQLAzure 一些插入被忽略

无法使用 FreeTDS 配置连接到 Azure SQL 实例

freeTDS 不使用其配置

在 Ubuntu 上从 PHP 连接到 SQL Azure

Linux下PHP freetds连接MSSQL 乱码

如何使用 unixodbc 和 freetds 在 Mac 上安装 RODBC?