ma-100140 @ ウィキ phpからFreeTDSにつなぐ
※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

コマンドライン版のPHPからunixODBCを使ってみよう。

メインの部分は以下

$conn = odbc_connect( "SQLServer", "uid", "pass");
#$sql = "select * from 社員コードテーブル ;";
$rs = odbc_exec($conn,$sql);

if (odbc_error()) {
    echo odbc_errormsg($conn);
    exit(1) ;
}//end of if

実行すると、なぜかデータを表示するけど、エラー

セグメンテーション違反です

なんだろう?ネットで探すと、ああ、ある。これだな。
http://d.hatena.ne.jp/root8537/20140916/1410880230

phpのソースの中の以下のソースみたい。
/ext/odbc/php_odbc.c

#endif /* HAVE_ADABAS */
   default:
         rc = SQLColAttributes(result->stmt, (SQLUSMALLINT)(i+1), SQL_COLUMN_DISPLAY_SIZE,
                                   NULL, 0, NULL, &displaysize);
         displaysize = displaysize <= result->longreadlen ? displaysize :
                               result->longreadlen;
         /* Workaround for Oracle ODBC Driver bug (#50162) when fetching TIMESTAMP column */
        if (result->values[i].coltype == SQL_TIMESTAMP) {
              displaysize += 3;
        }
        //result->values[i].value = (char *)emalloc(displaysize + 1);
       //rc = SQLBindCol(result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR, result->values[i].value,
        //          displaysize + 1, &result->values[i].vallen);
        //コメントアウトした部分を以下のように変更。displaysize + 1をdisplaysize + 4に変更。
        result->values[i].value = (char *)emalloc(displaysize + 4);
        rc = SQLBindCol(result->stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR, result->values[i].value,
                    displaysize + 4, &result->values[i].vallen);
        break;
       }
   }
   return 1;
 }

phpを再コンパイルして、make install でapacheを再起動。

もう一度実行してみる。

エラーはでなくなりました。 これで心配なく使えます。

unixODBCでDB2を使った時のnullの問題