在PHP PDO中验证与Informix的ODBC连接

时间:2017-10-04 23:10:14

标签: php pdo odbc informix

我们有点奇怪的情况。最初使用InformixODBC通过PDO数据源初次连接到PHP的大量问题。最终计算出连接字符串,它似乎连接起来。但是,当我尝试对数据库运行任何SQL时(使用prepare()execute()甚至PDO->query(),我得到的全部值都是false。没有记录集,没有错误,没有任何错误

如果我将数据源名称更改为不存在的内容,我会立即收到错误(数据源不存在),但只要数据源正确,就会调用创建新的PDO对象运行。

我已将我的prepare和我的查询语句包装在try / catch块中,但仍然没有。

任何人都可以给我任何关于我们可能出错的地方的想法,或者更准确地说我如何验证与数据库的连接?即使没有错误,我也不相信它已成功连接。

连接字符串是:

DSN=$database;UID=$username;PWD=$password;

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

'未找到数据源名称,并且未指定默认驱动程序'将来自驱动程序管理器,因此,即使您指定了有效的DSN,驱动程序可能无法加载(或根本没有加载)

我建议确保ODBC驱动程序正在使用类似'isql'的东西(不确定你使用的是什么平台/驱动程序管理器,但如果是Linux,则应该是UnixODBC,默认情况下附带'isql')。 您可能会从isql获得比php更有意义的错误消息。

这是使用php和isql的快速连接,检查env变量:

informix@irk:/usr3/products/php5$ echo $ODBCINI
/usr3/products/php5/odbc.ini

informix@irk:/usr3/products/php5$ echo $INFORMIXDIR
/usr3/products/4.10.UC7D

informix@irk:/usr3/products/php5$ echo $LD_LIBRARY_PATH
/usr3/products/4.10.UC7D/lib:/usr3/products/4.10.UC7D/lib/cli:/usr3/products/4.10.UC7D/lib/esql

informix@irk:/usr3/products/php5$ cat $ODBCINI
[stores7]
Driver=/usr3/products/4.10.UC7D/lib/cli/iclit09b.so
Description=IBM INFORMIX ODBC DRIVER
Database=stores7
LogonID=informix
pwd=dummy
Servername=irk1210
;
; UNICODE connection Section
;
[ODBC]
;uncomment the below line for UNICODE connection
;UNICODE=UCS-2
;UNICODE=UTF-8
;
; Trace file Section
;
Trace=0
TraceFile=/tmp/odbctrace2.out
InstallDir=/usr3/products/4.10.UC7D
TRACEDLL=idmrs09a.so

informix@irk:/usr3/products/php5$ grep irk1210 $INFORMIXSQLHOSTS
irk1210shm onipcshm irk irk1210shm
irk1210 onsoctcp irk  3046   

informix@irk:/usr3/products/php5$ cat t.php
<?php
try { 
 $db = new PDO("odbc:stores7", "informix", "dummy");
 print "Connection Established!\n"; 
 $result=$db->query("select tabname from systables;");
 $row=$result->fetch(PDO::FETCH_NUM);
 print_r($row);

} catch (PDOException $e) {
 print $e->getMessage();
} 
?>

informix@irk:/usr3/products/php5$ isql -v stores7
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select first 1 tabname from systables
+---------------------------------------+
| tabname                                                                                                                         |
+---------------------------------------+
| systables                                                                                                                       |
+---------------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL> ^C


informix@irk:/usr3/products/php5$ cat t.php
<?php
try { 
 $db = new PDO("odbc:stores7", "informix", "dummy");
 print "Connection Established!\n"; 
 $result=$db->query("select tabname from systables;");
 $row=$result->fetch(PDO::FETCH_NUM);
 print_r($row);

} catch (PDOException $e) {
 print $e->getMessage();
} 
?>

informix@irk:/usr3/products/php5$ php t.php
Connection Established!
Array
(
    [0] => systables
)
informix@irk:/usr3/products/php5$ 

确保将环境变量INFORMIXDIR指向CSDK,并将LD_LIBRARY_PATH(再次假设这是Linux)设置为至少:

$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$INFORMIXDIR/cli

因此ODBC库可以加载它所需的全部内容。

答案 1 :(得分:0)

在IIUG 2017大会上试试我的第二次演讲:

http://smooth1.co.uk/ - &gt; &#34; IIUG 2017年会议A13 / A14 Informix应用程序开发新功能 - zip文件2&#34;

在我涵盖Informix / PHP设置和使用的语言中。

超出zipfile

  • php_htdocs.tar.gz示例PHP文件,可以放入apache htdocs文件夹中测试Informix / PHP。

  • 201704_InfAppDev2.txt如何设置PHP / PDO / Informix并使用上一个文件。

如下所示,PHP / PDO的默认错误模式是PDO :: ERRMODE_SILENT,您可能需要PDO :: ERRMODE_WARNING或者可能需要基于PDO :: ERRMODE_EXCEPTION异常的错误处理。

我的示例htdocs包括查询不同的方式,插入/更新/删除,错误处理和事务处理。

<?php

$db = new PDO("informix:host=localhost.localdomain; service=23176;database=justdave; server=ol_informix1210; protocol=onsoctcp;EnableScrollableCursors=1;", "testuser", "testpass");
print "Connection Established!<br>";

# Default is PDO::ERRMODE_SILENT
print "<br><h2>PDO::ERRMODE_SILENT</h2><br>";
$db->query('SLECT name FROM test_table2');
print "PDO::errorCode ".$db->errorCode()."<br>";
print "PDO::errorInfo <br>";
$err=$db->errorInfo();
print_r($err);
print "<br><br>".$err[2]."<br>";

# Also PDO::ERRMODE_WARNING
print "<br><h2>PDO::ERRMODE_WARNING</h2><br>";
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$db->query('SLECT name FROM test_table2');

# Also PDO::ERRMODE_EXCEPTION
print "<br><h3>PDO::ERRMODE_EXCEPTION</h3><br>";
try {
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$db->query('SLECT name FROM test_table2');
} catch (PDOException $e) {
        print "Error: ".$e->getMessage()."<br>";
        print "File: ".$e->getFile()."<br>";
        print "Line: ".$e->getLine()."<br>";
        print "Code: ".$e->getCode()."<br>";
        print "Trace: ";
        print_r($e->getTrace());
        print "<br><h2>Exception object</h2>";
        print_r($e);
        die();
}

?>
相关问题