2012-1-30 18:02 Monday  

起因:
公司购买的shopex程序取得商业授权认证失败,对方程序员弄了个测试代码来表明是由于我对服务器的设置有问题导致的。

原代码:

$fp = fsockopen(http://www.shopex.cn/, 80, $errno, $errstr, 30);

错误提示:

$fp = fsockopen("http://www.shopex.cn/", 80, $errno, $errstr, 30);
Warning: fsockopen() [function.fsockopen]: unable to connect to http://www.shopex.cn/:80 (Unable to find the socket transport "http" – did you forget to enable it when you configured PHP?) in D:\xampp\htdocs\mediashop_cn\test.php on line 2
Unable to find the socket transport "http" – did you forget to enable it when you configured PHP? (24)

解决:

1.修改代码为:

$fp = fsockopen("www.shopex.cn", 80, $errno, $errstr, 30);

$fp = fsockopen("tcp://www.shopex.cn", 80, $errno, $errstr, 30);

参考:
http://uk.php.net/manual/en/function.fsockopen.php
http://uk.php.net/manual/en/transports.php

2.设置服务器防火墙允许服务器访问外部网站,至少允许访问www.shopex.cn

我是用路由器出现的问题,百度谷歌了好久,终于找到方法了:

原文地址:http://www.jiangmiao.org/blog/505.html

本人路由器不才,长时间使用ubuntu后会发生一奇怪现象,只能访问部份网站,比如baidu可以访问,但google只能ping得通但无限timeout,google后发现,只需修改/etc/sysctl.conf 添加

net.ipv4.tcp_window_scaling=0
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_timestamps = 0

再输入 sysctl -p 重启后即可。

由于ubuntu默认账户不是ROOT,所以执行命令时要加sudo,

两个命令依次为:
sudo gedit /etc/sysctl.conf,修改后保存;

sudo sysctl -p执行后,firefox即可工作正常。

1、解决IE不显示PNG图片(很多验证码无法显示的问题)

虽然这些验证码并不是png格式的,但是却无法显示,究竟什么原因我到现在也没搞清楚,有人说是安装了Quicktime的问题,也有人说中毒等等。不管他了,反正就是无法显示png。

网上很多修改注册表或者重新注册pngfilt.dll的方法都不管用。但是网上有一段注册表文件却十分有效的!

下载:Windows XP下修复IE不能显示PNG图片的注册表
下载:Vista下修复IE不能显示PNG图片的注册表

反正我双击这个文件将导入到注册表以后,重新打开IE就正常了!

2、IE下部分Flash不显示的问题

这个问题很奇怪,网页中有不少的Flash,有的能显示,但是有些就是和png一样显示为一个叉叉,很奇怪。解决的方法就是重新安装Flash。

首先卸载Flash,找到地址 C:\WINDOWS\system32\Macromed\Flash
运行里面 FlashUtil10e.exe 和 uninstall_activeX.exe 文件,注意不同版本 FlashUtil10e.exe 文件名可能不同。反正你运行反安装Flash就行了。

然后重新安装Flash,在网上要下载最新版本的Flash player,要安装Adobe Flash Player ActiveX for IE/AOL版本,支持IE的。

2012-1-30 18:00 Monday  
如果有同域名下的其它域名接收,一定要放在泛解析的前面,否则无法正常访问。
在开始->运行里输入 "regsvr32 msxml3.dll" 然后回车就可以.

虽然可以使用以下js来得到text
document.getElementById("lnkId").options[document.getElementById("lnkId").selectedIndex].text
但是总觉得烦,不爽,还是用jquery吧

<select name="lnkId" id="lnkId" style="width:100px;">
                            <option value="">-选择联系人-</option>
                            <option value="">-asdfwef-</option>
<option value="">-asdfasdf-</option>
<option value="">-选asdfas择efasdfasdf联系人-</option>
                        </select>


使用这一句就好了
alert($("#lnkId>option:selected").get(0).text);

2012-1-30 17:58 Monday  
function Serialize(obj){   

switch(obj.constructor){   
        case Object:   
            var str = "{";   
            for(var o in obj){   
                str += o + ":" + Serialize(obj[o]) +",";   
            }   
            if(str.substr(str.length-1) == ",")   
                str = str.substr(0,str.length -1);   
             return str + "}";   
             break;   
         case Array:               
             var str = "[";   
             for(var o in obj){   
                 str += Serialize(obj[o]) +",";   
             }   
             if(str.substr(str.length-1) == ",")   
                 str = str.substr(0,str.length -1);   
             return str + "]";   
             break;   
         case Boolean:   
             return "\"" + obj.toString() + "\"";   
             break;   
         case Date:   
             return "\"" + obj.toString() + "\"";   
             break;   
         case Function:   
             break;   
         case Number:   
             return "\"" + obj.toString() + "\"";   
             break;    
         case String:   
             return "\"" + obj.toString() + "\"";   
             break;       
     }   
}

MySQL 当记录不存在时插入,当记录存在时更新
网上基本有三种解决方法。

第一种:

示例一:插入多条记录

假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
示例一:插入单条记录

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。

第二种:

INSERT 中 ON DUPLICATE KEY UPDATE的使用

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
         -> ON DUPLICATE KEY UPDATE c=c+1;

mysql> UPDATE table SET c=c+1 WHERE a=1;
如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。
您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果 没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。 VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候会返回NULL。
示例:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
         -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本语句与以下两个语句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
         -> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
         -> ON DUPLICATE KEY UPDATE c=9;
当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

第三种:
REPLACE语句

  我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出 一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用DELETE语句删除原先的记录,然后再使用 INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用REPLACE插入一条记录时,如果不重 复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。

  使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

  在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。

  在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了 DELETE删除这条记录,然后再记录用INSERT来插入这条记录。如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。

  REPLACE的语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。

  REPLACE INTO users (id,name,age) VALUES(123, '赵本山', 50);
 
  插入多条记录:

  REPLACE INTO users(id, name, age)
  VALUES(123, '赵本山', 50), (134,'Mary',15);

  REPLACE也可以使用SET语句

  REPLACE INTO users SET id = 123, name = '赵本山', age = 50;

  上面曾提到REPLACE可能影响3条以上的记录,这是因为在表中有超过一个的唯一索引。在这种情况下,REPLACE将考虑每一个唯一索引,并对每 一个索引对应的重复记录都删除,然后插入这条新记录。假设有一个table1表,有3个字段a, b, c。它们都有一个唯一索引。

  CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);

  假设table1中已经有了3条记录

  a b c
  1 1 1
  2 2 2
  3 3 3

  下面我们使用REPLACE语句向table1中插入一条记录。

  REPLACE INTO table1(a, b, c) VALUES(1,2,3);

  返回的结果如下

  Query OK, 4 rows affected (0.00 sec)

  在table1中的记录如下

  a b c
  1 2 3

  我们可以看到,REPLACE将原先的3条记录都删除了,然后将(1, 2, 3)插入。
