我们有点奇怪的情况。最初使用Informix
和ODBC
通过PDO
数据源初次连接到PHP
的大量问题。最终计算出连接字符串,它似乎连接起来。但是,当我尝试对数据库运行任何SQL时(使用prepare()
和execute()
甚至PDO->query()
,我得到的全部值都是false。没有记录集,没有错误,没有任何错误
如果我将数据源名称更改为不存在的内容,我会立即收到错误(数据源不存在),但只要数据源正确,就会调用创建新的PDO
对象运行。
我已将我的prepare和我的查询语句包装在try / catch块中,但仍然没有。
任何人都可以给我任何关于我们可能出错的地方的想法,或者更准确地说我如何验证与数据库的连接?即使没有错误,我也不相信它已成功连接。
连接字符串是:
DSN=$database;UID=$username;PWD=$password;
任何帮助将不胜感激。
答案 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();
}
?>