Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP and SQL Server - Thoughts

I have recently taken on a project that is unique in nature and wanted to get some advice from everyone.

I use both asp.net/SQL Server and php/mysql each separately. I've never mixed them up. However, my current project requires me to write code using PHP while using a SQL Server backend.

I've found plenty of articles on how to connect to SQL Server, but wanted to ask a question here. What are the gotchas?

How is using PHP with a SQL Server backend different than using MySQL?

like image 218
Richard M Avatar asked Feb 22 '23 18:02

Richard M


1 Answers

I converted a project from PHP/MySql to PHP/MSSQL once upon a time. I'll provide my notes here of what I found as I was converting. I think for some reason I ended up using the odbc commands instead of mssql because they seemed to be more reliable, especially if you are doing multiple queries in the same page - don't ask me why, that's just what I found.

My command syntax comparison chart:

*mysql cmd*         *mssql cmd*         *odbc cmd*          *Notes*
mysql_errno         mssql_errno         odbc_error  
mysql_error         mssql_error         odbc_errormsg   
mysql_select_db     mssql_select_db     unneeded    
mysql_query         mssql_query         odbc_exec           odbc_exec requires the resource link parameter ($db)
mysql_affected_rows mssql_rows_affected odbc_num_rows   
mysql_num_rows      mssql_num_rows      odbc_num_rows   
mysql_fetch_object  mssql_fetch_object  odbc_fetch_object   
mysql_close         mssql_close         odbc_close          odbc_close requires the resource link parameter ($db)
mysql_fetch_array   mssql_fetch_array   odbc_fetch_array    
mysql_result        mssql_result        odbc_result         odbc_result cannot take a row index as parameter; must cycle with odbc_fetch_row
mysql_fetch_row     mssql_fetch_row     odbc_fetch_row      odbc_fetch_row does not return the result; use odbc_fetch_row with odbc_result

My code snippets replacement chart for conversion (I had literally done this project by generating a list of FIND/REPLACE strings and applied them across the entire code base until there were no more errors left :-):

*old mysql code*                                        *new odbc code*                             *Notes*
for ($i = 0; $i < mysql_num_rows($result); $i++)        while (odbc_fetch_row($result))             odbc_num_rows doesn't usually work for finding how many rows returned
mysql_result($result, $i                                odbc_result($result                         odbc_result can't go request the result for a specific row, have to use odbc_fetch_row
NOW()                                               GETDATE()                                   NOW() function in mysql is GETDATE() in sql server
if (connect_db())                                   if ($db = connect_db())                     In mysql, you don't have to keep track of the $db resource - with odbc, you do
if (!connect_db())                                  if (!($db = connect_db()))                  See notes on previous entry
                                                    odbc_fetch_row($result);                    When retrieving a single row, you have to call fetch_row with odbc, but not with mysql
if (mysql_num_rows($result) == 1)                   if (odbc_fetch_row($result))                odbc_num_rows usually doesn't work, so for a single row, just do if odbc_fetch_row
if (mysql_errormsg() || mysql_num_rows($ASISHSresult) == 0)     if (!odbc_errormsg() && !odbc_fetch_row($ASISHSresult)) 
limit ##, ##                                        row_number() over (order by ???)            limit function in mysql has to be translated to row_number() function in odbc (also must be inc. by 1 to offset off-by-1 error between mysql and sql server)
match(body) against ('expr' in boolean mode)        contains(body, 'expr') or containstable(Body, 'expr')   fulltext matching in sql server has different syntax than mysql
text_column = value                                 cast(text_column as varchar(good_size)) = value     mysql can compare text column to value, sql server cannot without varchar casting
                                                    odbc_free_result($result);                  When you make a lot of connections, you must free results or your future connections may be ignored

One last point. If you make use of the built-in encryption commands to encrypt passwords as we did in this project, you'll need to do the encryption in php instead of mysql.

like image 143
mellamokb Avatar answered Mar 03 '23 01:03

mellamokb