总结:虽然没有具体测试,感觉第一种最费资源了(只是感觉),不过你要是没有主键的话也只能用他了。第二种和第三种的区别是:1)insert是先尝试插 入,若主键存在则更新。REPLACE是先尝试插入,若主键存在则删除原纪录再插入。2)如果有多个唯一关键字发生冲突(不同关键字的冲突发生在不同记 录),比如现在有2个字段2条记录冲突了(没条记录冲突一个字段),则insert是选择排序后在前面的一条进行更新,REPLACE是删除那两条记录, 然后插入新记录。本人的一点小见解,如有错误,欢迎指正。
<script>

var start=0;

var end=0;

function add(){

var textBox = document.getElementById("ta");

var pre = textBox.value.substr(0, start);

var post = textBox.value.substr(end);

textBox.value = pre + document.getElementById("inputtext").value + post;

}

function savePos(textBox){

//如果是Firefox(1.5)的话,方法很简单

if(typeof(textBox.selectionStart) == "number"){

start = textBox.selectionStart;

end = textBox.selectionEnd;

}

//下面是IE(6.0)的方法,麻烦得很,还要计算上'\n'

else if(document.selection){

var range = document.selection.createRange();

if(range.parentElement().id == textBox.id){

// create a selection of the whole textarea

var range_all = document.body.createTextRange();

range_all.moveToElementText(textBox);

//两个range,一个是已经选择的text(range),一个是整个textarea(range_all)

//range_all.compareEndPoints()比较两个端点,如果range_all比range更往左(further to the left),则 //返回小于0的值,则range_all往右移一点,直到两个range的start相同。

// calculate selection start point by moving beginning of range_all to beginning of range

for (start=0; range_all.compareEndPoints("StartToStart", range) < 0; start++)

range_all.moveStart('character', 1);

// get number of line breaks from textarea start to selection start and add them to start

// 计算一下\n

for (var i = 0; i <= start; i ++){

if (textBox.value.charAt(i) == '\n')

start++;

}

// create a selection of the whole textarea

var range_all = document.body.createTextRange();

range_all.moveToElementText(textBox);

// calculate selection end point by moving beginning of range_all to end of range

for (end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; end ++)

range_all.moveStart('character', 1);

// get number of line breaks from textarea start to selection end and add them to end

for (var i = 0; i <= end; i ++){

if (textBox.value.charAt(i) == '\n')

end ++;

}

}

}

document.getElementById("start").value = start;

document.getElementById("end").value = end;

}

