网盘程序的update

相信很多程序猿在设计产品表的时候,都相应设置了一个 view_number 字段
然后在每次用户打开产品的内容页的时候用 view_number=view_number+1 来更新产品表,语句是
UPDATE  products set view_number = view_number + 1 where product_id= 123456;
但是UPDATE 经常导致 select 语句的阻塞,从而SELECT 出现 wait for table lock,
那么我们怎么解决这样的锁表问题呢,用 LOW_PRIORITY 可以把 UPDATE 语句的优先级降低,从而不阻塞SELECT.

UPDATE  LOW_PRIORITY products set view_number = view_number + 1 where product_id= 123456;

QQ互联 client request’s parameters are invalid, invalid openid

Q互联官方Demo的callback页面在数据获取方面有问题。如果直接引用,就会出现以下问题:

“client request’s parameters are invalid, invalid openid”

【解决方法】
在 callback.php页面 请按顺序放置以下几行代码

  1. $qc = new QC();  
  2. $acs = $qc->qq_callback();  
  3. $oid = $qc->get_openid();  
  4. $qc = new QC($acs,$oid);  
  5. $uinfo = $qc->get_user_info();  

参考

 

http://blog.csdn.net/codeeer/article/details/17469411

cookie一例,验证码验证不通过

今天碰到一个奇怪案例,某程序的图形验证码始终验证为错
经过调试发现他的验证码生成程序在生成cookie时候,使用了  domain的概念,
而且测试地址是直接通过ip来测试的,导致domain部分成为了ip地址的后两位,
问题就清晰了,直接绑定域名,通过域名来测试程序就通过了。。。。

ecshop 按订单金额发放红包 发放存在多发的问题

http://bbs.ecshop.com/viewthread.php?tid=159368

原始问题如上,截屏如下

ecshop_bonus

 

解决问题是看  includes\lib_order.php 的函数 get_total_bonus

原来代码是如下的

/* 按订单发的红包 */
$sql = “SELECT FLOOR(‘$amount’ / min_amount) * type_money ” .
“FROM ” . $GLOBALS[‘ecs’]->table(‘bonus_type’) .
” WHERE send_type = ‘” . SEND_BY_ORDER . “‘ ” .
” AND send_start_date <= ‘$today’ ” .
“AND send_end_date >= ‘$today’ ” .
“AND min_amount > 0 “;

很显然,凡是比较最低订单金额大的订单,都会导致商的个数的红包,我们其实只要发的是最大的红包那个就可以了,所以我们修改如下

/* 按订单发的红包 */
$sql = “SELECT FLOOR(‘$amount’ / min_amount) * type_money ” .
“FROM ” . $GLOBALS[‘ecs’]->table(‘bonus_type’) .
” WHERE send_type = ‘” . SEND_BY_ORDER . “‘ ” .
” AND send_start_date <= ‘$today’ ” .
“AND send_end_date >= ‘$today’ ” .
“AND min_amount > 0 and min_amount <= ‘$amount’ order by min_amount desc limit 1 “; 注意上面这行的条件增加了
and min_amount <= ‘$amount’ order by min_amount desc limit 1
就是说最接近订单额度的红包发放条件,取一个即可

备忘一个shopex的密码加密记录方式

在shopex的4.8.5 的 core/model_v5/member/mdl.account.php

文件里面记录了shopex用户的密码是如何存储到数据库的,在

encrypt_passwd_enhanced 函数里面是这样写的

public function encrypt_passwd_enhanced( $pwd, $uname, $regtime )

{

if ( !$pwd || !$uname || !$regtime )

{

return false;

}

$pwd = md5( md5( trim( $pwd ) ).strtolower( $uname ).$regtime );

return “s”.substr( $pwd, 0, 31 );

}

下图中的红圈部分就是加密代码,那么如果在转移到ecshop 时候,因为ecshop只是做了md5(password) 的密码检查,显然登录会失败,那么再加一种这样的检查,就可以登录了,hoho。。。。shopex-userpassword

 

在ecshop 的  includes\modules\integrates\ecshop.php 的行 check_user 函数里面有

if ($row[‘password’] != $this->compile_password(array(‘password’=>$password,’ec_salt’=>$ec_salt)))

我们只需要再加一个

$pwd = md5( md5( trim( $pwd ) ).strtolower( $uname ).$regtime );

$shopex_pass =  “s”.substr( $pwd, 0, 31 );

判断改成这样

if ($row[‘password’] != $this->compile_password(array(‘password’=>$password,’ec_salt’=>$ec_salt)) || $row[‘password’] !=  $shopex_pass )

就可以了

 

 

apache 泛域名伪静态的一点备忘

匹配所有非 www bbs 开头的域名,可以匹配 111.domain.com aaa.domain.com

RewriteCond %{HTTP_HOST} ^(?!www|bbs)([^.]+).domainname.com [NC]
RewriteRule ^$   test.php?uid=%1 [QSA,L]
或者
RewriteCond %{HTTP_HOST} ^(.+)\.domainname.com$ [NC]
RewriteCond %1 !^(www|bbs)$ 
RewriteRule ^$   test.php?uid=%1 [QSA,L]

test.php 这样写

 
print_r($_GET);
 

wordpress 设置联系表单发送到邮件email 插件

我们在 http://blazdesign.com/5-free-wordpress-contact-form-plugins-to-consider/

测试下第一个 CONTACT FORM 7

下载地址 http://wordpress.org/plugins/contact-form-7/

下载后上传到 wp-contents/plugins/

照例后台plugins 激活(activate) 此插件

点击插件下的settings 功能

点击add new 添加一个新表单

wp-mail-contactform

 

添加后点击save , 得到 一个字符串 ,写到你的帖子(posts)里面就可以了

wp-mail-contactform2

wordpress 设置 smtp 的插件

从这里下载 wp-smtp 插件 http://wordpress.org/plugins/wp-mail-smtp/
解压后目录名 wp-mail-smtp 上传到 wordpress 网站的wp-contents/plugins/ 目录里面
设置方法是
1) 后台-》plugins -> 首先激活(activate) WP-Mail-SMTP
2)点击 plugins->WP-Mail-SMTP->settings
下图片中 1-7 为需要注意的地方
wp-mail-smtp

bat 批量封堵ip ,适用于win2003 windows2008

@echo off
rem "curl get ip.txt from remote"
rem curl\curl.exe -s -o d:\ip.txt http://x.x.x.x/ip.txt
netsh ipsec static set policy name="phpsir-deny-policy" assign=n
netsh ipsec static delete policy name="phpsir-deny-policy"
netsh ipsec static add policy name="phpsir-deny-policy" 

  
netsh ipsec static add filteraction name="phpsir-deny" action=block


for /f "tokens=*" %%a in (ip.txt) do call :processline %%a
netsh ipsec static set policy name="phpsir-deny-policy" assign=y
pause
goto :eof

:processline
echo line=%*
netsh ipsec static add filter filterlist=deny %* srcaddr=%* srcport=0 dstaddr=me dstport=0 protocol=0 mirrored=yes
netsh ipsec static add rule name=%* policy=phpsir-deny-policy filterlist=deny %* filteraction=phpsir-deny

goto :eof


:eof


mssql2005 bak文件恢复,无法登陆的修复

参考文件
http://nxdxt.blog.51cto.com/394/97996

抄录原文如下,以备查阅

使用sp_change_users_login排除孤立用户,所谓孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。
孤立帐户的产生一般是一下两种:
1.将备份的数据库在其它机器上还原;
2.重装系统或SQL SERVER之后只还原了用户库
解决方法是使用sp_change_users_login来修复。
sp_change_users_login的用法有三种
用法1:

exec sp_change_users_login 'REPORT'

列出当前数据库的孤立用户
用法2:

exec sp_change_users_login 'AUTO_FIX','用户名'

可以自动将用户名所对应的同名登录添加到syslogins中
用法3:

exec sp_change_users_login 'UPDATE_ONE','用户名','登录名'

将用户名映射为指定的登录名。
—————————————————————————————————————-
看看是否有用

SQL孤立用户解决方案

症状
当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。
本文介绍了如何解决孤立用户问题。
状态
Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中存在的问题。
更多信息
虽然术语“登录”和“用户”经常交换使用,但它们之间有很大的不同。登录用于用户身份验证,而数据库用户帐户用于数据库访问和权限验证。登录通过安全识别符 (SID) 与用户关联。访问 SQL Server 服务器需要登录。验证特定登录是否有效的过程称为“身份验证”。登录必须与 SQL Server 数据库用户相关联。您使用用户帐户控制数据库中执行的活动。如果数据库中不存在针对特定登录的用户帐户,使用该登录的用户即使能够连接到 SQL Server 服务器,也无法访问数据库。但是,该情形的唯一例外是当数据库包含“guest”用户帐户时。与用户帐户不关联的登录将被映射到 guest 用户。相反,如果存在数据库用户,但没有与其关联的登录,则该用户将无法登录到 SQL Server 服务器中。
将数据库恢复到其他服务器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户。这种情况被称为存在“孤立用户”。
孤立用户疑难解答
当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。以下情形说明了该问题并阐述如何加以解决。
1. 向主数据库添加一个登录,并将默认数据库指定为 Northwind: Use master go sp_addlogin ‘test’, ‘password’, ‘Northwind’
2. 向刚创建的用户授予访问权限: Use Northwind go sp_grantdbaccess ‘test’
3. 备份数据库。 BACKUP DATABASE Northwind
TO DISK = ‘C:MSSQLBACKUPNorthwind.bak’
4. 将数据库恢复到其他 SQL Server 服务器: RESTORE DATABASE Northwind
FROM DISK = ‘C:MSSQLBACKUPNorthwind.bak’

恢复的数据库包含名为“test”的用户,但没有相应的登录,这就导致“test”成为孤立用户。
5. 现在,为了检测孤立用户,请运行此代码: Use Northwind go sp_change_users_login ‘report’

输出中列出了所有登录,其中包含 Northwind 数据库的 sysusers 系统表和主数据库的 sysxlogins 系统表中不匹配的条目。
解决孤立用户问题的步骤
1. 为前一步中的孤立用户运行以下命令:
Use Northwind
go
sp_change_users_login ‘update_one’, ‘test’, ‘test’

这样,就将服务器登录“test”与 Northwind 数据库用户“test”重新连接起来。
sp_change_users_login 存储过程还可以使用“auto_fix”参数对所有孤立用户执行更新,但不推荐这样做,因为 SQL Server 会尝试按名称匹配登录和用户。大多数情况下这都是可行的;但是,如果用户与错误登录关联,该用户可能拥有错误的权限。
2. 在上一步中运行代码后,用户就可以访问数据库了。然后用户可以使用 sp_password 存储过程更改密码: Use master
go
sp_password NULL, ‘ok’, ‘test’

此存储过程不能用于 Microsoft Windows NT 安全帐户。通过 Windows NT 网络帐户连接到 SQL Server 服务器的用户是由 Windows NT 授权的;因此,这些用户只能在 Windows NT 中更改密码。
只有 sysadmin 角色的成员可以更改其他用户的登录密码。
—————————————————————————————————————-
SQL2005删除用户的时候,产生“数据库主体在该数据库中拥有架构,无法删除”的解决办法
–执行如下SQL语句
ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
–然后手动删除就可以了。

—————————————————————————————————————-
[导入]sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象”的解决方法
sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数据库属性”对话框的“文件”页或 ALTER AUTHORIZATION 语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象。

