Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Sean_Zhang
Product and Topic Expert
Product and Topic Expert
0 Kudos

     原文链接:PHP rocks on SAP HANA too!

     几天前,一个朋友告诉我最近一些同仁尝试使用PHP访问SAP HANA,但是都以失败告终。因此,我就把这件事作为自己的目标了。虽然我已经很久没用过PHP了,但是这阻止不了我。

     首先是创建ODBC连接,然后尝试使用它,但是失败了。仅仅因为我创建的连接使用的是“用户DSN”而不是“系统DSN”。什么时候该使用哪一个,我不知道。但是通过使用“系统DSN”成功了,所以就不管了。

    既然ODBC已经工作了,那么就该写一个简单的查询来测试,再次失败。。。得到的是乱七八糟和令人费解的错误信息:

      Scrollable Result  is not yet implemented-可滚动结果尚未实现”,到底是什么意思?首先我认为可能是NVARCHAR不被支持,因此我就创建了一个只包含两个VARCHAR字段的临时表,得到的结果还是一样。因此应该是其他什么原因。最后我不得不求助于Google,我发现一些数据库允许使用游标来前后移动。SAP HANA这里以某种方式给我提示了一个错误,那么最简单的方法就是指定游标 :wink:

$conn = odbc_connect("HANA_KT_SYS","SYSTEM","manager", SQL_CUR_USE_ODBC);

即使用SQL_CUR_USE_ODBC就可以了。

          对于这个例子,我决定通过关联表SPFLISCARR来创建一个属性视图。第一个页面显示所有可用的CARRID,第二个页面使用HTML表格显示一些字段,整个内容简单而直接。

现在,然我们看看PHP代码(PHP_SAPHANA.php):

<?php
$conn = odbc_connect("HANA_KT_SYS","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_SAPHANA.php'>Go Back</A></DIV>");
          }
}
?>

现在,我们可以从浏览器里调用它:

你会看到,这里对于你使用SAP HANA做什么没有任何限制。有时候成功,其实就在下一步。 :wink: