Sorry nobody has chimed in with a solution for you. I have essentially zero experience with PHP in a MS-centric environment. Best I can contribute is to confirm that you looked at https://www.php.net/manual/en/ref.pdo-sqlsrv.php for the installation/configuration issues? (I'm suspecting you did, but just in case )
IIS Express PHP to MS SQL Server problem, Cannot find driver.
I went to say something but found my SQL Server-in-PHP experience was way out of date.
I thought I'd see what I could do short of installing SQL Server and IIS themselves. Copied php_sqlsrv_82_ts_x64.dll
and php_pdo__sqlsrv_82_ts_x64.dll
to the extension directory alongside all the others, and added the lines
extension=php_sqlsrv_82_ts_x64.dll
extension=php_pdo_sqlsrv_82_ts_x64.dll
And did a phpinfo() from the command line. I got it listed, which I understand is more success than you've been having. (Incidentally, putting the full filename is legacy; PHP will add the php_*.dll
as needed so the line could be extension=sqlsrv_82_ts_x64
. In fact, renaming the file to php_sqlsrv.dll
and referring to it as extension=sqlsrv
is possible and would save having to re-edit .ini every time the version changes. But I digress.)
Because the custom extension was there, I tried function_exists('sqlsrv_connect')
and got back true. phpinfo also listed sqlsrv under PDO drivers.
Like I said, I did all this from the command line. If it works from there then suspicion falls back on IIS. Let's assume that you don't get joy from the command line so problems must be somewhere before that. One possibility is that the .ini file you're editing isn't the one being used. Check up near the top of the phpinfo() output to see what it says for "Loaded Configuration File" and "Additional .ini files parsed" and whether those match the file you're working on.
(Speaking of, I do remember a weird incident once where the file I was editing was owned by a different user from the one I was working as: I could save and edit and reload and everything, but it turned out that I was actually working on a different copy from the "real" one. I don't know why Windows would give two different files the same path for two different users, but that was apparently what was happening. I recall a desktop.ini file being involved.)
Likewise, getting phpinfo() served up through IIS and comparing it (especially the lines about which .ini files are loaded) with what the command-line call does might yield further clues.
NogDog
Thanks for reaching out anyway.
Yes I have done the rounds pretty much.
Just thought I would reach out before abandoning it as a lost cause.
As I noted earlier I used it years ago on a Windows 7 platform with IIS6 with no problem
connecting to MS SQL Server V12.
Weedpacket
Thanks Weedpacket.
I haven't actually explored the command line options.
I will give it a go even though I don't see much practical use for them.
But it might suggest the solution is to re-installing IIS which I don't particularly want to
do because I have a lot of websites that work fine on there. It would be a lot of
work.
The php.ini file is definitely the right one according to the phpinfo() and I have
tested it by adding and removing things to see if phpinfo() picks the changes
up just to be certain. Which it does no problem there. Except for when I'm trying
to install these sqlsvr extensions.
I also checked the ext folder path that's correct too.
But no matter what I do it doesn't show any refence to the sqlsrv extensions.
If someone has a php.ini that that works with sql server that I could compare mine to that would
a huge help.
Might identify something that is missing from min.
- Edited
Well, here's the thing I just tried.
I took php.ini-production
in the distribution (to make sure none of the customisations mine has accrued over the years are involved, and should probably review that now I think about it), copied it to php.ini
, and at the end of the list of extensions (line 965) added the line
extension=pdo_sqlsrv_82_ts_x64
Adding that line was the only change I made to what was otherwise identical to php.ini-production
.
I put php_pdo_sqlsrv_82_ts_x64.dll
(which version of course matches my PHP version) in the extension directory (ext
).
Ran:
C:\php> php -r "phpinfo();" > phpinfo.txt
And the resulting file has the section
PDO
PDO support => enabled
PDO drivers => sqlsrv
pdo_sqlsrv
pdo_sqlsrv support => enabled
ExtensionVer => 5.11.0-beta1+16628
Directive => Local Value => Master Value
pdo_sqlsrv.client_buffer_max_kb_size => 10240 => 10240
pdo_sqlsrv.log_severity => 0 => 0
pdo_sqlsrv.report_additional_errors => 1 => 1
(As the extension version suggests, I downloaded the most recent sqlsrv zip file for this.)
Note that I have neither SQL Server nor SSMS installed, so I can't say whether the extension would work as installed or if more initialisation is needed, but the extension is at least being recognised and registered with that minimum amount of work.
In my normal php.ini
where I have a couple of other database extensions registered (PostgreSQL and SQLite), there was no trouble adding SQL Server as a third, so your including MySQL as well shouldn't be a problem.
Weedpacket
Thanks man.
I will paste those directives into my ini file and see what happens.
Btw I'm not getting notifications from you guys when you reply.
I need to figure that out.
Weedpacket
Made no difference unfortunately.
Btw my own php.ini.production file has practiaclly nothing in it,
- Edited
RayPooley Btw my own php.ini.production file has practiaclly nothing in it,
Oh? The official one is over 70kB, mostly documentation. Are you using a download from php.net or something from another source? Usually those files (that and the -development
variant) are left as is, and working ini files are based off one of them as appropriate.
Weedpacket
I think it's time to abandon it to be honest.
One thing I don't get is why there are so many drivers and why each new version of PHP has to have
it's own unique driver. There should be one backward compatible driver fits all for each database.
It all seems a bit of a mess frankly. Ill thought out.
I have been using MS Sql Server for 20 years and functionally speaking it hasn't changed
that much in that time.
RayPooley I think what happened is that Microsoft declared that they would take over maintaining PHP's SQL Server driver. So it no longer ships with PHP itself and upgraded alongside it with each release.
Weedpacket Good point. Doesn't seem to be working out so well.
Finally got there. Took a reinstall of IIS Express. Version 10.0.19041.1
Then a reinstall of PHP.
I chose version 8.2 and appropriate driver (nts) version.
Connection syntax :
$conn = "";
$serverName = "YourMachine\SqlServerInstance";
$database = "YourDBName";
$uid = "YourDBAccount";
$pwd = "YourDBAccountPassword";
try {
$conn = new PDO("sqlsrv:server=$serverName;Database=$database", $uid, $pwd);
//If the exception is thrown, this text will not be shown
//echo("If you see this, it worked");
}
//catch exception Provider=SQLOLEDB;
catch(Exception $e) {
echo ("Message: " .$e->getMessage() . " " . $e->getTraceAsString());
}
PHP Version
php-8.2.5-nts-Win32-vs16-x64
PHP Driver version
php_pdo_sqlsrv_82_nts_x64.dll
I copied the php.ini.development file to php.ini and added the sqlsvr driver and it worked.
The php.ini file is too large to include in this post.
Here are the important lines
extension_dir = "C:\php-8.2.5-nts-Win32-vs16-x64\ext\"
The folowing are the last entries in the PHP.ini file
[PHP_CURL]
extension=php_curl.dll
[PHP_GD2]
extension=php_gd2.dll
[PHP_GETTEXT]
extension=php_gettext.dll
[PHP_MYSQLI]
extension=php_mysqli.dll
[PHP_MBSTRING]
extension=php_mbstring.dll
[PHP_OPENSSL]
extension=php_openssl.dll
[PHP_SOAP]
extension=php_soap.dll
[PHP_XMLRPC]
extension=php_xmlrpc.dll
[PHP_ODBC]
extension=php_odbc.dll
[PHP_PDO_ODBC]
extension=php_pdo_odbc.dll
[PHP_PDO_SQLSRV_82_NTS_X64]
extension=php_pdo_sqlsrv_82_nts_x64.dll