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数组处理工具包的内部功能。

工作日志系统技术总结

工作日志系统技术总结

工作日志系统是把每人每天的工作记录下来,方便查看和填写,下面介绍流程和主要技术。

  1. 登录页面

登录页面,首先jquery判断账号位数:

<script type=”text/javascript” src=”<?php echo JSPATH; ?>/jquery-1.7.1.min.js”></script>

<script type=”text/javascript” src=”<?php echo JSPATH; ?>/jquery.validate.js”></script>

<script type=”text/javascript” language=”javascript”>

//验证表单

$(document).ready(function()

{

//用户账号位数:验证规则追加

$.validator.addMethod(“accountLength”, function(value, element) {

return this.optional(element) || (value.length >= 4 && value.length < 20);

});

 

// 验证部分

$(“#login_form”).validate({

rules: {

“userAccount”     : {required  : true,

accountLength:true

}

},

messages: {

“userAccount”   : {

required: “账号不能为空”,

accountLength: “账号长度不符合要求”

}

},

errorPlacement : function(error, element) {

error.appendTo(element.siblings(“span”));

}

});

});

//将错误信息输出到指定位置

</script>

 

然后从数据库里检出用户名和密码是否匹配,如果不匹配,返回错误信息,是通过数组传过去的提示信息。如匹配成功,将会往session里传值,判断登录用户权限,如果是管理员,页面定向到用户查询页面,否则定向到工作查询页。最后定义方法,注销session.

public function find()

{

$data[“userAccount”]  = $this->input->post(“userAccount”);

$data[“userPassword”] = $this->input->post(“userPassword”);

$login = $this->login_mdl->find($data);

if(!empty($login) && (md5($data[“userPassword”]) ==$login[“userPassword”]))

{

$session_data  = array(“user_authority”     => $login[“userAuthority”],

“user_account”     => $login[“userAccount”],

“user_name”     => $login[“userName”],

“user_id”        => $login[“userId”]);

$this->session->set_userdata($session_data);

$user_authority = $this->get_userdata()->user_authority;           //调用SESSION

//$data[“user_authority”] =$user_authority;

if($user_authority==”管理员”)

redirect(“/search_name/index”);

else

redirect(“/work_search/index”);

}

else

{

$this->load->view(“login”, array(“check”=>”<span style=”color:red”>用户名或密码不正确</span>”));

//redirect(“/login”);

}

 

}

public function logout()

{

$unset_sess = array(

“authority”              => “”,

“account”       => “”,

“name”                 => “”,

“user_id”          => “”

);

$this->session->unset_userdata($unset_sess);

redirect(“/login”);

}

}   //注销session

 

 

  1. 用户查询页面

这个页面是为管理员应用的。它集成了用户查询、更新、删除、分页等功能,下面介绍详细方法。

以管理员权限进入的页面是用户查询,通过分页查询数据:

private function search_page($data)

{

$id = intval($this->input->get(“per_page”));                                     //接收分页导航传的ID值,命名必须是per_page,内置分页类定义好的,获取当前页码数

//配置参数

$config[“base_url”]         = “/search_name/index?userAccount=” . $data[“userAccount”] . “&userName=” . urlencode($data[“userName”]) .”&per_page=”.$id;                                                                                                            //导入分页URL,命名必须是per_page,内置分页类定义好的

$config[“total_rows”]       = $this->search_name_mdl->test_total($data);              //总条数

$config[“use_page_numbers”] = TRUE;                                                                                  //URL显示当前页码

$config[“per_page”]         = 5;                                                                                  //每页显示的条数

$config[“page_query_string”] = TRUE;                                                                               //***解析地址传值:http://example.com/index.php/test/page/20 http://example.com/index.php?c=test&m=page&per_page=20

//自定义分页样式

$config[“num_links”]             = 3;

$config[“first_link”]        = “首页”;

$config[“last_link”]         = “尾页”;

//$config[“cur_tag_open”]              = “<b><font color=”red”>”;

//$config[“cur_tag_close”]       = “</font></b>”;

$config[“prev_link”]              = “上一页”;

$config[“next_link”]        = “下一页”;

//给CI分页类赋值

$this->load->library(“pagination”);                                                                                                   //导入分页类

$this->pagination->initialize($config);                                                                                             //初始化分类页

//定义计算变量

$id    = $id?$id:1;                                                                                                                                    //二元判断

$end   = $config[“per_page”];                                                                                                               //每页显示条数

$start = ($id-1)*$end;

//显示数据

$data[“user_list”]      = $this->search_name_mdl->select($data,$end,$start);                              //条件查询结果

$data[“total”]          = $this->search_name_mdl->test_total($data);                                               //条件查询总条数

$data[“show_page”]      = $this->pagination->create_links();

//分配数据

//$this->show($data);

$this->load->view(“search_name”,$data);

}

 

