关于PHP连接字符串语法的Sage 50 ODBC

时间:2018-05-17 23:49:36

标签: php connection odbc sage50

连接字符串问题。版本 - Sage Line 50v24,PHP 7.2.2,Windows Server 2012 R2 64位。

很抱歉,如果我遗漏了一些内容 - 请在评论中询问任何遗漏的信息。我花了数小时,数小时研究这个并尝试不同的东西。谢谢! : - )

<?php  
$user="myuser";
$pass="mypass";
$connstring="Driver={SageLine50v24};Server=localhost;Database=\\\server1\\uncpath\\companyname\\accdata\\";
echo $connstring;
$conn=odbc_connect($connstring,$user,$pass); 
$sql="SELECT * FROM SALES_LEDGER";
$rs=odbc_exec($conn,$sql);
var_dump($rs); 
odbc_close($conn); 
?>

我相信ODBC驱动程序配置正常,因为它可以通过Excel工作。

我已广泛搜索并阅读了所有SO问题。这指出了ACCDATA在PHP中很关键后的最终反斜杠(尽管ODBC驱动程序在Excel或其他程序中不需要它;)

我尝试过的上述代码的变体包括;

  1. 数据库本地路径而不是UNC路径
  2. 包含和不包含空格的驱动程序名称
  3. 包含和不包含引号的服务器和数据库
  4. 我尝试的代码的另一种变体,但是错误报告没有返回任何答案;

    <?php 
    error_reporting(E_ALL);
    echo "<html>";
    echo "<body>";
    $user="myuser";
    $pass="mypass";
    $connstring="'Driver={SageLine50v24};Server=localhost;Database=\\\server1\\uncpath\\companyname\\accdata\\'";
    echo $connstring;
    $conn=odbc_connect($connstring,$user,$pass);
    echo odbc_error($conn);
    if (!$conn){exit("Connection Failed: " . $conn);}
    $sql="SELECT * FROM SALES_LEDGER";
    $rs=odbc_exec($conn,$sql);
    var_dump($rs);
    if (!$rs){exit("Error in SQL");}
    echo "<table><tr>";
    echo "<th>account</th>";
    echo "<th>name</th></tr>";
    while (odbc_fetch_row($rs))
    {
    $account=odbc_result($rs,"account_ref");
    $coname=odbc_result($rs,"name");
    echo "<tr><td>$account</td>";
    echo "<td>$coname</td></tr>";
    }
    odbc_close($conn);
    echo "</table>";
    echo "</body>";
    echo "</html>";
    ?>
    

1 个答案:

答案 0 :(得分:1)

这对您来说可能已经超过18个月,但可能会对其他人有所帮助。从Server 2008和PHP 5.3.28迁移到Server 2016和PHP 7.3.7时,我也挣扎了一段时间。两者都在IIS(Server 2016的版本10)下运行PHP。

以下是我使其正常工作所采取的步骤,后面是带有连接字符串的PHP示例:

  • 在服务器上安装Sage v24。您可能只需要进行服务器安装即可安装ODBC驱动程序和DSN,但是我安装了完整的应用程序。
  • 检查ODBC驱动程序扩展是否已添加到PHP配置中,因为PHP 7默认不包含该扩展。编辑C:\Program Files\PHP\v7.3\php.ini,在extension=php_odbc.dll部分中加入[ExtensionList]。使用的库是32位,因此它使用32位DSN。
  • 更新DSN(32位版本)以指向正确的Sage数据位置。为此,您需要使用32位版本的ODBC数据源管理器(如C:\Windows\SysWOW64\odbcad32.exe中所述。SageLine50V24系统DSN的数据路径示例为V:\SageData\2018\accdata
  • 在IIS中回收您网站的应用程序池。我不知道这是否真的必要,但这是在解决我的问题的过程中发生的。

PHP如下所示:

function sage_connect(){
  $uid = "username";
  $pwd = "password";
    if (($rConn = odbc_connect("DSN=SageLine50v24;uid=$uid;pwd=$pwd", $uid, $pwd)) === false) {
      die('Unable to connect to the Sage Line 50 V24 ODBC datasource.');
  }
  return $rConn;
}