</script>

<form action="a.cgi">

<table border="1" cellspacing="0" cellpadding="0">

<tr>

<td>start: <input type="text" id="start" size="3"/></td>

<td>end: <input type="text" id="end" size="3"/></td>

</tr>

<tr>

<td colspan="2">

<textarea id="ta" onKeydown="savePos(this)"

onKeyup="savePos(this)"

onmousedown="savePos(this)"

onmouseup="savePos(this)"

onfocus="savePos(this)"

rows="14" cols="50"></textarea>

</td>

</tr>

<tr>

<td><input type="text" id="inputtext" /></td>

<td><input type="button" onClick="add()" value="Add Text"/></td>

</tr>

</table>

</form> 

select uid,username,title_template,title_data,feedid from uc_feeds as a
where feedid in(select max(feedid) from uc_feeds as b where a.uid=b.uid) order by feedid desc limit 10

这样就可以了

2012-1-30 17:56 Monday  

网上转的

今天遇到了一个Jquery提交数据量过大的时候后台获得的时候会截掉一部分,这个找了很久,在网上看到了这样的解释和方式:

采用Ajax传递数据时,通常会将数据整理为data="var1=abc&var2=def"。而当数据中存在加号(+)或是连接符(& amp; amp;)时,服务器端接收数据时会有部分数据丢失现象。分析一下Ajax传递数据的格式与Javascript的语法不难发现:

1. "+"号:JavaScript解析为字符串连接符,所以服务器端接收数据时"+"会丢失。

2. "&":JavaScript解析为变量连接符,所以服务器端接收数据时&符号以后的数据都会丢失。

解决办法也相当简单,只需要为+与&符号编码即可:

function vchar(str) {
str = str.replace(/\+/g, "%2B");
str = str.replace(/\&/g, "%26");
return str;
}
var1 = "abc+kef";
var2 = "abc&kef";
var1 = vchar(var1);
var2 = vchar(var2);
alert(var1);
alert(var2);
使用jquery的话可以使用如下方式提交

var params = $('input, textarea').serialize();
$.ajax({
type: 'post',
url: 'xxxx.php',
data: params,
success: function(response){
       ......
}
});
上面的这个方法我试过了,不是很好用,之后我想到了JSON的方式提交,结果可以实现,效果很好,但是用JSON提交的时候要注意到这样的一个问题,JSON提交的数据时经过编码的,所以在后台要进行解码,我的后台是java,所以我用了这样的方式:
$.ajax({
type: 'post',
url: 'xxxx.action',
data: {arr1:arr1,arr2:arr2},//arr1就是你传递到后台的参数,用request获得,
success: function(response){
       ......
}
});
下面是对中文数据进行解码的代码
/**
   * Ajax数据解码
   * @return
   */
public String decodeAjax(String str) {
   if (MUtil.checkString(str)) {
try {
return java.net.URLDecoder.decode(str, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
   }
   return null;
}

var val = $('#form1 input,#form1 textarea,#form1 select').serialize(),

post的时候,再直接 data:val,   就行了

这是编码问题,在utf-8页面下无问题, 只要在载入google时加入&oe=gb2312 就可以了
2012-1-30 17:54 Monday  

服务器是win2003+apache+php+mysql
前一段时间重装apache后,现在就不能使用curl模块了,
php.ini的配置是正确的。

百度一下,大家的解决方法都是复制 libeay32.dll 和 ssleay32.dll到/windows/system32/,有的甚至说要复制4个,再加上php5ts.php,php_curl.php我也做过,还是不行。

在csdn上提问后,在网友的提醒下,我查看了一下日志,提示php_curl.dll载入错误,

于是在修改php.ini里面的dll路径后,还是提示相同的错误

PHP Warning: PHP Startup: Unable to load dynamic library 'c:/php5/ext/php_curl.dll' - \xca\xd4\xcd\xbc\xb7\xc3\xce\xca\xce\xde\xd0\xa7\xb5\xc4\xb5\xd8\xd6\xb7\xa1\xa3\r\n in Unknown on line 0

我以为是路径的问题,结果发现不是。

在更深的百度之后,找到一个答案就是在apache的配置文件中载入libeay32.dll 和 ssleay32.dll

于是,在加了下面两段话之后

LoadFile "c:/php5/ssleay32.dll"
LoadFile "c:/php5/libeay32.dll"

问题解决~
2012-1-30 17:54 Monday  
如果是用的smarty,出现页面空白不报错的话,在$smarty->display("index.tpl");前输出正常的话,有可能是编译文件的问题,删除编译的文件就好了。