通过条件进行查询(m层):

public function select($data,$end,$start)

{

$where = ” where 1=1″;

if(!empty($data[“userAccount”]))

{

$where.=” and `userAccount` like “%”.$data[“userAccount”].”%””;

}

if(!empty($data[“userName”]))

{

$where.=” and `userName` like “%”.$data[“userName”].”%””;

}

$user  = self::USER;

$sql   = “select * from {$user} “.$where.”  order by userId desc limit “.$start.”,”.$end;

$query = $this->db->query($sql);

return $query->result_array();

}

 

删除方法对应删除记录

function delete()

{

$data[“userId”]         = $this->uri->segment(3);                                                                           //   往后划分/3

$delete                  = $this->search_name_mdl->delete($data);

redirect(“/search_name/index”);

}

 

public function delete($data)

{

$user  = self::USER;

$sql   = “delete  from {$user} WHERE userId = “. $data[“userId”];

$query = $this->db->query($sql);

if ($query)

{

return true;

}else

{

return false;

}

}

 

 

  1. 用户增加和修改

判断账号位数和是否和数据库中重名。还有两次密码是否一致。

<script type=”text/javascript” src=”<?php echo JSPATH; ?>/jquery-1.7.1.min.js”></script>

<script type=”text/javascript” src=”<?php echo JSPATH; ?>/jquery.validate.js”></script>

<script type=”text/javascript” language=”javascript”>

//判断密码是否一致

function docheck()

{

 

if(document.getElementById(“nuserPassword”).value != document.getElementById(“userPassword”).value)

{

document.getElementById(“nuserPassword_error”).innerHTML = “</br></br><font color=”red”>密码不相同</font>”;

return false;

}

 

return true;

}

 

//验证表单

