PHP沙龙 - PHPSalon.com - Justin's Blog - Sofee.cn

世界其实很简单,复杂的是人;生活其实很轻松,沉重的是感情!

用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
ezdevelop的公告
<script language="javascript"> document.getElementById("tagline").outerHTML="<font color='#ffffff' size='4'>世界其实很简单,复杂的是人;生活其实很轻松,沉重的是感情!<br><font color='red'>请访问我的新BLOG地址:<a href='http://www.sofee.cn/blog'><font color='red' site='4'>http://www.sofee.cn/blog</font></a></font></font>"; document.getElementById("Header1_MyLinks1_HomeLink").outerHTML="<a href='http://www.phpsalon.com'>PHPSalon.com</a>"; if (confirm("本人BLOG已搬到http://www.sofee.cn/blog/,点击确定自动跳转!")) { this.location.href="http://www.sofee.cn/blog/"; } </script> -------------------------<br> <center><a href="http://www.sofee.cn/blog" target="_blank"><font size="4" color="red">点击进入我的新BLOG</font></a></center> -------------------------<br> <font color="red"><b>作者声明:</b></font>本人专栏内的所有文章,除注明转载外均为本人原创,未经许可,严禁任何形式转载。<br>
文章分类
.Personal
Justin's Tech Blog(RSS)
My Alumni
My Website
Friend's Blog
PHP/MySQL经验点滴
大麦英语学习论坛
速推网
存档

原创  为PDO加入PDO_FETCH_XML补丁 收藏

点击进入我的新BLOG:http://www.sofee.cn/blog/

最近在开发自己的SofeeFramework的时候,需要直接从数据库取出为XML格式,以便用SimpleXML来处理,由于到目前为止PDO还未加入该格式,索性就自己为PDO打了个补丁。该补丁是在PDO-1.0RC1基础上制作的。

例子:
=======================================================
<?php
$x = new PDO("sqlite::memory:");
$x->query("create table test(name string, value string)");
$stmt = $x->prepare("INSERT INTO test (NAME, VALUE) VALUES (:name, :value)");

$stmt->bindParam(":name", $the_name, PDO_PARAM_STR, 32);
$stmt->bindParam(":value", $the_value, PDO_PARAM_STR, 32);

for ($i = 0; $i < 4; $i++) {
    $the_name = "foo" . rand();
    $the_value = "bar" . rand();

    if (!$stmt->execute()) {
        break;
    }
}

$stmt = $x->query("SELECT * FROM test");

header("Content-type: text/xml;");
echo $stmt->fetchAll(PDO_FETCH_XML);
?>

输出为:
===============================================================
- <resultset queryString="SELECT * FROM test">

  - <row>
    <name>foo30156</name>
    <value>bar21</value>
    </row>
  - <row>
    <name>foo7978</name>
    <value>bar16667</value>
    </row>
  - <row>
    <name>foo8888</name>
    <value>bar2193</value>
    </row>
  - <row>
    <name>foo1014</name>
    <value>bar21495</value>
    </row>
  </resultset>

