XAMPP > 1.7.4 / PHP VC9 - php_mssql.dll Class Mapper

Irgendwelche Probleme mit XAMPP für Windows? Dann ist hier genau der richtige Ort um nachzufragen.

XAMPP > 1.7.4 / PHP VC9 - php_mssql.dll Class Mapper

Postby marthom » 20. April 2012 01:19

Wer bisher mit Xampp 1.7.4 auf einen MS SQL Server zugegriffen hat, benutzte einfach Extension php_mssql.dll.
Seit PHP mit VC9 compiliert wird (XAMPP > 1.7.4), wird diese Extension nicht mehr unterstützt.

Goggelt man z.B. nach "php_mssql.dll php 5.3.8" findet man hunderte Einträge und den Verweis auf den neuen Treiber von MS

Microsoft Drivers 2.0/3.0 for SQL Server for PHP
http://www.microsoft.com/download/en/details.aspx?id=20098
Enthalten ist die Extension php_sqlsrv_53_ts.dll. Diese ist statt der php_mssql.dll in der php.ini einzubinden

Zusammen mit einem passenden "SQL Server 20xx Native Client" bekommt man wieder Zugriff auf den MS SQL-Server.

Aber...
Man muss auch die dazugehörigen Funktionen nutzen!
Siehe http://de.php.net/manual/en/book.sqlsrv.php

Hat man ein bestehendes Projekt, dann ist das eine ganze Menge Arbeit.
Um sich diese Arbeit zu sparen habe ich mir ein paar Funktionen geschrieben und in eine include-Datei gepackt.
Bindet man diese in sein Projekt ein, stehen einem die wichtigsten mssql-Funktionen wieder zur Verfügung - eine Art Simulator / Class Mapper.

Ich konnte damit fast alle meine Projekte innerhalb von wenigen Minuten auf die neuen sqlsrv-Funktionen umstellen.
Zum Testen taugt das allemal. Xampp ist ja ausdrücklich NICHT für den Produktiveinsatz gedacht und genauso sehe ich das Script!

Ist sicherlich kein Meisterwerk.
Aber wers gebrauchen kann?!

In den Kommentaren ist auch Code für eine Beispielanwendung vorhanden.

Code: Select all
<?php
#################################
# php_mssql.dll Class Mapper       #
#                               #
# Version 0.1 BETA - 2012-04-20 #
# marthom@dreambox-tools.info   #
#                               #
# tested under:                 #
# XAMPP 1.7.7 - PHP 5.3.8       #
#                               #
#################################
# FOR USE AT YOUR OWN RISK !!!  #
#################################

/*
File - inc_config.php:
<?php
   # define global access vars
   $sql_db_server = "SQLSERVER-NAME OR IP";
   $sql_db_user = "SQL-USER";
   $sql_db_pass = "SQL-PASSWORD";

   require_once "inc_sqlsrv_mssql.php";
   
   if (!$con = mssql_connect($sql_db_server, $sql_db_user, $sql_db_pass)) {
      die(mssql_get_last_message());
   }
?>

File - testmssql.php:
<?php
   require_once "inc_config.php";
   
   echo "<br><br>Server:<br>";

   $server_info = sqlsrv_server_info($con);
   
   if ($server_info) {
      foreach ($server_info as $key => $value) {
         echo $key . ": " . $value . "<br />";
      }
   } else {
      die(print_r(sqlsrv_errors(), true));
   }

   # =================================
   echo "<br><br>Client:<br>";

   if ($client_info = sqlsrv_client_info($con)) {
      foreach ($client_info as $key => $value) {
         echo $key.": ".$value."<br />";
      }
   } else {
      echo "Error in retrieving client info.<br />";
   }
   
   echo "<br><br>SELECT:<br>";

   $sql = "SELECT * FROM [faq].[dbo].[Cron] ";
   $rs = mssql_query($sql, $con);
   
   echo "Count rows: " . mssql_num_rows($rs);
   echo "<br>";

   echo "Count Fields: " . mssql_num_fields($rs);
   echo "<br>";

   for ($i = 0; $i < mssql_num_fields($rs); ++$i) {
      echo ' - ' . mssql_field_name($rs, $i) . "<br>";
   }
   
   echo "<br>";

   while ($row = mssql_fetch_array($rs)) {
      foreach ($row as $field) {
         echo $field;
         echo "<br>";
      }
   }
?>

*/