解决方法如下:
1、设置兼容级别为90(2005为90)
USE [master]
GO
EXEC dbo.sp_dbcmptlevel @dbname=’数据库名’, @new_cmptlevel=90
GO
或是选责你还原的数据库,点右键,选属性->选项->兼容级别,选择sqlserver2005(90) 然后确定,
这时,你在该数据库下展开“数据库关系图”节点时会有个提示,”此数据库缺少一个或多个使用数据库关系图所需的支持对象,是否创建”,选择“是”即可。
2、通过以上的方法操作,如果问题依然存在的话,按下列方法继续
选择你的数据库,然后选择”安全性”->”用户”,选择dbo,打开属性页,如登录名为空的话,新建查询,然后
use [你的数据库名]
EXEC sp_changedbowner ‘sa’
执行成功后,你再选择”数据库关系图”节点,时提示 “此数据库缺少一个或多个使用数据库关系图所需的支持对象,是否创建”,选择“是”即可。 就可以看到原先建的关系图了。

—————————————————————————————————————-

从服务器上作导入导出至本地机上,数据库中的表都在,可是表名前段的架构身份不是“dbo”了,而是服务器上数据库的“库名”。这样架构身份不同了,程序运行就出问题了。试过单个修改表,在sql2005的属性窗口可以更改架构者,可是N多表哪儿能手动改得过来呀!还请高手指点批量更改的方法。在此谢过。
SQL Server2005可以使用系统存储过程sp_changeobjectowner更改数据库对象的所有者。

sp_changeobjectowner ‘对象名(包括架构名)’,’新架构名’

批量修改请用:

方法一:使用游标

declare @name sysname
declare csr1 cursor
for
select TABLE_NAME from INFORMATION_SCHEMA.TABLES
open csr1

FETCH NEXT FROM csr1 INTO @name
while (@@FETCH_STATUS=0)
BEGIN
SET @name=’原架构名.’+@name
EXEC SP_ChangeObjectOwner @name, ‘新架构名’
fetch next from csr1 into @name
END
CLOSE csr1
DEALLOCATE csr1

方法二:使用系统存储过程sp_MSforeachtable
EXEC sp_MSforeachtable @command1=”EXEC SP_ChangeObjectOwner ‘?’,’新架构名'”
—————————————————————————————————————-
在sql server 2005数据库中更改数据架构
在数据库testDB中存在架构A及用户A,现将testDB数据库所属的用户由A改为B,同时删除用户A;架构也由A改为B,删除架构A,操作如下:
1、创建用户B,再创建架构B;
2、将架构A的权限赋给用户B,取消用户A拥有架构A的权限,删除用户A;
3、将数据库的所有属于架构A的对象改为架构B,代码如下:
ALTER SCHEMA [新架构名] TRANSFER 旧架构名.[数据库中的对象表或视图或存储过程]
ALTER SCHEMA [B] TRANSFER A.[对象1]
ALTER SCHEMA [B] TRANSFER A.[对象2]
ALTER SCHEMA [B] TRANSFER A.[对象n]

wdcp 的迁移

新老机器都安装的wdcp 管理,

把新机器的wdcp 关闭
/etc/init.d/wdapache stop
/etc/init.d/httpd stop
/etc/init.d/nginx stop
/etc/init.d/mysqld stop

然后
mv /www/wdlinux /www/wdlinux-back
mv /www/web /www/web-back

然后把老站的 /www/wdlinux 和 /www/web 弄个过来
方法一般是 rsync

程序启动测试

etc/init.d/wdapache start
/etc/init.d/httpd start
/etc/init.d/nginx start
/etc/init.d/mysqld start

CentOS 下 PHP 从 5.1.x升级到5.2.x

rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka 

# vi /etc/yum.repos.d/CentOS-Base.repo 增加下面信息

