PDO, csatlakozás MsSQL szerverhez, Linux & Win
2015-12-06T14:07:56+01:00
2015-12-13T20:46:06+01:00
2022-07-19T04:11:48+02:00
  • Nos sikerült megoldást találni.
    Mind a Freetds, és a Ms ODBC for Linux hibásan működik. Preparációt, és a tárolt eljárás hívásokat kb ellehet felejteni. Szimpla lekérdezésként, viszont lehet őket használni.

    Freetds esetén gyárilag nem tudja a tárolt eljárások output paraméterét kiolvasni. (asszem sql server 2005 fölött)
    Paraméter bindig közben pedig rengetegszer van konverziós hiba. (itt a Cast -olások segíthetnek) Illetve párszor előfordult hogy az Apache 500-as hibát dobot. Konkrét hiba üzenet nélkül.

    Ms ODBC for linux. Tud output paraméter kezelni, sőt, csak azt tud. UTF <-> ISO karakter kódolás miatt nem tudja meghatározni hogy a beküldött paraméter milyen hosszú is. Ezért ezt bindig esetén meg kell adni. Megköveteli hogy minden paramétert Input és Output paraméterként adjuk át. (tárolt eljárásnál is szerkeszteni kell a paramétereket) így is nagyon sokszor "right truncate" hibával elszállt. 

    Végezetül maradtam az ms ODBC-nél. szimpla lekérdezés esetén ez tűnt stabilabbnak, mert a freetds gyakran nyafogott lezáratlan curzor miatt. (ezt még PDO Close curzor, segítségével lehet orvosolni). Tárolt eljárások vissza térési értékét meg úgy oldottam meg, hogy minden tárolt eljárás végén van egy SELECT ami ezeket a paramétereket tartalmazza. Így meghívás után az eredmény objektumon elég egy FetchAll-t hívnom. és megvannak az eredmények. 

    Össze foglalva, aki teheti ne akarjon PHP-val Unix alol MsSQL-hez csatlakozni. (Vagy vegye meg az easysoft driverét)
    Mutasd a teljes hozzászólást!
  • +1 a webservice-re!
    Mutasd a teljes hozzászólást!
  • Kedves strasszer,

    Igen ha berakok a Linux és a MsSQL közé egy Windows szervert megoldódik a problémám. Mivel Windows alatt az SQLsrv tökéletesen működik! Végső esetben ez is lesz a megoldás, így a webszerver, (linux) csak a windows szerver távoli eljárásait hívogatja.
    Mutasd a teljes hozzászólást!
  • Kedves csörnyeföldi!

    Igen, az EasySoft driverét már nézegettem én is. Csak a vezetőségnek kellene beadagolni az évi 1.200€ -t. 

    Zend -et meg áttnézem, hogy járható út e.
    Mutasd a teljes hozzászólást!
  • Én irnék hozzá egy webservice felületet asmx-ben, és azt hivnám win és linux környezetből. Vagy WCF-et. Persze csak akkor lehet ez megoldás, ha technikailag meg van rá a lehetőség. Ugye kell egy win server, amin fut IIS, ezt el kell tudnia érni az összes kliensnek. Ez belső hálózaton nyilván nem lehet probléma...
    Mutasd a teljes hozzászólást!
  • Szívtam én is vele.

    Egyszer  a Zend - Products - Server Ce -t hívtam segítségül.

    deb Index of /zend-server/deb server non-free

    S ha jól emlékszem, akkor a debian által felrakott összes php komponenst lecserélte a saját repobelire. De azt tudom, hogy működött.

    Valamint egyszer meg ez (Accessing Microsoft SQL Server (mssql) from PHP under Apache on UNIX or Linux) alapján kalapáltam össze.
    Mutasd a teljes hozzászólást!
  • Nem biztos hogy értem a problémát, de
    PHP: PDOStatement::bindParam - Manual

    $sth->bindParam(1, $colour, 12);
    Tehát egy "sima" selectet szeretnél.

    "Length of the data type. To indicate that a parameter is an OUT parameter from a stored procedure, you must explicitly set the length."
    Nem csak akkor kell odaírna 4. paramétert, amikor sp-t hívsz?! Tudom az ottani példa ennek ellent mond.
    Tehát: $sth->bindParam(1, $colour);
    Mutasd a teljes hozzászólást!
  • Én is találtam egyet
    InstallingMicrosoftDriverOnDebianLinux - odbc - Installing the Microsoft ODBC Driver 11 for SQL Serv

    Jah bocsi, szóval ezeket már megcsináltátok..
    Mutasd a teljes hozzászólást!
  • Bár nem én hanem a rendszergazda, de ezen leírás alapján (debiánra)
    blog.afoolishmanifesto.com/posts/install-and-configure-the-ms-odbc-driver-on-debian
    Sikerült felerőltetnie. (Megj. szét Smylink-elte az ágyat) 

    De sajnos ez sem tökéletes.. Sőőt!
    Known Issues in this Version of the Driver
    The ColumnSize parameter bekezdésben le is írják hogy bugos. csak nekem nem volt teljesen egyértelmű hogy ekkora bug van benne. 

    Vagyis, a driver nem tudja megmondani hogy milyen hosszú az átadott paraméter, ezért ezt kézzel kell megadni.

    $sth->bindParam(1, $colour, PDO::PARAM_STR, 12);
    De amikor én megadtam a hosszt, akkor valamiért, a bemenő paramétert, kimenő paraméternek is veszi, Tárolt eljárásnál még oda lehet biggyeszteni hogy OUTPUT, de egy lekérdezésben, amiben mondjuk van WHERE x = :param Már nem lehet megcsinálni. 

    De azért írok 1-2 hiba üzenetet :)

    [Microsoft][SQL Server Native Client 11.0]String data, right truncation <- Hossz nélkül adtam át paramétert [Microsoft][SQL Server Native Client 11.0][SQL Server]The formal parameter "@view" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output. <-Adtam át paraméter hossz információd, de nem nyúltam a tárolt eljáráshoz
    De, megnyugtató hogy nem csak én szívok ezzel :)
    Mutasd a teljes hozzászólást!
  • Nem, szerintem nincs jelentősége.
    Én most egy másik módszerrel próbálkozok:
    Welcome to the Microsoft ODBC Driver 11 for SQL Server on Linux
    de mivel csak RedHat-re meg SUSE-ra van nekem meg archom van és a sqlcmd nem találja libopenssl.so.6 -ot; hát nem nagyon működik még. Az sem segített hogy létrehoztam  az én libopenssl.so ról egy linket libopenssl.so.6 néven. sigsegvvel elszállt...érdekes mód már a libc-nél amit viszont egyből megtalált:D
    Mutasd a teljes hozzászólást!
  • Igen, bár én  a csatlakozáskor, DSN-ben küldöm el hogy a 7.3 -mas protokollt használja. Vajon van bármi jelentősége, hogy configban, vagy DSN-be állítom be?
    Mutasd a teljes hozzászólást!
  • Párszor próbáltam kíváncsiságból. Nekem be kellet állítani a FreeTDS verzióját az odbc-ben 7.2 -re (MSSQL2005-nél) és elkezdett működni, de voltak furcsaságok...
    Choosing protocol version:
    Choosing a TDS protocol versionFreeTDS User Guide: A Guide to Installing, Configuring, and Running F
    Itt be tudod állítani a global szekcióban hogy milyen tds version legyen(2008 -> 7.3)
    /etc/freetds/freetds.conf
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    A problémám a következő.

    Adatokat szeretnék lekérni, illetve tárolt eljárásokat szeretnék futtatni, egy távoli MsSQL szerverről. A probléma, hogy mind ezt Windows, és Linux alól is működnie kell. Már egy hónapja lassan csak fórumokat olvasgatok, viszont a hozzászólások 80% régebbi mint 3 év. 

    Specifikáció:

    SQL Server 2008R2
    Debian Whezy + PHP 5.4 
    Windows Server  + Apache + PHP 5.4 (vagy újabb)
    PDO

    Windows alatt nincs sok probléma. PDO + sqlsrv driver, és stabilan működik.

    Linux alatt viszont megakadtam. UnixODBC 2.3 + PDO + FreeTDS 
    Preparációnál, mikor binding-olok egy paramétert, a paraméter mindig csak TEXT típusra lesz konvertálva. Ez probléma, mert Text-et nem lehet közvetlenül Int, float -ra konvertálni. 
    Talán SQLDescripteParam bug ról van szó? Van valami folt, ami ezt javítaná?

    Próbáltam a UnixODBC + PDO + SQL driver for Linux (microsoft által kiadott driver linuxhoz)
    itt viszont belefutottam abba probléma hogy a binding - paraméterek mindig INPUT és OUTPUT ként mennek és, így meg kell adni egy hosszt is. A Tárolt eljárásokat még csak-csak át írom. (hogy minden paraméter OUTPUT legyen) De szimpla lekérdezést nem tudok futtatni preparálva. Elszáll hibával. (BUG)

    Természetesen ott van még a natív mssql.* függvények, viszont
    Windows alatt 5.3.* csak a sqlsrv függvényeit lehet használni. 
    Linux alatt hibátlanul működik (Pedig ez is Freetds-t használ :@ ) továbbá ha jól értettem PHP 7 esetén már Linux allat sem lesz elérhető a mssql.*

    Rövid időn belül szeretnék php verziót ugrani. Szóval nem megoldás, vissza állni windows alatt 5.3 -ra. 

    Esetleg készíthetnék egy absztrakciós osztályt, ami váltogat mssql.*, és sqlsrv között.  De könyörgöm, a PDO-nak pontosan ez lenne a dolga (ha nem is ilyen egyszerűen mint ahogy én most leírtam) 

    A kérdésem az hogy ezek a hibák tényleg nem lettek kijavítva, és PDO-val nem lehet linux alatt MsSQL-hez csatlakozni, és hiba nélkül tárolt eljárást futtatni?
    Esetleg átfutottam valami fölött? Milyen irányba lenne érdemes elindulni?
    Mutasd a teljes hozzászólást!
abcd