if (!extension_loaded('mssql')) {
   
   function mssql_connect($server, $user = "", $pw = "") {
      $conInfoAry = array("UID"=>$user, "PWD"=>$pw);
      return sqlsrv_connect($server, $conInfoAry);
   }
   
   function mssql_pconnect($server_name, $dbuser, $dbpass) {
      return mssql_connect($server_name, $dbuser, $dbpass);
   }
   
   function mssql_select_db($databasename, $con) {
      # use global access vars (from inc_config.php)
      global $sql_db_server, $sql_db_user, $sql_db_pass;
      $conectionInfo = array("UID"=>$sql_db_user, "PWD"=>$sql_db_pass, "Database"=>$databasename);

      $con = sqlsrv_connect($sql_db_server, $conectionInfo);
      if ($con === false) {
         mssql_get_last_message();
      }
   }
   
   function mssql_query($sql, $con) {
      $query_params = array();
      $query_options =  array("Scrollable" => SQLSRV_CURSOR_KEYSET);

      return sqlsrv_query($con, $sql, $query_params, $query_options);      
   }

   function mssql_fetch_object($rs) {
      return _ArrayToObject(sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC));
   }
   
   function mssql_fetch_array($rs) {
      return sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC);
   }

   function mssql_fetch_assoc($rs) {
      return mssql_fetch_array($rs);
   }

   function mssql_fetch_row($rs) {
      return sqlsrv_fetch_object($rs);
   }

   function mssql_close($con) {
      return sqlsrv_close($con);
   }

   function mssql_num_rows($rs) {
      return sqlsrv_num_rows($rs);
   }

   function mssql_rows_affected($rs) {
      return sqlsrv_rows_affected($rs);
   }

   function mssql_num_fields($rs) {
      return sqlsrv_num_fields($rs);
   }

   function mssql_next_result($rs) {
      return sqlsrv_next_result($rs);
   }

   function mssql_field_name($rs, $index) {
      $aryfieldMetadata = sqlsrv_field_metadata($rs);
      $fieldMetadata = $aryfieldMetadata[$index];
      return $fieldMetadata["Name"];
   }

   function mssql_fetch_field($rs, $index) {
               $aryfieldMetadata = sqlsrv_field_metadata($rs);
               $fieldMetadata = $aryfieldMetadata[$index];
               return _ArrayToObject($fieldMetadata);
   }

   function mssql_get_last_message() {
      if( ($errors = sqlsrv_errors()) != null) {
         /*
         foreach($errors as $error) {
            echo "SQLSTATE: " . $error["SQLSTATE"];
            echo "<br>";
            echo "code: " . $error["code"];
            echo "<br>";
            echo "message: " . $error["message"];
            echo "<br>";
            echo "<br>";
         }
         */
         $msg = "=== SQL-ERROR ===";
         $msg .= "<br>";
         $msg .= "SQLSTATE: " . $errors[0]["SQLSTATE"];
         $msg .= "<br>";
         $msg .= "Code: " . $errors[0]["code"];
         $msg .= "<br>";
         $msg .= "Message: " . $errors[0]["message"];
         $msg .= "<br>";
         $msg .= "<br>";
         
         return $msg;
      }         
   }
      
   function _ArrayToObject($array) {
      $object = new stdClass();
      if (is_array($array) && count($array) > 0) {
         foreach ($array as $name=>$value) {
            $name = strtolower(trim($name));
            if (!empty($name)) {
               $object->$name = $value;
            }
         }
      }
      if (empty($array)) {return $array;}
      return $object;
   }

   function _ObjectToArray($object) {
      $array = array();
      if (is_object($object)) {
         $array = get_object_vars($object);
      }
      return $array;
   }
}
?>


Last edited by marthom on 24. April 2012 10:12, edited 3 times in total.
marthom
 
Posts: 4
Joined: 12. April 2012 23:22
XAMPP Version: 5.6.3
Operating System: Windows Server 2003 x86

Re: XAMPP > 1.7.4 / PHP VC9 - php_mssql.dll Ersatz

Postby Altrea » 20. April 2012 02:16

Hallo marthom,

Vielen Dank für deinen sehr hilfreichen Post. Ich habe ihn mal direkt im Beitrag WICHTIG: XAMPP 1.7.7 Probleme und Lösungen verlinkt.
Dein Simulator hat zwar mehr von einem MSSQL Class Mapper, aber die Bezeichnung hat ja keinen Einfluß auf die Funktionalität :)

mit freundlichen Grüßen,
Altrea
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6670
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: XAMPP > 1.7.4 / PHP VC9 - php_mssql.dll Ersatz

Postby marthom » 20. April 2012 09:27

Dein Simulator hat zwar mehr von einem MSSQL Class Mapper, aber die Bezeichnung hat ja keinen Einfluß auf die Funktionalität


Da hast Du sicher Recht. Aber für mich simuliert er die "alten" mssql-Funktionen und deshalb der Zusatz Simulator :wink:
marthom
 
Posts: 4
Joined: 12. April 2012 23:22
XAMPP Version: 5.6.3
Operating System: Windows Server 2003 x86

Re: XAMPP > 1.7.4 / PHP VC9 - php_mssql.dll Class Mapper

Postby marthom » 24. April 2012 10:13

Script erweitert:
Code: Select all
   function mssql_fetch_field($rs, $index) {
               $aryfieldMetadata = sqlsrv_field_metadata($rs);
               $fieldMetadata = $aryfieldMetadata[$index];
               return _ArrayToObject($fieldMetadata);
   }
marthom
 
Posts: 4
Joined: 12. April 2012 23:22
XAMPP Version: 5.6.3
Operating System: Windows Server 2003 x86


Return to XAMPP für Windows

Who is online

Users browsing this forum: No registered users and 11 guests