ecshop中ajax.call使用

ajax.call封装在js目录下transport.js这个文件.里面

<script type=”text/javascript”>// <![CDATA[
function colour_label(val,id)
{
   Ajax.call(“goods.php?act=img_label”, “label=” val “&#038;&id=” id, addresscolour_label , “POST”, “JSON”,false);
}

ajax.call后面的参数分别是(请求的URL地址,发送参数,回调函数,请求的方式,有”GET”和”POST”两种,响应类型,有”JSON”、”XML”和”TEXT”三种,是否异步请求的方式,是否安静模式请求)

function addresscolour_label(result)
{
    if(result == “true”)
    {

        alert(result.label);
        for (var one in result.colour_label)
        {
             laert(result.colour_label[one].img_id);
        }
    }
}

的result参数就是goods.php?act=img_label这里输出响应结果.下面是结果

{
“label”:”\u9ed1\u8272″,
“colour_label”:
  [
    {
       “img_id”        : “1012”,
       “img_url”       : “images\/201309\/goods_img\/439_P_1380475365329.jpg”,
       “thumb_url”     : “images\/201309\/thumb_img\/439_thumb_P_1380475365276.jpg”,
       “img_desc”      : “\u68d5\u8272”,
       “goods_id”      : “439”,
       “goods_attr_id” : “2435”
     },
     {
       “img_id”        : “1006”,
       “img_url”       : “images\/201309\/goods_img\/439_P_1380475364611.jpg”,
       “thumb_url”     : “images\/201309\/thumb_img\/439_thumb_P_1380475364120.jpg”,
       “img_desc”      : “\u767d\u8272”,
       “goods_id”      : “439”,
       “goods_attr_id” : “2457”
     },
     {
       “img_id”        : “1009”,
       “img_url”       : “images\/201309\/goods_img\/439_P_1380475365389.jpg”,
       “thumb_url”     : “images\/201309\/thumb_img\/439_thumb_P_1380475365508.jpg”,
       “img_desc”      : “\u9ed1\u8272”,
       “goods_id”      : “439”,
       “goods_attr_id” : “2434”
     }
  ],
“attr_price”:12
}
<script>

php 文件
if($_REQUEST[“act”] == “img_label”)
{
    include_once(“includes/cls_json.php”);
    $json      =   new JSON;

    $label     =   $_REQUEST[“label”];
    $goods_id  =   $_REQUEST[“id”];

    $result[“label”] = $label;
    $sql = “SELECT a.img_id, a.img_url, a.thumb_url, a.img_desc, a.goods_id, b.goods_attr_id” .
           ” FROM ” . $GLOBALS[“ecs”]->table(“goods_gallery”) .” as a “.
    ” left join  “. $GLOBALS[“ecs”]->table(“goods_attr”) .” as b on(a.goods_id = b.goods_id and a.img_desc= b.attr_value ) “.
           ” WHERE a.goods_id = “$goods_id” and a.img_label = “1” group by a.img_desc asc “;
    $result[“colour_label”] = $GLOBALS[“db”]->getAll($sql);

    die($json->encode($result));
}
// ]]></script>

PHP下对数组进行排序的函数

PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们一起学习该排序中几个重要的几个函数。
简单排序
 <?php 
 $data = array(5,8,1,7,2); 
 sort($data); 
 print_r($data); 
 ?> 
输出结果
Array ([0] => 1 
[1] => 2 
[2] => 5 
[3] => 7 
[4] => 8 

也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。
 <?php $data = array(5,8,1,7,2);rsort($data); print_r($data); 
 ?>  
它的输出结果如下:
Array ([0] => 8 
[1] => 7 
[2] => 5 
[3] => 2 
[4] => 1 

根据关键字排序 
当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。Ksort()函数就是根据关键字进行排序的函数,同时,它在排序的过程中会保持关键字的相关性。
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);ksort($data); print_r($data); 
?> 
输出结果如下: 
Array ([DE] => Germany 
[ES] => Spain 
[IN] => India 
[US] => United States 

Krsort()函数是根据关键字对数组进行倒排。
输出结果如下:
Array ([US] => United States 
[IN] => India 
[ES] => Spain 
[DE] => Germany 

根据值排序 
如果你想使用值排序来取代关键字排序的话,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了。
Array ([US] => United States 
[ES] => Spain 
[IN] => India 
[DE] => Germany 

自然语言排序 
PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子。
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″); sort($data);print_r($data); 
natsort($data); print_r($data);?> 
Array ([0] => book-1 
[1] => book-10 
[2] => book-100 
[3] => book-5 

Array 

[0] => book-1 
[3] => book-5 
[1] => book-10 
[2] => book-100 

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。 
自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了。
Array ([0] => book-100 
[1] => book-10 
[2] => book-5 
[3] => book-1 

根据用户自定义的规则排序 
PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。 
Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面: 
<?php $data = array(“joe@host.com”, “john.doe@gh.co.uk”, “asmithsonian@us.info”, “jay@zoo.tw”);usort($data, ‘sortByLen”); 
print_r($data); function sortByLen($a, $b) { 
if (strlen($a) == strlen($b)) { 
return 0; 
} else { 
return (strlen($a) > strlen($b)) ? 1 : -1; 


?> 
这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:
Array ([0] => jay@zoo.tw 
[1] => joe@host.com 
[2] => john.doe@gh.co.uk 
[3] => asmithsonian@us.info 

多维排序 
最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的。
<?php $data = array(array(“id” => 1, “name” => “Boney M”, “rating” => 3), 
array(“id” => 2, “name” => “Take That”, “rating” => 1), 
array(“id” => 3, “name” => “The Killers”, “rating” => 4), 
array(“id” => 4, “name” => “Lusain”, “rating” => 3), 
); foreach ($data as $key => $value) { 
$name[$key] = $value[“name”]; 
$rating[$key] = $value[“rating”]; 

array_multisort($rating, $name, $data); print_r($data);?> 
这里,我们在$data数组中模拟了一个行和列数组。然后,我使用array_multisort()函数对数据集合进行重排,首先是根据rating进行排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下: 
Array ([0] => Array 

[id] => 2 
[name] => Take That 
[rating] => 1 
) [1] => Array 

[id] => 1 
[name] => Boney M 
[rating] => 3 

[2] => Array 

[id] => 4 
[name] => Lusain 
[rating] => 3 

[3] => Array 

[id] => 3 
[name] => The Killers 
[rating] => 4 

)  
array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。 
这些例子应该让你对PHP中各种数组排序函数的使用有了初步的了解,也向你展示了一些隐藏在PHP数组处理工具包的内部功能。

新浪微博开发平台之网站接入微博群发

什么是新浪微博开放平台
         新浪微博开放平台(Weibo Open Platform)是基于新浪微博海量用户和强大的传播能力,接入第三方合作伙伴服务,向用户提供丰富应用和完善服务的开放平台。将你的服务接入微博平台,有助于推广产品,增加网站/应用的流量、拓展新用户,获得收益。
让你的应用在新浪微博开放平台上运营,只需要通过简单的六个步骤:

成为开发者
1.创建微博帐号
在开发者页面点击“登录”或者“创建应用”,通过帐号登录成为一名开发者。一个新浪微博帐号可以管理10个不同的应用,建议开发人员使用官方微博的帐号,以便统一管理。
2.选择应用类型
点击“创建应用”,即进入目标应用的类型选择环节。请根据应用类型的提示,选择相应的应用创建流程。
3.开发者信息设置
请在开发者信息设置页填写真实资料。成为新浪微博认证的开发者,你需要通过邮箱验证和手机验证。我们会给你填写的邮箱和手机号发送验证信息,请根据提示验证你的身份。
请注意:开发者类型一经填写,不可修改。个人开发者不可接入微博支付业务,请谨慎选择。
创建应用
         在“管理中心”可查看应用信息。App Key是应用唯一的识别标志,新浪微博开放平台通过App Key鉴别应用的身份。App Secret是给应用分配的密钥,你需要妥善保存这个密钥,从而保证应用来源的的可靠性,防止被伪造。你可通过这两个数据进行相关的技术开发工作。
以上完成后就可以开发测试了

config文件是配置文件
<?php
header(“Content-Type: text/html; charset=UTF-8”);
define( “WB_AKEY” , XXXXXXXX);
define( “WB_SKEY” , XXXXXXXXXXXXXXXXXXXXXX);
define( “WB_CALLBACK_URL” , “http://www.XXXXX.com/callback.php” );
conn.php文件是链接数据库
<?php
$conn=mysql_connect(“localhost”,”root”,””)or die(“连接失败:”.mysql_error());//连接MYSQL
mysql_select_db(“send”,$conn) or die(“数据库不存在”.mysql_error());//选择库
mysql_query(“SET NAMES “Utf8″”,$conn);//设置字符集
date_default_timezone_set(“PRC”);//设置时区

index.php文件就是登录入口
callback.php文件是授权文件
saetv2.ex.class.php文件是封装好类文件
群发时代码改成这样
function __construct( $akey, $skey, $access_token, $refresh_token = NULL)
 {
  $conn=mysql_connect(“localhost”,”root”,””)or die(“连接失败:”.mysql_error());//连接MYSQL
  mysql_select_db(“send”,$conn) or die(“数据库不存在”.mysql_error());//选择库
  mysql_query(“SET NAMES “Utf8″”,$conn);//设置字符集
  date_default_timezone_set(“PRC”);//设置时区
  $sql=”select AccessToken from token order by ID desc”;
  $res=mysql_query($sql,$conn);
  $i=1;
  while($row=mysql_fetch_array($res))
  {
  $this->$i = new SaeTOAuthV2( $akey, $skey, $row[“AccessToken”], $refresh_token );
  $i ;
  }
  $this->oauth = new SaeTOAuthV2( $akey, $skey, $access_token, $refresh_token );
 }
哪里需要改哪里!

weibolist.php文件就是我们要编写的了.

<?php
session_start();
include_once( “config.php” );
include_once( “saetv2.ex.class.php” );
include_once( “conn.php” );
$c = new SaeTClientV2( WB_AKEY , WB_SKEY , $_SESSION[“token”][“access_token”] );
$ms  = $c->home_timeline(); // done
$uid_get = $c->get_uid();
$uid = $uid_get[“uid”];
$user_message = $c->show_user_by_id( $uid);//根据ID获取用户等基本信息
 $t = $_SESSION[“token”][“access_token”];    access_token
 $m = $_SESSION[“token”][“expires_in”];         access_token存在时间(单位/秒)
 $name = $user_message[“screen_name”];    微博的名字
 $timer = date(“Y-m-d H:i:s”);
 $sql=”select * from token where `Name` = “$name””;
 $res=mysql_query($sql,$conn);
 if(!$row=mysql_fetch_row($res))
 {
        $sql=”insert into token (Name,AccessToken,expires,timer) values (“$name”,”$t”,”$m”,”$timer”)”;
        mysql_query($sql,$conn);
 }
 else
 {
       $t1 = time(date(“Y-m-d H-i-s”));
       $st= strtotime($row[“4”]);
       if($st $row[“3”] <= $t1)
        {
        $sql=”update token set `AccessToken` =”$t”,`expires` = “$m”,`timer` = “$timer” where `ID` = “$row[0]””;
        mysql_query($sql,$conn);
         }
 }
?>

本次发微博与access_token到期的提示代码

<?php
echo “<h2>本次发微博人</h2>”;
$t = time(date(“Y-m-d H-i-s”));
 $sql=”select * from token”;
 $res=mysql_query($sql,$conn);
 $ii=1;
 while($row=mysql_fetch_array($res))
 {
 $st= strtotime($row[“timer”]);
 if($st $row[“expires”] > $t)
 {
 echo $ii.”、 ”.$row[“Name”].”</br>”;
 $ii ;
 }
 } 
 $sql=”select * from token”;
 $res=mysql_query($sql,$conn);
 $i1=1;
 while($row=mysql_fetch_array($res))
 {
 $st= strtotime($row[“timer”]);
 if($st $row[“expires”] <= $t)
 {
 if($i1==1){
 echo “<h2>授权过期</h2>”;
 }
 echo $i1.”、 ”.$row[“Name”].” 授权时间已到,请重新授权!</br></br>”;
 $i1 ;
 }
 } 
?>

发送新微博
<h2 align=”left”>发送新微博</h2>
 <form action=”weibolist.php” enctype=”multipart/form-data” method=”post”>
  <p>微博内容:
  <textarea name=”text” id=”text” cols=”45″ rows=”5″></textarea></p></br>
  <p>微博图片:
  <input name=”thumbnail” type=”file” id=”thumbnail” style=”width:200px” onMouseOut=”file()”/></p></br>
  <input name=”picpath” id=”picpath” type=”hidden” value=”” />
  <input name=”submit” type=”submit” value=”发送到微博” />
 </form>
<?php
  ini_set(“max_execution_time”, “100”);
         if(!empty($_REQUEST[“picpath”])){
   define(“ROOT_PATH”,$_SERVER[“DOCUMENT_ROOT”].”/”);
   define(“ROOT_UPLOAD”,ROOT_PATH.”upload/”);
   $filename=$_FILES[“thumbnail”][“name”];
   $filetype=$_FILES[“thumbnail”][“type”];
   $filesize=$_FILES[“thumbnail”][“size”];
   $filetmpname=$_FILES[“thumbnail”][“tmp_name”];
   if(($filetype==”image/pjpeg” || $filetype==”image/jpeg” || $filetype==”image/gif”) )
   {
    
    move_uploaded_file($filetmpname,ROOT_UPLOAD.$filename);
    $str=explode(“.”,$filename);  
    $num=count($str)-1;
    $round=rand();
    rename(ROOT_UPLOAD.$filename,ROOT_UPLOAD.time().$round.”.”.$str[$num]);
    $filepath=ROOT_PATH.”upload/”.time().$round.”.”.$str[$num];
    $ww = strtr($filepath,”/”,”\\”);
   }
 }

if( !empty($_REQUEST[“text”])) {
 if(!empty($_REQUEST[“picpath”])) {
 $ret = $c->upload( $_REQUEST[“text”], $ww); //发送微博图片
 }else{
 $ret = $c->update( $_REQUEST[“text”]); //发送微博
 }
 if ( isset($ret[“error_code”]) && $ret[“error_code”] > 0 ) {
 
  echo “<p>发送失败,错误:{$ret[“error_code”]}:{$ret[“error”]}</p>”;
 } else {
  echo “<p>发送成功</p>”;
 }
}
?>

function file(){
  var msg=document.getElementById(“thumbnail”).value;
  //alert(msg);
  document.getElementById(“picpath”).value=msg;
 }

 

实现QQ登录ecshop

你是否也经常看到有些网站上有QQ登录、分享到QQ空间、关注等组件,这些都是腾讯推出的开放平台应用。腾讯开放平台包括两部分,一个是QQ互联开放平台,另一个是微博开放平台。这些开放平台应用对草根来说可是巨大福利,因为它可能给网站带来不可预想的回访机会,IP嗖嗖就上来了。

在这里我就简单说一下QQ互联网站介入。

QQ互联开放平台为第三方网站提供了丰富的API。第三方网站接入QQ互联开放平台后,即可通过调用平台提供的API实现用户使用QQ账号登录网站功能,且可以获取到腾讯QQ用户的相关信息。

一. 开发者注册

1. 在QQ互联开放平台首页 http://connect.qq.com/ ,点击右上角的“登录”按钮,使用QQ账号登录

2. 登录成功后会跳转到开发者注册页面,在注册页面需要提交公司或个人的基本资料

二. 网站接入申请

1.网站接入前,需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权。

开发者注册成功后,会跳转到“管理中心”页面。点击创建应用,填写相应的信息,如下图所示:

应用信息填写完成,点击“创建应用”后,应用注册完成,进入管理中心,在管理中心可以查看到网站获取的appid和appkey,如下图所示:

在管理中心,点击申请的网站下的“编辑信息”,进入编辑页面,点击右上角的“编辑”按钮,页面进入编辑状态,即可对网站信息进行修改和完善,如下图所示:

现在就可以开发了网站了。
以下代码就是实现qq登录ecshop的代码
php文件(ecshop根目录下)
<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
include_once(dirname(__FILE__) . “/includes/lib_base.php”);
include_once(ROOT_PATH . “includes/lib_transaction.php”);
include_once(ROOT_PATH . “includes/lib_passport.php”);
//应用的APPID
$app_id = “xxxxxxx”;
//应用的APPKEY
$app_secret = “xxxxxxxxxxxxxxxxxxxxxxxxxx”;
//成功授权后的回调地址
$my_url = “http://www.XXXXXX.com/qq.php“;
/*第一步*/
$code = $_REQUEST[“code”];
if(empty($code))
{
   $_SESSION[“state”] = md5(uniqid(rand(), TRUE));   
   $dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);
}
/*第二部*/
if($_REQUEST[“state”] == $_SESSION[“state”])
{
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&client_secret=”.$app_secret.”&code=”.$code;
         $response = file_get_contents($token_url);
         if (strpos($response, “callback”) !== false)
         {
                   $lpos = strpos($response, “(“);
                   $rpos = strrpos($response, “)”);
                   $response  = substr($response, $lpos 1, $rpos – $lpos -1);
                   $msg = json_decode($response);
                   if (isset($msg->error))
                   {
                              echo “<h3>error:</h3>” . $msg->error;
                              echo “<h3>msg  :</h3>” . $msg->error_description;
                              exit;
                     }
             }
         /*第三步*/
        $params = array();
        parse_str($response, $params);
        $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
        $str  = file_get_contents($graph_url);
        if (strpos($str, “callback”) !== false)
        {
                 $lpos = strpos($str, “(“);
                 $rpos = strrpos($str, “)”);
                 $str  = substr($str, $lpos 1, $rpos – $lpos -1);
         }
        $user_info = json_decode($str);
         if (isset($user_info->error))
         {
                  echo “<h3>error:</h3>” . $user_info->error;
                  echo “<h3>msg  :</h3>” . $user_info->error_description;
                  exit;
           }

           /*第四部 数据处理*/
          $openid = “qq-” . $user_info->openid;
          $sql = “SELECT user_id, user_name, password, email FROM ” . $GLOBALS[“ecs”]->table(“users”) . ” WHERE openid=”$openid” LIMIT 1″;
           $row = $GLOBALS[“db”]->getRow($sql);
           $_SESSION[“fromqq”] = “”;
           if (!empty($row))
          {
                 //openid存在
                 $user->set_session($row[“user_name”]);
                 $user->set_cookie($row[“user_name”]);
                 if(!empty($row[“email”]))
                  {
                        //邮箱存在
                       header(“Location: index.html\n”); 
                   }
                   else
                   {
                            $_SESSION[“fromqq”] = “fromqq”;
                            //邮箱不存在
                             header(“Location: regbind.php\n”);
                    }
              }
             else
              {
                      $_SESSION[“fromqq”] = “fromqq”;
                       //openid不存在
                      $user_name = time() . “-” . $user_info->openid;
                      $reg_date  = time();
                      $password  = md5(time());
                      $ip = real_ip();
                      $GLOBALS[“db”]->query(“INSERT INTO ” . $GLOBALS[“ecs”]->table(“users”) . “(`user_name`, `password`, `reg_time`, `last_login`,`last_ip`, `openid`) VALUES (“$user_name”, “$password”, “$reg_date”, “$reg_date”,”$ip”, “$openid”)”); 
                      $user->set_session($user_name);
                      $user->set_cookie($user_name); 
                     header(“Location: regbind.php\n”); 
             }
}
else
{
    echo(“The state does not match. You may be a victim of CSRF.”);
}

regbind文件(ecshop根目录下)
<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
/* 载入语言文件 */
require_once(ROOT_PATH . “languages/” .$_CFG[“lang”]. “/regbind.php”);
if($_SESSION[“user_name”] && $_SESSION[“fromqq”] == “fromqq”)
{
       if($_POST[“username”])
       {
                 $username = isset($_POST[“username”]) ? trim($_POST[“username”]) : “”;
                 $email = isset($_POST[“email”]) ? trim($_POST[“email”]) : “”;
                 $pwd = isset($_POST[“password”]) ? trim(md5($_POST[“password”])) : “”;
                 $sql = “UPDATE ” . $ecs->table(“users”) . ” SET `email`=”$email”, `user_name`=”$username”,`password`=”$pwd”  WHERE `user_name`=”” . $_SESSION[“user_name”] . “””;
                $db->query($sql);
                $_SESSION[“fromqq”] == “”;
                $user->set_session($username);
                $user->set_cookie($username);
                header(“Location: index.html\n”);
       }
}
else
{
         header(“Location: index.html\n”);
}
$smarty->assign(“lang”, $_LANG);
$smarty->display(“regbind.dwt”);

qq登录ecshop,系统最新接口OAuth2.0代码分析

    qq登录需要分为五个步骤:

     在这说的这五部主要是获取信息的步骤,至于咋样去申请qq的AIP那就不介绍了。

     第一步:获取access_token

        QQ登录OAuth2.0提供了两种获取access_token的方法,分别是:server-side模式和client-side模式。腾讯建议使用的是server-side模式。

下面是第一步获取access_token的代码,其中state是为了防止CSRF攻击的一个必须填写值,至于填写什么那就看个人爱好了。                                                                             
$dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($back_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);

    第二部:根据access_token获得对应用户身份的openid
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($back_url).”&client_secret=”.$app_secret.”&code=”.$code;
    $response = file_get_contents($token_url);

    第三部:根据access_token与openid调用OpenAPI                                         
   $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
    $str  = file_get_contents($graph_url);

  第四部:根据获取信息等到用户的信息
      $info = “https://graph.qq.com/user/get_user_info?access_token=”.$params[“access_token”].”&oauth_consumer_key=100346418&openid=”.$user->openid.”&format=json “;

    得到的用户信息是一个json需要转换,至于咋样转json在这里就不做介绍,我在下一个步骤会直接用ecshop的方法来解决。

  第五步:数据的处理与整合                                                                                                在这一步 大家就可以各抒己见了,可以整合ecshop也可以整合其他的系统。               
require(ROOT_PATH . “includes/cls_json.php”);
    $json   = new JSON;
    $user_info  = $json->decode(get_contents($info));
    $_SESSION[“oauth_token”] = $params[“access_token”];
    $_SESSION[“openid”] = $user->openid;
    $username=$user_info->nickname;
    $password=time();//随便弄个密码
    $email=$_SESSION[“openid”].”@qq.com”;//没有返回邮箱
    $back_act =”user.php”;

   我的关于QQ登录ecshop OAuth2.0的接口就已经大概的介绍完了,下面我把代码贴出供大家研究,

qq.php

<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
include_once(ROOT_PATH . “includes/lib_transaction.php”);
include_once(ROOT_PATH . “includes/lib_passport.php”);
//应用的APPID
$app_id = “申请的APPID”;
//应用的APPKEY
$app_secret = “申请的APPKEY”;
//成功授权后的回调地址
$my_url = “回调地址,我这以网址加/qq.php”;
/*第一步*/
$code = $_REQUEST[“code”];
if(empty($code))
{
   $_SESSION[“state”] = md5(uniqid(rand(), TRUE));    
   $dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);
}
/*第二部*/
if($_REQUEST[“state”] == $_SESSION[“state”])
{
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&client_secret=”.$app_secret.”&code=”.$code;
    $response = file_get_contents($token_url);
    if (strpos($response, “callback”) !== false)
    {
        $lpos = strpos($response, “(“);
        $rpos = strrpos($response, “)”);
        $response  = substr($response, $lpos 1, $rpos – $lpos -1);
        $msg = json_decode($response);
        if (isset($msg->error))
        {
            echo “<h3>error:</h3>” . $msg->error;
            echo “<h3>msg  :</h3>” . $msg->error_description;
            exit;
        }
    }
    /*第三步*/
    $params = array();
    parse_str($response, $params);
    $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
    $str  = file_get_contents($graph_url);
    if (strpos($str, “callback”) !== false)
    {
        $lpos = strpos($str, “(“);
        $rpos = strrpos($str, “)”);
        $str  = substr($str, $lpos 1, $rpos – $lpos -1);
    }
    $user = json_decode($str);
    if (isset($user->error))
    {
        echo “<h3>error:</h3>” . $user->error;
        echo “<h3>msg  :</h3>” . $user->error_description;
        exit;
    }
    /*第四部 数据处理*/
    $info = “https://graph.qq.com/user/get_user_info?access_token=”.$params[“access_token”].”&oauth_consumer_key=100346418&openid=”.$user->openid.”&format=json “;
    require(ROOT_PATH . “includes/cls_json.php”);
    $json = new JSON;
    $user_info  = $json->decode(get_contents($info));
  /*这里特变说明一下*/

   $user_info的值是登陆返回的数据,包括OPENID,昵称,头像等信息。程序员可针对自己的系统处理数据,这里需要注意的是
    $_SESSION[“oauth_token”] = $params[“access_token”];
    $_SESSION[“openid”] = $user->openid;
    $username=$user_info->nickname;
    $password=time();//随便弄个密码
    $email=$_SESSION[“openid”].”@qq.com”;//没有返回邮箱
    $back_act =”user.php”;
    /* 检测用户名 */
    if (check_user($username)!==false){//账号存在直接完成登录

        /*判断openID*/

      if($db->getOne(“SELECT COUNT(*) FROM “.$ecs->table(“users”).” WHERE user_name=”$username” AND openid=””.$_SESSION[“openid”].”””)==1){

            set_session($username);
          //$GLOBALS[“user”]->set_cookie($username);
          header(“Location: user.php\n”);
          exit;

       }

      else

     {

            show_message(“对不起,用户名”.$username.”已经存在!”);

       }
       
    }else{
        $reg_date = time();
        $password =md5($password);
        $GLOBALS[“db”]->query(“INSERT INTO ” . $GLOBALS[“ecs”]->table(“users”) . “(`user_name`, `password`, `reg_time`, `last_login`, `openid`) VALUES (“$username”, “$password”, “$reg_date”, “$reg_date”, “$_SESSION[“openid”]”)”);//账号不存在 就写入数据库 并登陆
        set_session($username);
        //$GLOBALS[“user”]->set_cookie($username);
        header(“Location: user.php\n”);
        exit;
    }
    
}
else
{
    echo(“The state does not match. You may be a victim of CSRF.”);
}
 
function set_session($username=””)
{
    $sql = “SELECT user_id, password, email FROM ” . $GLOBALS[“ecs”]->table(“users”) . ” WHERE user_name=”$username” LIMIT 1″;
    $row = $GLOBALS[“db”]->getRow($sql);

    if ($row)
    {
        $_SESSION[“user_id”]   = $row[“user_id”];
        $_SESSION[“user_name”] = $username;
        $_SESSION[“email”]     = $row[“email”];
    }
}
function check_user($username)
{
    $sql = “SELECT user_id FROM ” . $GLOBALS[“ecs”]->table(“users”). ” WHERE user_name=”$username””;
    $row = $GLOBALS[“db”]->getRow($sql);
    if (!empty($row)){ return true; }else{return false;}
}
function get_contents($url)
{
       $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl,CURLOPT_URL,$url);
        return curl_exec($curl);

}

MYSQL的字段类型

(1)       数值型

      数值是诸如32 或153.4 这样的值。mysql 支持科学表示法,科学表示法由整数或浮点数后跟“e”或“e”、一个符号(“ ”或“-”)和一个整数指数来表示。1.24e 12 和23.47e-1 都是合法的科学表示法表示的数。而1.24e12 不是合法的,因为指数前的符号未给出。

       浮点数由整数部分、一个小数点和小数部分组成。整数部分和小数部分可以分别为空,但不能同时为空。

       数值前可放一个负号“-”以表示负值。

       所有的数字列类型都允许有两个选项:UNSIGNED和ZEROFILL。选择UNSIGNED的列不允许有负数,选择了ZEROFILL的列会为数值添加零。下面是MySQL中可用的数字列类型
TINYINT——一个微小的整数,支持 -128到127(SIGNED),0到255(UNSIGNED),需要1个字节存储
BIT——同TINYINT(1)
BOOL——同TINYINT(1)
SMALLINT——一个小整数,支持 -32768到32767(SIGNED),0到65535(UNSIGNED),需要2个字节存储 MEDIUMINT——一个中等整数,支持 -8388608到8388607(SIGNED),0到16777215(UNSIGNED),需要3个字节存储
INT——一个整数,支持 -2147493648到2147493647(SIGNED),0到4294967295(UNSIGNED),需要4个字节存储
INTEGER——同INT
BIGINT——一个大整数,支持 -9223372036854775808到9223372036854775807(SIGNED),0到18446744073709551615(UNSIGNED),需要8个字节存储
FLOAT(precision)——一个浮点数。precision<=24用于单精度浮点数;precision在25和53之间,用于又精度浮点数。FLOAT(X)与相诮的FLOAT和DOUBLE类型有差相同的范围,但是没有定义显示尺寸和小数位数。在MySQL3.23之前,这不是一个真的浮点值,且总是有两位小数。MySQL中的所有计算都用双精度,所以这会带来一些意想不到的问题。
FLOAT——一个小的菜单精度浮点数。支持 -3.402823466E 38到-1.175494351E-38,0和1.175494351E-38 to 3.402823466E 38,需要4个字节存储。如果是UNSIGNED,正数的范围保持不变,但负数是不允许的。
DOUBLE——一个双精度浮点数。支持 -1.7976931348623157E 308到-2.2250738585072014E-308,0和2.2250738585072014E-308到1.7976931348623157E 308。如果是FLOAT,UNSIGNED不会改变正数范围,但负数是不允许的。
DOUBLE PRECISION——同DOUBLE
REAL——同DOUBLE
DECIMAL——将一个数像字符串那样存储,每个字符占一个字节
DEC——同DECIMAL
NUMERIC——同DECIMAL

 (2)字符(串)型

      字符型(也叫字符串型,简称串)是诸如“hello, world!”或“一个馒头引起的血案”这样的值,或者是电话号码87398413这样的值。既可用单引号也可用双引号将串值括起来。

      数值87398143和字符串87398143的区别。都是数字,怎么一个要用数值型,一个要用字符型呢?关键就在于:数值型的87398143是要参与计算的,比如它是金融中的一个货款总额;而字符型的87398143是不参与计算的,只是表示电话号码,这样的还有街道号码、门牌号码等等,它们都不参与计算。      

           下面是MySQL中可用的字符串列类型
CHAR——字符。固定长度的字串,在右边补齐空格,达到指定的长度。支持从0到155个字符。搜索值时,后缀的空格将被删除。
VARCHAR——可变长的字符。一个可变长度的字串,其中的后缀空格在存储值时被删除。支持从0到255字符
TINYBLOB——微小的二进制对象。支持255个字符。需要长度 1字节的存储。与TINYTEXT一样,只不过搜索时是区分大小写的。(0.25KB)
TINYTEXT——支持255个字符。要求长度 1字节的存储。与TINYBLOB一样,只不过搜索时会忽略大小写。(0.25KB)
BLOB——二进制对象。支持65535个字符。需要长度 2字节的存储。 (64KB)
TEXT——支持65535个字符。要求长度 2字节的存储。 (64KB)
MEDIUMBLOB——中等大小的二进制对象。支持16777215个字符。需要长度 3字节的存储。 (16M)
MEDIUMTEXT——支持16777215个字符。需要长度 3字节的存储。 (16M)
LONGBLOB——大的的二进制对象。支持4294967295个字符。需要长度 4字节的存储。 (4G)
LONGTEXT——支持4294967295个字符。需要长度 4字节的存储。(4G)
ENUM——枚举。只能有一个指定的值,即NULL或””,最大有65535个值
SET——一个集合。可以有0到64个值,均来自于指定清单

 (3)日期和时间型

      日期和时间列类型用于处理时间数据,可以存储当日的时间或出生日期这样的数据。格式的规定:Y表示年、M(前M)表示月、D表示日、H表示小时、M(后M)表示分钟、S表示秒。下面是MySQL中可用的日期和时间列类型
DATETIME——格式:”YYYY-MM-DD HH:MM:SS”,范围:”1000-01-01 00:00:00″到”9999-12-31 23:59:59″
DATE——格式:”YYYY-MM-DD”,范围:”1000-01-01″到”9999-12-31″
TIMESTAMP——格式:”YYYYMMDDHHMMSS”、”YYMMDDHHMMSS”、”YYYYMMDD”、”YYMMDD”,范围:”1970-01-01 00:00:00″到”2037-01-01 00:00:00″
TIME——格式:”HH:MM:SS”
YEAR——格式:”YYYY,范围:”1901″到”2155″

discuzX2.5常见问题

1.更新过服务器无法显示页面

解决:更新服务器后要进到后台管理中心更新缓存

步骤:后台—>工具—>更新缓存。

2.换域名后用户头像不显示

解决:重新配置ucenter以及 discuz应用主要是配置文件 原先的头像引用地址是旧的

位置upload\config\config_ucenter你懂得!