Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne]Problem ze sterownikiem mssql do PHP 2.5.10
Forum PHP.pl > Forum > Przedszkole
PROGer
Witam serdecznie

Sterowniki do PHP w wersji 2.5.10 ściągnałem z tej oto strony:
https://www.microsoft.com/en-us/download/de...s.aspx?id=20098
wybrałem wersje 2.0 dla powyższej wersji PHP.
Po rozpakowaniu paczki sterowników, przegrałem je do katalogu PHP\ext a do pliku php.ini dodałem odpowiednie deklaracje tych plików (dodałem wszystkie)
Po restarcie IIS`a 7.0 (win 2008 serv) i odpaleniu php.info nie widze sterownika mssql którego potrzebuję:

Wpadłem więc na pomysl wrzucenia tych bibliotek bezposrednio do system32 katalogu Windowsa, aby ładowac je przy starcie systemu. Tak też zrobiłem i zrestartowałem serwer. Bez zmian, nadal brak sterownika mssql.

Pytanie dlaczego? Jest jakiś inny sposób aby go załadować?
mls
Ale przecież widać, że sterownik do pdo jest załadowany - sqlsrv.

Wystarczy czytać ze zrozumieniem:
Cytat
The SQLSRV extension provides a procedural interface while the PDO_SQLSRV extension implements PDO for accessing data in all editions of SQL Server 2005 and later (versions 3.2 and 3.1 require SQL Server 2008 and later).
PROGer
Przepraszam, wprowadziłem Was troche w błąd.
Połączenie PDO z baza MSSQL mam i działa dobrze po podpięciu plików z paczki 2.0 z tym, że ja potrzebuję dodatkowo sterownika mssql.dll do obsługi zapytan do bazy w aplikacji.

Wgrałem taką bibliotekę do katalogu ext i win32. Na Windows server 2003 (SQL server 2005) widać ją poprawnie, ale już na 2008 nie.
Moge prosić o namiar takiej mssql.dll pod SQL 2008?
mls
Skoro połączenie z bazą jest i sterownik działa poprawnie, należy zmienić konfigurację połączenia z bazą w aplikacji a nie szukać innego sterownika.
Zend obsługuje również sqlsrv - http://framework.zend.com/apidoc/2.0/names...ver.Sqlsrv.html
PROGer
Wersja Zend 1.0.1 z 2005r. również? Aplikacja była pisana tak a nie inaczej. Wiem że z mssql.dll działa poprawnie. Problem z tym że musze ją zmigrować na win serv 2008 wraz z baza MSSQL 2008.
mls
Jeśli w wersji 1.0.1 nie obsługuje, nie widzę problemu, aby to samemu dodać. Wystarczy poszukać wywołania konstruktora PDO który ma DSN z "mssql" i zamienić na właściwy dla "sqlsrv".
PROGer
Nie czuję się az tak dobry w tym momencie abym mógl dokonac takich zmian samemu co_jest.gif
widze tu plik ZEND\DB\Adapter\Pdo\Mssql.php: a tam klasę: class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract ale już widze że nie dam rady tego zmienic:

  1. <?php
  2.  
  3.  
  4.  
  5. require_once 'Zend/Db/Adapter/Pdo/Abstract.php';
  6.  
  7. require_once 'Zend/Db/Adapter/Exception.php';
  8.  
  9. class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract
  10. {
  11. /**
  12.   * PDO type.
  13.   *
  14.   * @var string
  15.   */
  16. protected $_pdoType = 'mssql';
  17.  
  18. protected $_numericDataTypes = array(
  19. Zend_Db::INT_TYPE => Zend_Db::INT_TYPE,
  20. Zend_Db::BIGINT_TYPE => Zend_Db::BIGINT_TYPE,
  21. Zend_Db::FLOAT_TYPE => Zend_Db::FLOAT_TYPE,
  22. 'INT' => Zend_Db::INT_TYPE,
  23. 'SMALLINT' => Zend_Db::INT_TYPE,
  24. 'TINYINT' => Zend_Db::INT_TYPE,
  25. 'BIGINT' => Zend_Db::BIGINT_TYPE,
  26. 'DECIMAL' => Zend_Db::FLOAT_TYPE,
  27. 'FLOAT' => Zend_Db::FLOAT_TYPE,
  28. 'MONEY' => Zend_Db::FLOAT_TYPE,
  29. 'NUMERIC' => Zend_Db::FLOAT_TYPE,
  30. 'REAL' => Zend_Db::FLOAT_TYPE,
  31. 'SMALLMONEY' => Zend_Db::FLOAT_TYPE
  32. );
  33.  
  34.  
  35. protected function _dsn()
  36. {
  37. // baseline of DSN parts
  38. $dsn = $this->_config;
  39.  
  40. // don't pass the username and password in the DSN
  41. unset($dsn['username']);
  42. unset($dsn['password']);
  43. unset($dsn['driver_options']);
  44.  
  45. if (isset($dsn['port'])) {
  46. $dsn['host'] .= ',' . $port;
  47. unset($dsn['port']);
  48. }
  49.  
  50. // this driver supports multiple DSN prefixes
  51. if (isset($dsn['pdoType'])) {
  52. switch (strtolower($dsn['pdoType'])) {
  53. case 'freetds':
  54. case 'sybase':
  55. $this->_pdoType = 'sybase';
  56. break;
  57. case 'mssql':
  58. $this->_pdoType = 'mssql';
  59. break;
  60. case 'dblib':
  61. default:
  62. $this->_pdoType = 'dblib';
  63. break;
  64. }
  65. unset($dsn['pdoType']);
  66. }
  67.  
  68. // use all remaining parts in the DSN
  69. foreach ($dsn as $key => $val) {
  70. $dsn[$key] = "$key=$val";
  71. }
  72.  
  73. $dsn = $this->_pdoType . ':' . implode(';', $dsn);
  74. return $dsn;
  75. }
  76.  
  77. protected function _connect()
  78. {
  79. if ($this->_connection) {
  80. return;
  81. }
  82. parent::_connect();
  83. $this->_connection->exec('SET QUOTED_IDENTIFIER ON');
  84. }
  85.  
  86.  
  87. public function listTables()
  88. {
  89. $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
  90. return $this->fetchCol($sql);
  91. }
  92.  
  93. public function describeTable($tableName, $schemaName = null)
  94. {
  95. /**
  96.   * Discover metadata information about this table.
  97.   */
  98. $sql = "exec sp_columns @table_name = " . $this->quoteIdentifier($tableName, true);
  99. $stmt = $this->query($sql);
  100. $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
  101.  
  102. $table_name = 2;
  103. $column_name = 3;
  104. $type_name = 5;
  105. $precision = 6;
  106. $length = 7;
  107. $scale = 8;
  108. $nullable = 10;
  109. $column_def = 12;
  110. $column_position = 16;
  111.  
  112. $sql = "exec sp_pkeys @table_name = " . $this->quoteIdentifier($tableName, true);
  113. $stmt = $this->query($sql);
  114. $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_NUM);
  115. $pkey_column_name = 3;
  116. $pkey_key_seq = 4;
  117. foreach ($primaryKeysResult as $pkeysRow) {
  118. $primaryKeyColumn[$pkeysRow[$pkey_column_name]] = $pkeysRow[$pkey_key_seq];
  119. }
  120.  
  121. $desc = array();
  122. $p = 1;
  123. foreach ($result as $key => $row) {
  124. $identity = false;
  125. $words = explode(' ', $row[$type_name], 2);
  126. if (isset($words[0])) {
  127. $type = $words[0];
  128. if (isset($words[1])) {
  129. $identity = (bool) preg_match('/identity/', $words[1]);
  130. }
  131. }
  132.  
  133. $isPrimary = array_key_exists($row[$column_name], $primaryKeyColumn);
  134. if ($isPrimary) {
  135. $primaryPosition = $primaryKeyColumn[$row[$column_name]];
  136. } else {
  137. $primaryPosition = null;
  138. }
  139.  
  140. $desc[$this->foldCase($row[$column_name])] = array(
  141. 'SCHEMA_NAME' => null, // @todo
  142. 'TABLE_NAME' => $this->foldCase($row[$table_name]),
  143. 'COLUMN_NAME' => $this->foldCase($row[$column_name]),
  144. 'COLUMN_POSITION' => (int) $row[$column_position],
  145. 'DATA_TYPE' => $type,
  146. 'DEFAULT' => $row[$column_def],
  147. 'NULLABLE' => (bool) $row[$nullable],
  148. 'LENGTH' => $row[$length],
  149. 'SCALE' => $row[$scale],
  150. 'PRECISION' => $row[$precision],
  151. 'UNSIGNED' => null, // @todo
  152. 'PRIMARY' => $isPrimary,
  153. 'PRIMARY_POSITION' => $primaryPosition,
  154. 'IDENTITY' => $identity
  155. );
  156. }
  157. return $desc;
  158. }
  159.  
  160. public function limit($sql, $count, $offset = 0)
  161. {
  162. $count = intval($count);
  163. if ($count <= 0) {
  164. throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");
  165. }
  166.  
  167. $offset = intval($offset);
  168. if ($offset < 0) {
  169. throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");
  170. }
  171.  
  172. $orderby = stristr($sql, 'ORDER BY');
  173. if ($orderby !== false) {
  174. $sort = (stripos($orderby, 'desc') !== false) ? 'desc' : 'asc';
  175. $order = str_ireplace('ORDER BY', '', $orderby);
  176. $order = trim(preg_replace('/ASC|DESC/i', '', $order));
  177. }
  178.  
  179. $sql = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($count+$offset) . ' ', $sql);
  180.  
  181. $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl';
  182. if ($orderby !== false) {
  183. $sql .= ' ORDER BY ' . $order . ' ';
  184. $sql .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC';
  185. }
  186. $sql .= ') AS outer_tbl';
  187. if ($orderby !== false) {
  188. $sql .= ' ORDER BY ' . $order . ' ' . $sort;
  189. }
  190.  
  191. return $sql;
  192. }
  193.  
  194.  
  195. public function lastInsertId($tableName = null, $primaryKey = null)
  196. {
  197. $sql = 'SELECT SCOPE_IDENTITY()';
  198. return (int)$this->fetchOne($sql);
  199. }
  200.  
  201. }




Może ktoś mi to wytłumaczy:
Dlaczego jest tak że z bazą MSSQL mam połączenie a łącze się następująco:
  1. [main_config]
  2. db.adapter = PDO_MSSQL
  3. db.config.host = WIN2008
  4. db.config.username = User1
  5. db.config.password = Password11
  6. db.config.dbname = bdname
  7. controllers.default = ./application/controllers
  8. controllers.somecontroller = ./application/modules/somename/controllers
  9.  
  10. [db_somename]
  11. db.adapter = PDO_MSSQL
  12. db.config.host = WIN2008
  13. db.config.username = User1
  14. db.config.password = Password11
  15. db.config.dbname = dbname


Natomiast jak odpalę aplikację to mam taki oto komunikat:

"The mssql driver is not currently installed"


Dobrze rozumiem że steronik działa poprawnie podczas połączenia z baza, a błednie podczas wykonywania zapytań do niej? Czy też do samego połączenia wykorzystywany jest inny sterownik?

PS: w pierwszym moim poście wkradł się błąd. Chodzi o wersję PHP 5.2.10.

EDIT:

Rozwiązałem problem, to co zrobiłem to odinstalowałem PHP 5.2.10, aby sprawdzić czy sytuacja zmieni się na PHP 5.2.6. <-- nie udało mi się uruchomić tej wersji PHP. Ponownie zainstalowałem PHP w wersji 5.2.10 i sterownik był już widoczny. Czary mary ... nie wiem dlaczego. Jest też inna opcja którą można spróbować jeśli komuś przytrafi się podobny problem. Chodzi o REJESTRACJĘ biblioteki w systemie Widnows przy pomocy polecenia regsvr. Więcej informacji tutaj.

Pozdrawiam serdecznie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.