[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

执行命令,自动升级。

yum update php -y
yum install libmcrypt -y

dedecms 的cn_substr_utf8的商榷

在dedecms里面 cn_substr_utf8 函数是这样的

/**
 *  utf-8中文截取,单字节截取模式
 *
 * @access    public
 * @param     string  $str  需要截取的字符串
 * @param     int  $slen  截取的长度
 * @param     int  $startdd  开始标记处
 * @return    string
 */
if ( ! function_exists('cn_substr_utf8'))
{
    function cn_substr_utf8($str, $length, $start=0)
    {
        if(strlen($str) < $start+1)
        {
            return '';
        }
        preg_match_all("/./su", $str, $ar);
        $str = '';
        $tstr = '';

        //为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
        for($i=0; isset($ar[0][$i]); $i++)
        {
            if(strlen($tstr) < $start)
            {
                $tstr .= $ar[0][$i];
            }
            else
            {
                if(strlen($str) < $length + strlen($ar[0][$i]) )
                {
                    $str .= $ar[0][$i];
                }
                else
                {
                    break;
                }
            }
        }
        return $str;
    }
}

其中

if(strlen($str) < $length + strlen($ar[0][$i]) )

一行可能会造成截取后多了一个字符,可以考虑改为

if(strlen($str) < $length + strlen($ar[0][$i]) -1 )

测试代码如下

 
$f = "你好fasdfa你fasdf#e#";
$pos = strpos($f,'#e#');
var_dump($pos);
var_dump(cn_substr_utf8($f,$pos));
var_dump(cn_substr_utf82($f,$pos));

function cn_substr($str, $slen, $startdd=0)
{
	global $cfg_soft_lang;
	if($cfg_soft_lang=='utf-8')
	{
		return cn_substr_utf8($str, $slen, $startdd);
	}
	$restr = '';
	$c = '';
	$str_len = strlen($str);
	if($str_len < $startdd+1)
	{
		return '';
	}
	if($str_len < $startdd + $slen || $slen==0)
	{
		$slen = $str_len - $startdd;
	}
	$enddd = $startdd + $slen - 1;
	for($i=0;$i<$str_len;$i++) 	{ 		if($startdd==0) 		{ 			$restr .= $c; 		} 		else if($i > $startdd)
		{
			$restr .= $c;
		}

		if(ord($str[$i])>0x80)
		{
			if($str_len>$i+1)
			{
				$c = $str[$i].$str[$i+1];
			}
			$i++;
		}
		else
		{
			$c = $str[$i];
		}

		if($i >= $enddd)
		{
			if(strlen($restr)+strlen($c)>$slen)
			{
				break;
			}
			else
			{
				$restr .= $c;
				break;
			}
		}
	}
	return $restr;
}

function cn_substr_utf8($str, $length, $start=0)
{
	if(strlen($str) < $start+1)
	{
		return '';
	}
	preg_match_all("/./su", $str, $ar);

	$str = '';
	$tstr = '';

	//为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
	for($i=0; isset($ar[0][$i]); $i++)
	{
		if(strlen($tstr) < $start)
		{

			$tstr .= $ar[0][$i];
		}
		else
		{

			if(strlen($str) < $length + strlen($ar[0][$i])  )
			{

				$str .= $ar[0][$i];
			}
			else
			{

				break;
			}
		}
	}
	return $str;
}

function cn_substr_utf82($str, $length, $start=0)
{
	if(strlen($str) < $start+1)
	{
		return '';
	}
	preg_match_all("/./su", $str, $ar);

	$str = '';
	$tstr = '';

	//为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
	for($i=0; isset($ar[0][$i]); $i++)
	{
		if(strlen($tstr) < $start)
		{

			$tstr .= $ar[0][$i];
		}
		else
		{

			if(strlen($str) < $length + strlen($ar[0][$i]) -1 ) // phpsir 加了 -1 
			{

				$str .= $ar[0][$i];
			}
			else
			{

				break;
			}
		}
	}
	return $str;
}

dedecms 分页标题提取方法

提取每个分页标题到模版里面

修改includes\arc.archives.class.php 的 GetPageTitlesST函数

pagetitle3

模版里面调用方法

首先保存 文章标题

{dede:field.title runphp=’yes’}$GLOBALS[“phpsir”]=@me;@me=””;{/dede:field.title}

调用方法是 pagetitle  style=’biaoti’ , 同时把原来文章标题附着在后面…..

{dede:pagetitle style=’biaoti’ runphp=”yes”}if(@me==” ) {@me = $GLOBALS[“phpsir”]; }else { @me = @me . “_” . $GLOBALS[“phpsir”]  ;} {/dede:pagetitle}

发布文章时候的格式是如下的

pagetitle2

 

参考网上文章为

http://www.veryhuo.com/a/view/6753.html

 

帝国备份王的用法变通-关于恢复

对于要备份很多表的用户来说,可以一次备份然后多次部分恢复数据库

方法是修改 备份文件夹里面 config.php 的 $b_table变量

$b_table 变量是一个很长的字符串,如果你备份的表多的话。把他分成几个部分

$b_table = “a,b,c,d,e,f,g,h”;

可以修改为

$b_table = “a,b”;

$b_table = “c,d,e”;

$b_table = “f,g”;

$b_table = “h”;

通过利用注释,来分别导入这部分的表格,从而达到避免出现 502 503 等问题!!!

 

winmail可接收邮件,不能发送邮件的问题解决

winmail 可以接受外部系统发来的邮件,说明邮件系统的pop3正常,本地发送给本地的也正常,但是无法发送到外部系统,比如gmail,QQ邮件,163邮箱,经过检查 ,检查方式是 telnet mx1.qq.com 25 ,发现无法连接到外部的smtp 25端口,排查本机并无防火墙,从而推论出idc可能在网络做了限制,联系idc后,开了25端口,然后再检查telnet 就可以正常看到220 连接信息,邮件外发也正常了。

telnetmxqqcom

nginx 支持PATH_INFO 的配置文件

如果下面的配置不对,请参考 thinkphp-pathinfo-nginx.html

 location ~ \.php {
        fastcgi_pass   127.0.0.1:9000;
        set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {                     
        set $real_script_name $1;
        set $path_info $2;
        }
        fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param PATH_INFO $path_info;

        fastcgi_param GATEWAY_INTERFACE CGI/1.1;
        fastcgi_param SERVER_SOFTWARE nginx;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param REQUEST_URI $request_uri;
        fastcgi_param DOCUMENT_URI $document_uri;
        fastcgi_param DOCUMENT_ROOT $document_root;
        fastcgi_param SERVER_PROTOCOL $server_protocol;
        fastcgi_param REMOTE_ADDR $remote_addr;
        fastcgi_param REMOTE_PORT $remote_port;
        fastcgi_param SERVER_ADDR $server_addr;
        fastcgi_param SERVER_PORT $server_port;
        fastcgi_param SERVER_NAME $server_name;
        # PHP only, required if PHP was built with --enable-force-cgi-redirect
        #fastcgi_param REDIRECT_STATUS 200;
    }

discuz X3 游客无法浏览帖子,显示帖子不存在

今天一个朋友的discuzX3 的帖子在游客状态无法打开,后台权限都给过了,所以不存在权限问题,

显示帖子不存在,经处理后解决,思路如下
地址是 thread-NNNN-1-1.html
NNNN 一般是帖子的tid , 根据显示的关键字 “没有找到帖子” 查到 post_not_found 的语言项目,在 fetch_all_by_tid_range_position 函数里面想可能是某个tid的帖子没有找到,
在那个函数里面,居然发现 $end 变量也是1,而最终追溯到 $_G[‘ppp’] 这个值是NULL,
那么问题就好处理了 设置$_G[‘ppp’] = 10 ; 解决
如果你碰到这个问题,解决不了,可以QQ 733905