Berkeley 5.0.21提供的PHP扩展的Bug
今天装了个Berkeley 5.0.21进行测试。
顺利编译了自带的php_db4模块后,进行测试。发现del操作报错:
illegal flag specified to DB->del
<?php
dl('db4.so');
$db = new Db4();
$db->open(null, 'info.db', 'info');
$db->put('key', 'value');
var_dump($db->del('key'));
$db->close();
$db->del的返回值是22。也就是参数错误。
之前没接触过BDB,也不知道正不正常。但怀疑是不是因为php是支持4.x系列的,因此进到php模块的代码看了一下。
php的del的实现很简单:
/* {{{ proto bool DB4::del(string $key [, object $txn])
*/
ZEND_NAMED_FUNCTION(_wrap_db_del)
{
DB *db = NULL;
DB_TXN *txn = NULL;
zval *txn_obj = NULL;
u_int32_t flags; // 出错行:未初始化!改为 u_int32_t flags = 0;
DBT key;
char *keyname;
int keylen;
getDbfromThis(db);
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|O", &keyname, &keylen,
&txn_obj, db_txn_ce) == FAILURE)
{
return;
}
if(txn_obj) {
getDbTxnfromThis(txn);
flags = 0;
}
memset(&key, 0, sizeof(DBT));
key.data = keyname;
key.size = keylen;
RETURN_LONG(db->del(db, txn, &key, flags));
}
/* }}} */
因为我没有传递txn对象,因此txn_obj判断为false,出错原因就很简单了:
flags没初始化。
看起来低级错误谁都会犯。
修正后测试正常。
相关文档:
原文链接:http://www.phpdo.net/index.php/20100409/54.html
如何在PHP中创建数组呢?
在PHP中使用array函数来创建一个数组,它允许一定数量用逗号key=>value参数。Key可以是integer或者string类型,value可以是任何值。
例如:
<?php
$array = array(“php1″=>”phpdo”, ......
xml_parse解析xml文件时候,
很有可能不仅仅调用一次character_handler。
所以在获得xml节点的文本信息的时候,要用连接运算".="。
参考 http://jp2.php.net/manual/ro/function.xml-set-character-data-handler.php
ken at positive-edge dot com
30-Jan-2002
01:20
the function handler is called ......
创建文档类型声明
一般而言,XML声明放在文档顶部。在PHP中声明十分简单:只需实例化一个DOM文档类的对象并赋予它一个版本号。查看程序清单A:
程序清单 A
<?php
// create doctype
$dom = new DOMDocument("1.0");
// display document in browser as plain text
// display document in browser as plain text ......
//回车:[\n\r\t]
$reg="|typeid=\"(.*)\" onsel.*[\n\r\t]*<a href="\" mce_href="\""#\">(.*)</a>|";
preg_match_all ($reg,
$html,
$out, PREG_PATTERN_ORDER);
foreach ($out as $value){
foreach ($value as $value2){
if(strlen($value2)<20)
echo ($value2."<br>");
}
} ......