没有 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 一些插入被忽略