$(document).ready(function()

{

//用户账号位数:验证规则追加

$.validator.addMethod(“accountLength”, function(value, element) {

return this.optional(element) || (value.length >= 4 && value.length < 15);

});

//密码允许字母数字下划线:验证规则追加

$.validator.addMethod(“userpassword”,function(value, element){

return this.optional(element)||/^[a-zA-Z0-9_] $/.test(value);

});

 

// 验证部分

$(“#login_form”).validate({

rules: {

“userAccount”     : {required  : true,

accountLength:true,

remote : {                                                               //定义一个异步方法,判断用户名是否存在,后台处理

url : “<?php echo site_url(“Adduser/realname_taken”);?>”,

type:”post”,                                //c层realname_taken方法传值的方式,数据发送方式

dataType : “json”,                        //获取的值的类型,接受数据格式

data : {userAccount : function (){return $(“#userAccount”).val()}} //要往URL中传的值,要传递的数据

}

 

},

“userPassword”        : {required : true

}

},

messages: {

“userAccount”   : {

required: “账号不能为空”,

accountLength: “账号长度不符合要求”,

remote:   “账号已存在”

},

“userPassword” :{

required:”密码不能为空”,

}

 

},

errorPlacement : function(error, element) {

error.appendTo(element.siblings(“span”));                                //将错误信息输出到指定位置

}

});

});

</script>

C层中:

//向user表内字段传值

public function realname_taken()

{

$data[“userAccount”] = trim($this->input->post(“userAccount”));

if($this->adduser_mdl->realname_exists($data))

{

echo “true”;

}

else

{

echo “false”;

}

}

 

在M层中:

//查询账号是否重复

public function realname_exists($data)

{

$user = self::USER;

$sql = “select * from {$user} where userAccount = “”.$data[“userAccount”].”””;

$query = $this->db->query($sql);

if(0<$query->num_rows())

return false;

else

return true;

}

 

由于代码部分较长这里不在赘述,有问题请联系博主。

接下来就是用户填加。用户增加后,在用户查询页可见。修改时通过ID传值来对就应的输出。

 

最大和最集中的技术在最后一项,就是用户工作页。它主要的功能有

  1. 当用户登录进来时,用户选项定到登录那个人的名字。用户选项是通过user表查询来的。
  2. 时间框是显示当前日期,并能识别出每月的天数。选择日期时,会查询当日的工作。
  3. 当点击今天的按钮时,时间会回到系统当前日期。
  4. 点击复制昨天时,会把这位用户上个工作日的工作复制到当前日期的昨天框内。
  5. 工作填写完成后,点击提交。工作就会提交,并显示。如想查询某日的工作,直接选择日期即可。

 

下面依次介绍实现的技术。

  1. 用户选项定到登录那个人的名字。首先把用户都遍历出来。输出是的用户名,但要用到userId。

foreach ($user_list as $row)

{

if(!empty($suserId))

{

if($suserId==$row[“userId”])

$selected=”selected=”selected””;

}

echo “<option “.$selected. “value=””.$row[“userId”].””>”.$row[“userName”].”</option>”;

$selected=””;

}

 

  1. 时间框显示当前日期。同时触发查询操作

如能取到日期,就取日期,否则就取系统日期

$year     = @$_GET[“year”]   ? $_GET[“year”] : date(“Y”);

$month    = @$_GET[“month”]  ? $_GET[“month”]: date(“m”);

$day      = @$_GET[“day”]    ? $_GET[“day”]:   date(“d”);

 

<select id=”day” name=”day” onchange=chooseQuery()>

<?php

$temp = strtotime(“$year-$month”);

$days = date(“t”,$temp);

$selected=””;

for($i=1;$i<=$days;$i )

{

if($i==$day)

{

$selected=”selected=”selected””;

}

if($i<10)

{

$j=”0″.$i;

}

else

{

$j=$i;

}

echo”<option “.$selected.”value=””.$j.””>”.$i.”</option>”;

$selected=””;

}

?>

触发查询

 

<script language=javascript>

function chooseQuery(chuan)

{

var userId =document.getElementById(“userId”).value;

var year =document.getElementById(“year”).value;

var month =document.getElementById(“month”).value;

var day =document.getElementById(“day”).value;

url = “/work_search/index?userId=” userId “&year=” year “&month=” month “&day=” day;

window.location.href= url;

}

</script>

 

 

  1. 当点击今天的按钮时,时间会回到系统当前日期。

使其链接到当前页,要查的用户不变

<a href=”work_search/index?userId=<?php echo $suserId;?>”>今 天</a>

 

  1. 点击复制昨天时,会在地址栏上多个值。如果取到act这个值时,就输出相应的内容。

<a href=”/work_search/copy_yesterday_work_log?userId=<?php echo $suserId;?>&year=<?php echo $year;?>&month=<?php echo $month;?>&day=<?php echo $day;?>& =copy”>复制昨天</a>

  1. 工作填写完成后,提交后,先删除当前条,插入,然后执行查询。

由于样式好看,把input标签换成<a>标签,用它来触发form表单。

<a href=”#” onclick=”document.getElementById(“form_work”).submit()”>提交</a>

等同于<input type=”submit” name = “form_work” value = “提交”/>

OK 先写到这里,如有技术疑问,请联系本人,qq:179932133       验证消息:我是在雪印笔记里看到的。

CI框架文件上传功能

1.建立保存上传文件的文件夹:C:\localhost\test\source

2.指定上传位置:

2.1修改文件.htaccess:

2.2修改文件index.php

图1:

图2::

3.上传页面(V层):

4.实现上传(C层):

4.1参数设置:

获取上传文件信息表:

PHP实现二分搜索(折半查找)

目前在看编程珠玑(第2版),书中利用二分搜索例子讲解的十分精辟。

稍作调整改写为PHP,仅供参考。

在贴代码之前,我想大家是否可以根据算法以及下列伪代码自己推出代码,

这样可以得到一些头脑锻炼与提高的价值。

二分搜索:初始条件是已知一个对象存在于一个给定的范围内,而一次探索操作可以告诉我们该对象是否低于,等于或高于给定的位置。二分搜索通过重复探测当前范围的中点来定位对象。如果一次探测没有找到该对象,那么将当前范围减半,然后继续下一次探测。当找到所需要的对象或范围为空时停止。在程序设计中二分搜索最常见的应用是在有序数组中搜索元素。

伪代码:

min=0;max=n-1;

loop

{

if min > max

break;

middle = (min max) / 2;

case

x[middle] < t: min = middle 1;

x[middle] == t: P=middle;break;

x[middle] > t: max = middle -1;

}

我对条件稍微做了改动:随机输入一数字,然后随机生成10个100以内的数字,判断输入的数字是否存在于10个数字之内。代码如下:

<?php
$searchKey = $_SERVER[“argv”][1];//取得输入的数字
echo $searchKey . “\n”;

$randNumbers = array();
for($i = 0;$i < 10;$i )
{
 $randNumbers[$i] = rand(1, 100);
 echo $randNumbers[$i] . “\t”;
}
echo “\n”;
sort($randNumbers);
print_r($randNumbers);//随机生成10个100以内的数字,存入数组并正排序

$min = 0;
$max = 9;
$hasSameNumber = false;

while($min <= $max)
{
 $middle = round(($min + $max) / 2);
 if($randNumbers[$middle] < $searchKey)
 {
  $min = $middle 1;
 }
 else
 {

  if($randNumbers[$middle] > $searchKey)
  {
   $max = $middle – 1;
  }
  else
  {
   $hasSameNumber = true;
   break;
  }
 }
}

echo “\n”;
if(false == $hasSameNumber)
{
 echo “hasn”t same number”;
}
else
{
 echo “has same number”;
}
echo “\n”;

使用curl和simple_html_dom抓取网页数据

最近接触到抓取网页数据的工作,

用普通的正则来做,太浪费脑细胞。

幸好有了simple_html_dom,妈妈再也不用担心我的学习了。。。

function curl_get_html($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//伪造客户端浏览器信息

curl_setopt($ch, CURLOPT_USERAGENT, “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1”);

//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$content = curl_exec($ch);
curl_close($ch);
return $content;
}

include(“simple_html_dom.php”);

$curlhtmldom = curl_get_html($url); //抓取网页数据
$curlhtmldom = str_get_html($curlhtmldom); //在simple_html_dom中初始化数据信息

//使用例

$curlhtmldom->find(“div”); // 取得所有div标签集合

$curlhtmldom->find(“div.left_box”, 0); // 取得第一个div元素中类名为left_box的元素

$curlhtmldom->find(“td div a”, 0)->href; //取得第一个td元素内div中的a标签的href数据

$curlhtmldom->find(“tr”, 2)->find(“td”, 1)->innertext; // 取得第三个tr元素下的第二个td的innerHTML

$curlhtmldom->find(“div[width=98%]”, 0)->plaintext; // 取得第一个width属性为98%的div元素下的html内文本信息

ecshop 后台左侧导航添加菜单

涉及改动的有两块:1是添加左侧菜单,2是添加权限菜单

1 添加左侧菜单

涉及文件:/admin/includes/inc_menu.php

若在“系统设置”内添加菜单,加入如下代码:

$modules[“11_system”][“05_warehouse_list”] = “warehouse_list.php?act=list”;

涉及文件:/languages/zh_cn/admin/common.php

$_LANG[“05_warehouse_list”] = “**列表”;

2 添加到权限菜单

涉及文件:/admin/includes/inc_priv.php

$purview[“05_warehouse_list”] = “warehouse_manage”;

涉及文件:/languages/zh_cn/admin/priv_action.php

$_LANG[“warehouse_manage”] = “**列表管理”;

之后在表ecs_admin_action中插入action_code=warehouse_manage的一条数据,

清缓存后即可看到菜单和权限列表中新加入的菜单项。

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

什么是新浪微博开放平台
         新浪微博开放平台(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;
 }