YII SQL bindParam 小问题

framework1.1.8dbCDbCommand.php

最近写了个小工具来实现绑定。发现一个小问题 -.- !

/**
 * 纯sql自动过滤
 *
 * @author caihaibin
 * @param string $sql        	
 * @param array $params
 *        	array(':id'=>33)
 * @param boolean $showError
 *        	表示是否打印sql错误信息
 * @throws Exception
 */
function sql_execute_bind($sql, $params = array(), $showError = true, $mult = false) {
	try {
		if ($mult) {
			foreach ( $sql as $subsql ) {
				$db = Yii::app ()->db;
				$cmd = $db->createCommand ( $subsql );
				if ($params)
					foreach ( $params as $k => $v ) {
						$cmd->bindParam ( $k, $v );
					}
				$cmd->execute ();
			}
		} else {
			$db = Yii::app ()->db;
			$cmd = $db->createCommand ( $sql );
			if ($params)
				foreach ( $params as $k => $v ) {
					$cmd->bindParam ( $k, $v );
				}
			$cmd->execute ();
		}
	} catch ( Exception $e ) {
		if ($showError)
			echo $e->getMessage ();
		else {
			throw $e;
		}
	}
}

$v 在循环的过程中,为同一个地址的变量.

bindParam的值引用为地址。导致前面参数会被后面的绑定参数所覆盖

函数名

public function bindParam($name, &$value, $dataType=null, $length=null, $driverOptions=null)

解决方式,让$v使用原来的地址即可,即&$v

/**
 * 纯sql自动过滤
 *
 * @author caihaibin
 * @param string $sql        	
 * @param array $params
 *        	array(':id'=>33)
 * @param boolean $showError
 *        	表示是否打印sql错误信息
 * @throws Exception
 */
function sql_execute_bind($sql, $params = array(), $showError = true, $mult = false) {
	try {
		if ($mult) {
			foreach ( $sql as $subsql ) {
				$db = Yii::app ()->db;
				$cmd = $db->createCommand ( $subsql );
				if ($params)
					foreach ( $params as $k => &$v ) {
						$cmd->bindParam ( $k, $v );
					}
				$cmd->execute ();
			}
		} else {
			$db = Yii::app ()->db;
			$cmd = $db->createCommand ( $sql );
			if ($params)
				foreach ( $params as $k => &$v ) {
					$cmd->bindParam ( $k, $v );
				}
			$cmd->execute ();
		}
	} catch ( Exception $e ) {
		if ($showError)
			echo $e->getMessage ();
		else {
			throw $e;
		}
	}
}

补充:

http://www.laruence.com/2012/10/16/2831.html

http://weibo.com/1170999921/ylgFcpe1f

示例代码:

$arr=range(1,3);
var_dump($arr);
foreach($arr as &$val){

}
var_dump($arr);
//解决方式 参考:http://www.php.net/manual/zh/control-structures.foreach.php
//unset($val); // 最后取消掉引用

注:引用方式和原先所思考有所出入,需要查证后再做说明

验证:

$arr=range(1,3);
var_dump($arr);
foreach($arr as &$val){
	if($val==2)
		break;
}
var_dump($arr);

为当前变量,传递引用地址。不过php出循环的时候。。竟然没还保留。导致不小心修改了$val
如:$val =3;在foreach 之后。会导致数据被修改.

 

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

php5.5 + iis +url rewrite 异常处理

最近配置一客户服务器,一切都正常,就url rewrite 有异常.

分析:

框架是通过获取服务器相关变量进行识别当前路由

即:

php 5.4  以下的

$_SERVER['REQUEST_URI']

当前版本或相关配置导致的变量获取异常,直接导致url重写,路由相关识别异常

微软解决方案

http://support.microsoft.com/kb/954946/zh-cn

打了各种补丁,依旧不得识别

经分析,有另一变量保留了这个值.

so

入口加入以下代码。测试正常

 

if(!isset($_SERVER['REQUEST_URI'])&&isset($_SERVER['HTTP_X_ORIGINAL_URL']))
	$_SERVER['REQUEST_URI']=$_SERVER['HTTP_X_ORIGINAL_URL'];

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

xp + php 计划任务

1 设置

http://support.microsoft.com/kb/308569/zh-cn
高级里设置执行间隔

1.1使Windows XP “计划任务” 空密码运行

http://www.newxing.com/Tech/Soft/system/585.html

