PHP podłączenie przez PDO do bazy Microsoft SQL Server 2019

0

Cześć,

Podczas podłączenia w PHP za pomocą PDO do bazy danych w Microsoft SQL Server 2019 dostaje taki komunikat:

Błąd: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for NBGD\SQL2019 failed: Nieznany host.

Biblioteki mam pobrane i dodane poprawnie w pliku .ini, z tą bazą już się łączyłem i dodawałem do niej rekordy, tylko połączenie było wykonane w inny sposób wcześniej, jednak czytałem/słyszałem że lepiej to robić poprzez PDO.

Poniżej podaje kod może ktoś zerknie w wolnej chwili i powie coś mądrego lub nakieruje na problem/rozwiązanie.

// konfiguracja połączenia z bazą przy użyciu  PDO
$uzytkownik = '';   //użytkownika i hasło nie podaje loguje sie uprawnieniami Windows do bazy, w innych metodach również tych danych nie podawałem i sie łączyłem do sqla
$haslo = '';
$host = 'NBGD\SQL2019';
$nazwa_bazy = 'dane';

// koniguracja DSN
$dsn = "mysql:host=$host;dbname=$nazwa_bazy";

// nawiązanie połączenia z bazą danych
try {
  $db = new PDO($dsn, $uzytkownik, $haslo); 

// w międzyczasie jakiś INSERT


 // zakończenie połączenia z bazą danych
  $db = NULL;
} catch (PDOException $e) {
  echo "Błąd: ".$e->getMessage();
  exit;
}
5

Dlaczego w dsn masz mysql?
Gdzie jest ta baza posatwiona?

0

Dlaczego w dsn masz mysql?
ODP: Na to pytanie na chwilę obecną nie odpowiem, jest to moje pierwsze podłączenie po PDO i korzystam z kodu z książki, niestety nie ma tam wyjaśnienia zastosowania akurat mysql
Gdzie jest ta baza posatwiona?
Serwer SQL jak i baza jest na moim komputerze, nie ma tutaj połączenia do innego kompa/serwera na innym komputerze, wszystkie uprawnienia sql posiadam.

Wcześniej szukałem już na forum podobnych wątków oraz w innych pomocach, ale nic nie znalazłem dlatego zdecydowałem sie napisać.

3

No dobra to mysql używasz jeśli łączysz się do MYSQL a Ty łączysz się do MSSQL. Tym samym spróbuj wpisać sqlserv. No i jak masz to na locallhost to wpisujesz jako hosta localhost.
Dodane.
https://www.php.net/manual/en/ref.pdo-sqlsrv.connection.php

2

Najlepiej rozbij sobie to na kilka kroków:

  1. Postaw SQL Server czy co tam chcesz
  2. Użyj GUI, sprawdz czy Twój serwer działa, jeśli działa dodaj jakąś baze danych, jakieś tabelki, żebyś miał na czym testować
  3. Popraw kod tak aby działał - tutaj skoro wiesz ze serwer dziala mozesz eksperymentowac tylko z jedna rzecza. BTW Query string jest zły

Masz bardzo fajne przykłady na stronie M$: https://docs.microsoft.com/en-us/sql/connect/php/pdo-query?view=sql-server-ver15

Protip: Jak używasz jakiejś PHPowej funkcji, to dokumentacja PHP jest o tyle dobra, że są w niej komentarze i ludzie pokazują fajne use cases: https://www.php.net/manual/en/ref.pdo-dblib.php

Powyższy link kieruje Cię do strony Microsoftu: https://docs.microsoft.com/en-us/sql/connect/php/microsoft-php-driver-for-sql-server?redirectedfrom=MSDN&view=sql-server-ver15

0

@jurek1980: jak zmieniam na sqlserv to dostaje komunikat: Błąd: could not find driver. Tylko w dokumentacji widzę że należy użyć sqlsrv, jak uzywam sqlsrv to dostaje komunikat Błąd: SQLSTATE[IMSSP]: An invalid keyword 'host' was specified in the DSN string.

Zobaczę dokładnie dokumentacje oraz linki jakie podesłaliście i może na ich podstawie uda się jakoś rozwiązać problem, jak nie to będę się odzywał później, na chwilę obecną dzięki za dotychczasową pomoc. :)

3

Pokaż co dodałeś do php.ini. i opisz wersje PHP i środowisko.

0

@jurek1980:

To mam w sekcji Dynamic Extensions

extension=bz2
extension=curl
extension=php_pdo_sqlsrv_81_ts_x64.dll
extension=php_sqlsrv_81_ts_x64.dll
;extension=ffi
;extension=ftp
extension=fileinfo
extension=gd
extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=ldap
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=oci8_19  ; Use with Oracle Database 19 Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
;extension=shmop

Wersja PHP
screenshot-20220412104212.png

2

Użyłeś rozszerzenia dla TS, nie widzę dokładnie wersji PHP, jaką masz ale na Windows NTS jest zalecany.
Jest ZTS, ominąłem na screenie.
Jak zrobisz w CLI php -m to widzisz załadowane moduły?

0

@jurek1980:

> C:\xampp\php>php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
pdo_sqlsrv
Phar
readline
Reflection
session
SimpleXML
SPL
sqlsrv
standard
tokenizer
xml
xmlreader
xmlwriter
zip
zlib

[Zend Modules]

W paczce ze sterownikami widze że są sterowniki php_pdo_sqlsrv_81_nts_x64.dll z nts ale jak je wrzuciłem to podczas sprawdzania wersji PHP wyrzucało mi jakieś błędy z nimi.
Chyba że oprócz wrzucenia ich do polderu php/ext/ i dodania w pliku .ini wymagane jest zainstalowanie innych sterowników ?

1

Nie zauważyłem na screenie ZTS także sterowniki dobre i zainstalowane skoro listują się w załadowanych modułach.

Wniosek powinno działać. Spróbuj dodać connection string jako całość wpisana ręcznie, pamiętaj o porcie bo może nie zmieniłeś.
Ja zawsze jak łączyłem się to w bazie ustawiałem login i hasło dla logowania SQL a nie przez mechanizmy Windows. W GUI w Menagment Studio włączasz SQL authentication
https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/change-server-authentication-mode?view=sql-server-ver15
Tworzysz nowego użytkownika i hasło dla niego w bazie.

0

Pojedynczy bacslash ?

0

używając innego kodu łącze się z ta samą bazą danych i odpytuje rekordy we wskazanej bazie

<?php
$serverName = "NBGD\SQL2019";
$connectionInfo = array( "Database"=>"demko",
                         "UID"=>"",
                         "PWD"=>"");

$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
    die( print_r( sqlsrv_errors(), true));
}
//Przykładowe zapytanie zwracające zawartość tabeli

$wynik = sqlsrv_query($conn, "SELECT * FROM nazwa");
if($wynik === false) {
    die( print_r( sqlsrv_errors(), true));
}
while( $row = sqlsrv_fetch_array($wynik, SQLSRV_FETCH_ASSOC) ) {
    echo $row['ID'].", ".$row['Imie']."<br />";
}
?>

Dzięki na chwile obecną, będę jeszcze z tym walczył :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1