PDO sqlsrv:找不到驱动程序

时间:2017-04-19 08:15:48

标签: php sql-server sql-server-2008 pdo

我尝试用PHP连接到SQL Server。在我的本地机器上使用XAMPP,一切运行良好。但现在我要将我的应用程序带到生产服务器上。

在此服务器上安装了Microsoft IIS 6.1并运行PHP版本7.0.7。我还从here安装了ODBC驱动程序。接下来,我将php.ini文件中的以下行取消注释:

extension=php_sqlsrv_7_nts.dll
extension=php_pdo_sqlsrv_7_nts.dll

我从official microsoft site获得了文件。

我的问题是什么?

不幸的是,在我重新启动IIS之后。 PDO函数抛出PDOException错误,并显示以下消息:

could not find driver

对于连接我正在使用以下功能,该功能在我的本地机器上运行良好:

try {
    $con = new PDO("sqlsrv:Server=" . SERVER . ";Database=" . DATABASE, USERNAME, PASSWORD);
    // set the PDO error mode to exception
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "No connection: " . $e->getMessage();
    exit;
}

我还能做什么?

3 个答案:

答案 0 :(得分:3)

在Windows Server上找到错误日志后,我自己解决了错误。

我的日志中出现此错误:

[21-Apr-2017 07:12:14 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library '...\ext\php_pdo_sqlsrv_7_nts.dll' - %1 is not a valid Win32 application. in Unknown on line 0

然后我再次下载了driver并安装了x64-Driver。最后它没有任何问题。

答案 1 :(得分:0)

我花了一些时间解决“无人驾驶”错误。我经历了这里提到的一些步骤,发现了一些新的错误后对我有帮助的步骤。供将来参考:

  • Microsoft下载最新的驱动程序(如Julian Schmuckli所说)。
  • 使用Phpinfo()检查XAMPP是否为64位(!)。如果您使用的是32位,则需要其他驱动程序。
  • 将驱动程序添加到Php.ini文件中,并将dll的文件保存在php / ext-folder中(saber tabatabaee yazdi的问题)。
  • 对于连接,请使用以下代码:
$dbh = new PDO ("sqlsrv:Server=$server;Database=$dbname",$username,$pw); 



如果添加端口,请使用:

$server = "192.168.1.15, 51022";

其中IP(可以是主机名)是您的服务器,而51022是您的端口。

答案 2 :(得分:0)

如果对某人有帮助,这里是详细的过程。 package utility; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; import java.util.Iterator; import java.util.Locale; public class OpenJDK11DateDisaster { public static void main(String args[]) { /* * Example of the date string that works with Java 8 but fails to * parse in OpenJDK 11. * * Note: The Locale is identical between the two versions (US, English) * */ /* Java 8 Output... Java Version = 1.8.0_265 Broken Date = September 1, 2015 3:13:29 AM MDT Convert mills to a date. From mills date = September 1, 2015 3:13:29 AM MDT Broken Date = September 1, 2015 3:13:29 AM MDT Attempting to parse broken date. Date in mills = 1441098809000 From mills date = September 1, 2015 3:13:29 AM MDT Java 11 output... Java Version = 11.0.8 Broken Date = September 1, 2015 3:13:29 AM MDT Convert mills to a date. From mills date = September 1, 2015 at 3:13:29 AM MDT Broken Date = September 1, 2015 3:13:29 AM MDT Attempting to parse broken date. java.text.ParseException: Unparseable date: "September 1, 2015 3:13:29 AM MDT" Unable to parse broken date. Adding in the at... at java.base/java.text.DateFormat.parse(DateFormat.java:395) at utility.OpenJDK11DateDisaster.main(OpenJDK11DateDisaster.java:60) Fixed date = September 1, 2015 at 3:13:29 AM MDT java.text.ParseException: Unparseable date: " September 1, 2015 at 3:13:29 AM MDT" at java.base/java.text.DateFormat.parse(DateFormat.java:395) at utility.OpenJDK11DateDisaster.main(OpenJDK11DateDisaster.java:89) Unable to parse fixed date. */ System.out.println("Java Version = " + System.getProperty("java.version")); // This is the date that will parse in Java 7 but fails in Java 11 String BrokenDate = "September 1, 2015 3:13:29 AM MDT"; System.out.println("Broken Date = " + BrokenDate); // Broken date converted to mills in Java 7. long mills = 1441098809000L; System.out.println("Convert mills to a date."); DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US); Date millDate = new Date(mills); System.out.println("From mills date = " + df2.format(millDate)); System.out.println("Broken Date = " + BrokenDate); /* * Parse these old dates. */ System.out.println("Attempting to parse broken date."); df2 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.US); Date date = null; try { date = df2.parse(BrokenDate) ; } catch (ParseException e) { e.printStackTrace(); System.out.println(); System.out.println("Unable to parse broken date."); // For some reason, they now put an "at" word between the date and the time. // Here we put the "at" back in and see. // See if we can fix it. System.out.println("Adding in the at..."); StringList fields = Acl.split(BrokenDate, ' '); String FixedDate = ""; Iterator iter = fields.iterator(); int count = 0; while (iter.hasNext() ) { String field = (String)iter.next(); count++; FixedDate += " " + field; if (count == 3) { // add an at FixedDate += " at"; } } System.out.println("Fixed date = " + FixedDate); // Now see if it will parse try { date = df2.parse(FixedDate); } catch (ParseException e2) { e2.printStackTrace(); System.out.println(); System.out.println("Unable to parse fixed date."); System.exit(-1); } System.out.println("Was able to parse Fixed Date " + date); } mills = date.getTime(); // From the BrokenDate // Should be -62112243600000 as computed on a Java 7 machine System.out.println("Date in mills = " + mills); // Convert the mills to a date. millDate = new Date(mills); System.out.println("From mills date = " + df2.format(millDate)); } }

  1. 从此链接-https://docs.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver15

    下载并提取PHP Version - 7.4文件
  2. 将文件粘贴到.dll中,您的路径可能会不同。

  3. C:\xampp\php\ext
  4. 在底部或扩展部分中添加这两行。

    php.ini
  5. 重新启动Xampp服务器,我建议重新启动计算机,然后一切都会正常运行。

检查是否启用了SqlSRV

使用 extension=php_sqlsrv_74_ts_x64.dll extension=php_pdo_sqlsrv_74_ts_x64.dll 或http://localhost/dashboard/phpinfo.php像这样检查-

SQLSrv Driver Check in PHP Info

希望,它将对某人有所帮助。