Skip to Content
Author's profile photo George Wen

PHP 上用 SAP HANA 也很棒!(Linux版本) 【翻译】

原文来自:PHP rocks on SAP HANA too! (Linux version)

如果你认识我,你就知道我不是玩Linux的人。不过,我也把我2007年买的 LG T1 Express Dual笔记本电脑装上了Linux。这台电脑还是当年我第一次参加SAP TechEd的时候买的。你肯定能够想象,慢慢杀死一台笔记本的最好办法就是给它装上Windows和越来越多的软件。所以,我的本本已经被我闲置很久了,直到我给它装上Ubuntu。它给我的本本带来了新生。 🙂

人们的传说是对的:Linux在最垃圾,最古老的本本上都跑得风快。你看,我现在就在我的Linux上写这篇博客呢。 😉

几周以前我意识到我从来还没有写过在PHP上使用SAP HANA的文章,而很多人在尝试这么干时遇到一些问题。于是我写了一篇博客:PHP rocks on SAP HANA too!基于SAP HANA的PHP)。不过当时我是在Windows上面实现的,很多用户还在Linux下挣扎。所以,我该写这篇新博客了。

必须承认,没有 Ethan Zhang写的这篇伟大的博客:HANA with odbc on Ubuntu 12.04,我可能也还在配置的细节中挣扎。如论如何,作为了一个非Linux玩家,我想把配置的步骤和遇到的问题以及如何解决的都记下来会是个好主意。

当然,我的Linux上可没装PHP。所以,第一步就是安装PHP。不过我不想花太多时间去分别安装各个组件,所以我用LAMP

安装LAMP:

$ sudo apt-get install tasksel
$ sudo tasksel install lamp-server

运行完这两个命令以后,PHP就能用了。所以下一步就是安装SAP HANA 客户端。(32位Linux版)

现在,我们需要连到SAP HANA服务器。unixODBC是最好的选择。

安装unixODBC:

$ sudo apt-get install unixODBC unixODBC-dev

装好以后就该配置ODBC连接了:

$ sudo vi odbc.ini
[HDB]
driver = /usr/sap/hdbclient32/libodbcHDB32.so
ServerNode = hana_server:30115

好了,现在测试一下连接:

$ isql -v HDB SYSTEM manager

在这里我遇到一个出错信息,说找不到libodbcHDB32.so因为文件目录不存在。很奇怪,我决定查一下它的依赖性:

$ ldd /usr/sap/hdbclient32/libodbcHDB32.so

这个命令告诉我系统里找不到 libaio.so。所以,在Ubuntu Software Center里安装:

/wp-content/uploads/2013/03/libaio_182845.png

装好后isql就能运行成功了。下面我偷个懒,从我另外一个博客里拷来这段代码PHP_HANA.php:

<?php
$conn = odbc_connect("HDB","SYSTEM","manager",SQL_CUR_USE_ODBC);
if (!($conn))
{
          echo "<p>Connection to DB via ODBC failed: ";
        echo odbc_errormsg ($conn);
        echo "</p>\n";
}
else{
          if(isset($_POST["CARRID"]) == false){
                  $sql = "SELECT CARRID, CARRNAME FROM SFLIGHT.SCARR WHERE MANDT = 300";
               $rs = odbc_exec($conn,$sql);
               print("<DIV ALIGN='CENTER'>");
               print("<H1>SAP HANA from PHP</H1>");
               print("<FORM NAME='Get_Data' ACTION='$_SERVER[PHP_SELF]' METHOD='POST'>");
               print("<SELECT NAME='CARRID'>");
               while($row = odbc_fetch_array($rs)){
                     $carrid = $row["CARRID"];
                     $carrname = $row["CARRNAME"];
                     print("<OPTION VALUE='$carrid'>$carrname");
               }
        print("</SELECT>");
        print("<INPUT TYPE='SUBMIT' VALUE='Get Data'>");
        print("</FORM>");
        print("</DIV>");
        }
        else{
                  $carrid_param = $_POST["CARRID"];
                $sql = "SELECT * FROM \"_SYS_BIC\".\"blag/AV_FLIGHTS\"
                        WHERE CARRID = '$carrid_param'";
                $rs = odbc_exec($conn,$sql);
                print("<DIV ALIGN='CENTER'><TABLE BORDER=1>");
                print("<TR><TH>MANDT</TH><TH>CARRID</TH><TH>CONNID</TH>
                       <TH>COUNTRYFR</TH><TH>CITYFROM</TH>
                       <TH>AIRPFROM</TH><TH>COUNTRYTO</TH>
                       <TH>CARRNAME</TH><TH>DISTANCE</TH></TR>");
                while($row = odbc_fetch_array($rs)){
                          $mandt = $row["MANDT"];
                $carrid = $row["CARRID"];
                $connid = $row["CONNID"];
                $countryfr = $row["COUNTRYFR"];
                $cityfrom = $row["CITYFROM"];
                $airpfrom = $row["AIRPFROM"];
                $countryto = $row["COUNTRYTO"];
                $carrname = $row["CARRNAME"];
                $distance = $row["DISTANCE"];
                print("<TR><TD>$mandt</TD><TD>$carrid</TD>
                         <TD>$connid</TD><TD>$countryfr</TD>
                         <TD>$cityfrom</TD><TD>$airpfrom</TD>
                         <TD>$countryto</TD><TD>$carrname</TD>
                         <TD>$distance</TD></TR>");
               }
               print("</TABLE>");
               print("<A HREF='PHP_HANA.php'>Go Back</A></DIV>");
          }
}
?>

运行一下:

PHP_HANA_Linux_001.png

PHP_HANA_Linux_002.png

你看到了,不是很困难吧,对一个Windows玩家来说也是 😛

Assigned Tags

      3 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Ethan Zhang
      Ethan Zhang

      Good

      不过最好你的URL里面不要包含中文,我刚才刷新下浏览器,就说找不到你这篇了。

      Author's profile photo George Wen
      George Wen
      Blog Post Author

      URL是自动生成的吧?我好像没法控制。。。

      Author's profile photo Former Member
      Former Member

      不是所有浏览器转化成中文的,IE的就不会转化,刷新也不会有问题。