4

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?

5
  • 5
    The difference is now you'll have to use MSSQL syntax instead of MySQL syntax. Commented Oct 7, 2011 at 0:05
  • @NullUserException ఠ_ఠ: your comment has to be an answer )) Commented Oct 7, 2011 at 0:06
  • 1
    I converted an app from PHP/MYSQL to PHP/MSSQL once upon a time. Let me hunt up my notes... Commented Oct 7, 2011 at 0:08
  • @zerkms I was about to write it as an answer (with more details, of course), but I am about to leave work. Commented Oct 7, 2011 at 0:08
  • @mellamokb: all the notes are: replace functions with appropriate ones and rewrite queries ;-) Commented Oct 7, 2011 at 0:16

1 Answer 1

8

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.