我初用php pdo 碰到pdo 例处无法捕获到的问题。描述如下:
php pdo捕获不到应有的例外
测试的procedure作用是往一个表中插入只有一个字符串(VARCHAR2(8))字段的记录。
字符串就是输入的参数字符串。
测试时,我将输入字符串长度加长,当超过目标表的最大长度时(我用oracle)
按理执行时应是有例处抛出。但这些信息我的代码始终打印不出来,IE则是显示“无法显示该页”
我的系统是 apache php oracle 其中apache 及php都是最新ver<?php
$dbh = new PdO("oci:dbname=//10.243.102.110:1522/oracle", "user_name", "passwd",
array(PDO::ATTR_PERSISTENT => true)
);
$dbh->setattribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sth=$dbh->prepare("CALL Test_Pdo_P(?)");
$var='01300000000000000000000000000000000'; //长度超过目标表的最大能容长度。
//缩短长度一切正常,能往目标表插入记录
$sth->bindParam(1, $var, PDO::PARAM_STR, 200);
// $sth->execute();
if (!$sth->execute()) { //按理应有例处产生并执行以下代码,可是我测试时并没有
echo "ERROR:"; //我测试的结果是连这行都无输出,晕。
echo $dbh->errorCode() . "<br>"; //PDO级别的错误代码
$info=$dbh->errorInfo(); //驱动级级别的错误信息数组
print_r($info);
echo "<br>";
}
$dbh=null;
?>
另外我测试普通的sql,故意加大数字范围,引发例处,可也是出现同样的现象:ie“无法显示该页”
代码如下:
<?php
try { echo "下面生成PDO连接"."<br>";
$dbh = new PdO("oci:dbname=//10.243.10.11:1522/hnbill", "user_name", "passwd",
array(PDO::ATTR_PERSISTENT => true)
);
echo "上面生成PDO对象,看到我说明没有出错"."<br>";
$sth=$dbh->query("insert into wcr values(3,333)");
echo "没出错显示我哦"."<br>";
}
catch (pdoException $e)
{
print "Error!: " . $e->getMessage() . "<br/>";
}
?> 所以我怀疑是不是PDO本身有问题?请各位高手帮忙看看。
另外网上有个列表链接如下:
http://www.nabble.com/Re:-PDO-Ex ... stion-p4211598.html
也是讲述pdoexception无法在IE中打印出来的。
php pdo捕获不到应有的例外
测试的procedure作用是往一个表中插入只有一个字符串(VARCHAR2(8))字段的记录。
字符串就是输入的参数字符串。
测试时,我将输入字符串长度加长,当超过目标表的最大长度时(我用oracle)
按理执行时应是有例处抛出。但这些信息我的代码始终打印不出来,IE则是显示“无法显示该页”
我的系统是 apache php oracle 其中apache 及php都是最新ver<?php
$dbh = new PdO("oci:dbname=//10.243.102.110:1522/oracle", "user_name", "passwd",
array(PDO::ATTR_PERSISTENT => true)
);
$dbh->setattribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sth=$dbh->prepare("CALL Test_Pdo_P(?)");
$var='01300000000000000000000000000000000'; //长度超过目标表的最大能容长度。
//缩短长度一切正常,能往目标表插入记录
$sth->bindParam(1, $var, PDO::PARAM_STR, 200);
// $sth->execute();
if (!$sth->execute()) { //按理应有例处产生并执行以下代码,可是我测试时并没有
echo "ERROR:"; //我测试的结果是连这行都无输出,晕。
echo $dbh->errorCode() . "<br>"; //PDO级别的错误代码
$info=$dbh->errorInfo(); //驱动级级别的错误信息数组
print_r($info);
echo "<br>";
}
$dbh=null;
?>
另外我测试普通的sql,故意加大数字范围,引发例处,可也是出现同样的现象:ie“无法显示该页”
代码如下:
<?php
try { echo "下面生成PDO连接"."<br>";
$dbh = new PdO("oci:dbname=//10.243.10.11:1522/hnbill", "user_name", "passwd",
array(PDO::ATTR_PERSISTENT => true)
);
echo "上面生成PDO对象,看到我说明没有出错"."<br>";
$sth=$dbh->query("insert into wcr values(3,333)");
echo "没出错显示我哦"."<br>";
}
catch (pdoException $e)
{
print "Error!: " . $e->getMessage() . "<br/>";
}
?> 所以我怀疑是不是PDO本身有问题?请各位高手帮忙看看。
另外网上有个列表链接如下:
http://www.nabble.com/Re:-PDO-Ex ... stion-p4211598.html
也是讲述pdoexception无法在IE中打印出来的。
if ($dbh->errorCode( )<>'00000') {
$error_array=$dbh->errorInfo( );
printf("SQLSTATE : %s\n",$error_array[0]);
printf("MySQL error code : %s\n",$error_array[1]);
printf("Message : %s\n",$error_array[2]);
}
try { } throw exception 后,catch (pdoexception $e)之后的 { 这里的所有语句都不显示出来,连最简单的echo “error"也都没有显示。 }
比如第二个例子
$sth=$dbh->query("insert into wcr values(3,333)")
我故意把数值加大到超过字段最大能容值,
$sth=$dbh->query("insert into wcr values(3,33333333333333333333333333333)")
按理,应产生例处,并打印在IE上。
但我现在的情况是运行该index.php后,硬盘狂转,好长一段后,ie显示“无法显示该页”。
根本不是显示我要的$e->getMessage().
如果不是故意加大数值,很正常的,页面响应极快
我的apache是默认安装,php也是,都是最新ver的。是不是我的apache conf参数还应改动那里?
我已改了 session响应时间为120秒了。
例外处理语句块无法正常执行。对程序设计影响太大。
喜爱它是因为我刚学php网页编程(在装完测试环境后,连php语法都还来不及看,呵。。有其他语言基础,胆大了些,迫不及待的就看manual ,并且先看数据库访问部分,因为这块是最重要的。
当我从诸多数据库访问方法中看到pdo时,被它面向对象的风格吸引住了。就冲着这点把php网站上 有关pdo部分全看完(可惜没有全理解,呵),函数调用,过程调用,query语句,连接数据库例外这几个部分的测试都挺顺,没发现啥问题。但除数据库连接之外的例外处理问题太多,耐着性子看了老外的邮件列表也解决不了(也许是php有其他解决方法??) 。
下午一气之下换成oci扩展试了试(第一次使用),一点问题都没有,就是代码风格太难看,象面向过程的。不喜欢。可毕竟是oracle多年的底层访问接口,问题应该不多吧?
等PDO 成熟后再杀回来。也许是我自己不行才解决不了这些问题,如果有高人能帮我解决,我还是选择通用的PDO,我太喜欢它了。