下面为补丁文件内容:
===============================================================================
diff -Nur PDO-1.0RC1/pdo.c pdo/pdo.c
--- PDO-1.0RC1/pdo.c Sun Sep 11 13:27:30 2005
+++ pdo/pdo.c Mon Oct 24 19:18:38 2005
@@ -320,6 +320,7 @@
  REGISTER_LONG_CONSTANT("PDO_FETCH_SERIALIZE",(long)PDO_FETCH_SERIALIZE, CONST_CS|CONST_PERSISTENT);
 #endif
  REGISTER_LONG_CONSTANT("PDO_FETCH_NAMED",(long)PDO_FETCH_NAMED, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("PDO_FETCH_XML",    (long)PDO_FETCH_XML, CONST_CS|CONST_PERSISTENT);
 
  REGISTER_LONG_CONSTANT("PDO_ATTR_AUTOCOMMIT", (long)PDO_ATTR_AUTOCOMMIT, CONST_CS|CONST_PERSISTENT);
  REGISTER_LONG_CONSTANT("PDO_ATTR_PREFETCH",  (long)PDO_ATTR_PREFETCH, CONST_CS|CONST_PERSISTENT);
diff -Nur PDO-1.0RC1/pdo_stmt.c pdo/pdo_stmt.c
--- PDO-1.0RC1/pdo_stmt.c Sun Sep 11 03:32:16 2005
+++ pdo/pdo_stmt.c Tue Oct 25 11:13:49 2005
@@ -36,6 +36,7 @@
 #include "zend_exceptions.h"
 #include "zend_interfaces.h"
 #include "php_memory_streams.h"
+#include "ext/standard/php_smart_str.h"
 
 #if COMPILE_DL_PDO
 /* {{{ content from zend_arg_defs.c:
@@ -743,6 +744,7 @@
  int flags = how & PDO_FETCH_FLAGS, idx, old_arg_count;
  zend_class_entry * ce, * old_ce;
  zval grp_val, *grp, **pgrp, *retval, *old_ctor_args;
+ smart_str xmlstr = {0};
 
  how = how & ~PDO_FETCH_FLAGS;
  if (how == PDO_FETCH_USE_DEFAULT) {
@@ -846,6 +848,11 @@
      }
     }
     break;
+
+   case PDO_FETCH_XML:
+    convert_to_string(return_value);
+    smart_str_appends(&xmlstr, "<row>");
+    break;
     
 
    default:
@@ -969,6 +976,16 @@
      stmt->fetch.func.values[idx] = val;
      stmt->fetch.cls.fci.params[idx] = &stmt->fetch.func.values[idx];
      break;
+
+    case PDO_FETCH_XML:
+     smart_str_appends(&xmlstr, "<");
+     smart_str_appendl(&xmlstr, stmt->columns[i].name, stmt->columns[i].namelen);
+     smart_str_appends(&xmlstr, ">");
+     smart_str_appendl(&xmlstr, Z_STRVAL_P(val), Z_STRLEN_P(val));
+     smart_str_appends(&xmlstr, "</");
+     smart_str_appendl(&xmlstr, stmt->columns[i].name, stmt->columns[i].namelen);
+     smart_str_appends(&xmlstr, ">");
+     break;
     
     default:
      zval_ptr_dtor(&val);
@@ -1020,6 +1037,13 @@
      zval_ptr_dtor(&stmt->fetch.func.values[idx]);
     }
     break;
+
+   case PDO_FETCH_XML:
+    smart_str_appends(&xmlstr, "</row>");
+    smart_str_0(&xmlstr);
+    ZVAL_STRINGL(return_value, xmlstr.c, xmlstr.len, 1);
+    smart_str_free(&xmlstr);
+    break;
    
    default:
     break;
@@ -1231,6 +1255,7 @@
  zend_class_entry *old_ce;
  zval *old_ctor_args, *ctor_args = NULL;
  int error = 0, old_arg_count;
+ smart_str xmlstr = {0};
 
  if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|lzz", &how, &arg2, &ctor_args)) {
   RETURN_FALSE;
@@ -1318,7 +1343,6 @@
    error = 1;
   }
  }
-
  if (!error) {
   PDO_STMT_CLEAR_ERR();
   MAKE_STD_ZVAL(data);
@@ -1339,11 +1363,29 @@
     MAKE_STD_ZVAL(data);
    } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, return_all TSRMLS_CC));
   } else {
-   array_init(return_value);
+   if (how == PDO_FETCH_XML) {
+    convert_to_string(return_value);
+    smart_str_appends(&xmlstr, "<resultset queryString=\"");
+    smart_str_appendl(&xmlstr, stmt->query_string, stmt->query_stringlen);
+    smart_str_appends(&xmlstr, "\">");
+   } else {
+    array_init(return_value);
+   }
    do {
-    add_next_index_zval(return_value, data);
+    if (how == PDO_FETCH_XML) {
+     smart_str_appends(&xmlstr, Z_STRVAL_P(data));
+    } else {
+     add_next_index_zval(return_value, data);
+    }
     MAKE_STD_ZVAL(data);
    } while (do_fetch(stmt, TRUE, data, how, PDO_FETCH_ORI_NEXT, 0, 0 TSRMLS_CC));
+
+   if (how == PDO_FETCH_XML) {
+    smart_str_appends(&xmlstr, "</resultset>");
+    smart_str_0(&xmlstr);
+    ZVAL_STRINGL(return_value, xmlstr.c, xmlstr.len, 1);
+    smart_str_free(&xmlstr);
+   }
   }
   FREE_ZVAL(data);
  }
diff -Nur PDO-1.0RC1/php_pdo_driver.h pdo/php_pdo_driver.h
--- PDO-1.0RC1/php_pdo_driver.h Wed Jul 20 11:38:34 2005
+++ pdo/php_pdo_driver.h Mon Oct 24 19:18:29 2005
@@ -90,6 +90,7 @@
  PDO_FETCH_INTO,  /* fetch row into an existing object */
  PDO_FETCH_FUNC,  /* fetch into function and return its result */
  PDO_FETCH_NAMED,    /* like PDO_FETCH_ASSOC, but can handle duplicate names */
+ PDO_FETCH_XML,  /* fetch row into xml format */
  PDO_FETCH__MAX /* must be last */
 };
 

发表于 @ 2005年10月24日 20:09:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:做人要厚道!关于ZEND闲话 | 新一篇:Yahoo! PHP Dev Center

  • 发表评论
  • 评论内容:
  •  
Copyright © ezdevelop
Powered by CSDN Blog