1.2访问的程序:

bat 文件一个

命令: php xxx/xxx/index.php即可

问题:

弹出cmd命令窗,时间设置麻烦,操作流程麻烦

 

 

2 其它方式,推荐

chrome + 自动刷新

https://chrome.google.com/webstore/detail/auto-refresh-plus/oilipfekkmncanaajkapbpancpelijih

你懂的

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

英语归纳篇(菜鸟归纳,别人误进)

又背单词,又跟美剧(friends 第一集看了十多遍 -.-# ),东西记了不少,但是实际上学的不多。

又从基础再回味相关。

英语句子成分分析及五种基本句型分析

http://beike.dangzhi.com/view/6r010h

注:因为本来就没有怎么去分析过这些,只是单纯知道。需要找时间恶补,多看多思考。

英语五种基本句型

http://beike.dangzhi.com/view/9g52jh

注:肥仔说没去鸟过这东西,所有语法什么的都是屁。了解词性后,从词性上为根本来了解这些,比较好思考。不明觉历,不明觉历
如: do you have time? do you have the time ?  就因为个 the  两句的意义分析.
如何让学生在一节课之内学完初一到高三的英语16种时态 效果神奇

http://www.360doc.com/content/13/0525/23/10886293_288194948.shtml

英语语法知识树

http://www.360doc.com/content/13/0525/23/10886293_288195607.shtml

注:这些为别人的归纳,只供参考。东西看多了,理不顺,参考别人,形成自己的系统树。

 

每天学习日志

===========================2014-04-12

简单句中,副词可以随意放.

i found him easily .

i found easily him.
===========================2014-04-13

名词性从句

词性

http://baike.baidu.com/view/377635.htm

英语词类、句子成分、句型详解

http://www.360doc.com/content/11/0314/20/5578727_101127005.shtml

 

post xml 操作类

/**
	 * 返回解析后的xml为数组格式
	 * @author caihaibin
	 * @param  $url 提交的url
	 * @param  $data 提交的xml本体
	 * @param  $domtoxml 返回值是否做将xml转换为array
	 * @param  $checkxml 检查提交的xml格式
	 * @param  $replace_empty 将xml转换成单行
	 * @throws Exception
	 * @return mixed
	 */
	function postxml($url,$data,$domtoxml=true,$checkxml=false,$replace_empty=false){
		//过滤换行 必要可以开启调试
		if($replace_empty){
			$data=preg_replace('/(?<=>)([^<]*?)(?=<[/])/sm', '', $data);
			$data=preg_replace('/(?<=>)([s]+?)(?=<[^/])/sm', '', $data);
		}
		//检查dom
		if($checkxml){
			$res = @simplexml_load_string ( $data, NULL, LIBXML_NOCDATA );
			if (! $res) {
				throw new Exception("提交xml异常!");
			}
		}
		$header[] = "Content-type: application/xml";        //定义content-type为xml,注意是数组
		$ch = curl_init ($url);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		$response = curl_exec($ch);
		if(curl_errno($ch)){
			//print curl_error($ch);
		}
		curl_close($ch);
		if(!$domtoxml)
			return $response;
		$res = @simplexml_load_string ( $response, NULL, LIBXML_NOCDATA );
		if (! $res) {
			throw new Exception("解析xml异常!");
		}
		$res = json_decode ( json_encode ( $res ), true );
		if (! $res) {
			throw new Exception("解析json异常!");
		}
		return $res;
	}

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

RSA 签名相关

php demo:

参考:

https://gist.github.com/winok/6153500

<?php 

## openssl genrsa -out key.pem 1024
## openssl rsa -in key.pem -pubout -outform PEM -out pubkey.pem
## openssl rsa -in key.pem -pubout -outform DER -out pubkey.der

function hextobin($hexstr) 
{ 
	$n = strlen($hexstr); 
	$sbin="";   
	$i=0; 
	while($i<$n) 
	{       
		$a =substr($hexstr,$i,2);           
		$c = pack("H*",$a); 
		if ($i==0){$sbin=$c;} 
		else {$sbin.=$c;} 
		$i+=2; 
	} 
	return $sbin; 
} 

function buildSign($toSign) {

	$signature = null;
	$priv_key = file_get_contents('key.pem');

	$pkeyid = openssl_get_privatekey($priv_key);
	openssl_sign($toSign, $signature, $pkeyid);
	openssl_free_key($pkeyid);

	$hex = bin2hex( $signature );
	return $hex;
}

function verifySign($sign, $toSign) {

	$signdata = hextobin($sign);

	$ret = openssl_verify($toSign, $signdata, file_get_contents('pubkey.pem'));
	return $ret;	
}

function verifySign_der($sign, $toSign) {

	$signdata = hextobin($sign);

	$der = file_get_contents('pubkey.der');
	$pem = "-----BEGIN PUBLIC KEY-----n";
	$str = base64_encode($der);
	$pem .= wordwrap($str, 64, "n", true)."n";	
	$pem .= "-----END PUBLIC KEY-----n";	

	$ret = openssl_verify($toSign, $signdata, $pem);
	return $ret;	
}

$sign = buildSign('test1');
if (verifySign($sign, 'test1') == 1)
	echo "successn";
if (verifySign_der($sign, 'test1') == 1)
	echo "successn";

echo "n";

$sign = buildSign('test1');
if (verifySign($sign, 'test2') == 0)
	echo "successn";
if (verifySign_der($sign, 'test2') == 0)
	echo "successn";

?>

 

相关格式参考:

http://www.cnblogs.com/xiaoweiyu/archive/2011/12/26/2302297.html

 

注意:

1.相关参数(如:openssl pkcs8 -topk8 -inform PEM -outform DER -in key.pem -out key.der -nocrypt 里的最后一个参数 )

2.公钥和私钥所用命令不同

3.通常二进制der格式通过 base64 或十六进制表示。先还原,再转换格式。

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

mysql 表结构+数据 转 oracle

一、命令操作(没有试过)

参考:

http://stackoverflow.com/questions/8395612/how-to-convert-a-mysql-database-to-an-oracle-database

官方参考:

https://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

 

 

二、工具操作(只考虑短期简单的):

参考:

Convert Mysql to Oracle

http://dbmover.com/download/mysqltooracle_cn.zip

需要注意:

1. 特殊类型会导致数据不出来,如(tinyint)

2.主键会丢失,需要重新设置

3. 特别需要留意大小写的问题.oracle 默认是将字段转换为大写。如果有小写的字段,需要用”包起来。mysql默认是大小兼容.

4.特殊字段需要注意 id ,uid 这类会识别有问题。不用“”包括会出问题。

注:导出数据表,用eclipse之类的快速转大写工具,将表结构转成大写(字段,以及相关主键关联:以navicat为例,表结构在各自数前。主键关联在最底部),再回导。

三、相关比对和注意事项(长期处理的,多了解点总是好的。)

http://www.cnblogs.com/yan5lang/archive/2010/03/08/1680649.html

 

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

 

yii 跨mysql & oracle 实现同表数据同步解决方案

只限数据,不涉及其它。

oracle 数据库ar使用

参考:http://blog.martoo.cn/?p=459

oracle 编码注意事项

编码需要在connectionString 后指定 .charset

直接配置charset 无效..

		'odb'=>array(
			'class'=>'CDbConnection',
            'connectionString'=>'oci:dbname=//xxxxxxx/xxx;charset=utf8;',
            'username'=>'xxxx',
            'password'=>'xxxx',
         	'charset'=>'utf8',
            'tablePrefix'=>'xxx_'
		),

 

需要明白一个点。任何业务流程操作后,最终只在数据这块同步。

所以yii 原ar的修改只需要在save 动作之后,同步数据。

即afterSave 事件处理.

demo:

	
	public function afterSave(){
		if($this->hasEventHandler('onAfterSave'))
			$this->onAfterSave(new CEvent($this));
		$omodel= OUser::model()->findByPk($this->getPrimaryKey());
		if(!$omodel){
			$omodel=new OUser();
		}else{
		}
                //因为大小写问题。这里将key $item=array_change_key_case($this->getAttributes(false), CASE_UPPER); 进行该处理
		$omodel->setAttributes($this->getAttributes(false),false);
		$omodel->save();
	}

 

补充yii 相关版本插入异常问题:

QQ Photo20140318091839

 

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

Navicat连接Oracle数据库失败,提示“unsupported server charset ZHS16GBK”的解决方法

参考:http://hi.baidu.com/nju520/item/da42f6dfce72e217e1f46f17

补充,需要将新版本目录完全覆盖。只替换相关dll文件还是会有问题。

当前版本为 navicat 11.2

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827