PHP后台远程登录正方教务系统

从去年想这个事情怎么解决,今年终于算是把他搞清楚了,但验证码必须要填。

如果你能像360抢票哪有自动识别验证码,那就没事了。废话不多扯了。回归正题

这里要用CURL。

设计思路:先登录页面获取COOKIES,然后拿着cookies找服务器要验证码。最后提供服务器需要的全部信息。

(这种思维是完全模拟游览器访问页面,根本区别出来是人还机器)

public function index(){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url); //填对于的URL就可以了
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); //主要cookie的路径,本保存页面cookie
  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //返回结果自动输出
  $response = curl_exec($ch);
  curl_close($ch);
	}

访问正方教务系统的首页,第一获取页面中的HTML,第二是获取cookies。 继续阅读

PHP的文件上传处理

最近遇到一个事,把自己坑了好久,我想说说我开始的想法

PHP的上传机制封装的很完全,基本几行代码就能实现,他的实现流程是这样的

UPLOAD到文件到临时目录中–>使用move_uploadde_file()到指定的目录 

这就是PHP上传流程,或者你在中途再进行一些验证。例如判断是不是通过upload方式提交的文档,或者文件的扩展是不是我们允许的

等等一系列验证。我给出简单的代码也算是抛砖引玉了。

$targetFolder = '/uploads'; // 定义根目录
if (!empty($_FILES)) {
	$tempFile = $_FILES['Filedata']['tmp_name'];
if(is_uploaded_file($tempFile))
{
	$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
	$targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name'];
	$fileTypes = array('jpg','jpeg','gif','png'); // 允许的后缀扩展
	$fileParts = pathinfo($_FILES['Filedata']['name']);
	if (in_array($fileParts['extension'],$fileTypes)) {
		move_uploaded_file($tempFile,$targetFile);
		echo '1';
	} else {
		echo '非法上传文档.';
	}
}else
{
   echo "非法上传文件";
}
}

上面的这种方式基本就满足了文件上传。但我需要的不是这样的。 继续阅读

PHP的自动化测试工具

最近一直没怎么更新博客,因为有一个很蛋疼的任务没完成。

就是做一个自动化测试工具。这工具分为单例测试和批量测试(PS:PHP程序员也开始跟测试抢饭碗了)

PS:这里说一句题外话,在项目动手之前,一定要把需求弄清楚,不然你就会像我一样,要返工N次,还不能抱怨

做接口测试,首先你要先理解两个知识点:

  1. PHP的反射(反射是PHP的一个高级应用,如果你不知道的话,那工具开发就无从下手了)
  2. CURL扩展的使用

下面分步来说明这两个小玩意多是啥?

PHP的反射(一听就知道是一个高端大气上档次的东西,因为以前都没听说过)

反射有什么用?为什么要学反射?反射的原理是什么?这一大堆因为肯定让第一次接触的你很纠结。

PHP中反射方法是Reflection。然后它的作用就是让类里面的结构明显。

这样你肯定不是很理解。我们来一个实现吧


class mysql{

public  function a(){

print_r("php中级工程师");

/**

     这是一个PHP打印方法

@param string $name //输入用户名称

@param int $age //年龄

**/

private function b($name,$age)

{

echo  "你是猴子请来的逗比嘛";

}

  }
}

继续阅读

Thinkphp 细节,吐血推荐

做Thinkphp项目,遇到这个问题,现在跟大家分享一下,Thinkphp版本是3.1.3

第一个是模板切换问题,肯定很多人按着手册做,没效果。

       //模板配置
 'TMPL_SWITCH_ON'=>true
 'TMPL_DETECT_THEME' => true,
 'DEFAULT_THEME' => 'dxz',
 'THEME_LIST' => 'dwx,dxz,php',

首先上面4个是必不可少的。不然,下面的就别谈了,接着是怎么让框架知道,你要换模板。

绝对不是通过修改‘DEFAULT_THEME’来完成的。 继续阅读

PHP远程获取服务器验证码

验证码本来就反正远程暴力提交数据的,但我就要远程提交数据。远程获取目标网站的验证码

再人工填写验证码提交数据。

这样用到PHP的GD扩展库来实现这个问题,实现原理并你想的还简单

set_time_limit(0);//设置PHP超时时间
$url = "http://218.75.208.58:83/CheckCode.aspx";
if(empty($url)){
	echo "没有图片";
	exit;
}
$imginfo = getimagesize ( $url );
$type = $imginfo["mime"];
$imgw = $imginfo [0];
$imgh = $imginfo [1];
$bg = imagecreatetruecolor($imgw,$imgh);
$image = imagecreatefromgif($url);
imagecolorallocate($image,255,255,255);
imagecopy($bg,$image,0,0, 0,0,$imgw,$imgh);
imagedestroy($image);
header("Content-type:".$type);
imagegif($bg);

继续阅读

中国银联支付平台开发和实现

日志

这几天一直在研究chinapay 这个支付平台,根据他们提供的开发文档写,了解业务流程等等,应该是很简单的东西。

后来直到做了以后才发现我自己想的太简单了。

但,庆幸的是还是做事完了,我现在总结一下心得

  1. 遇到问题不要着急,要淡定,这个说的简单但做起来确实有点难。
  2. 遇到问题要等一等,如果实在是想不出方法,还可以把问问放一放,过几天回头再看看。
  3. 检测错误的时候要常把数据打印出来,看看有没有数据没有。

就chinapay的平台,我发现几个问题

数据用CURL模拟POST发送的时候,一定要注意字符的顺序,并且中文字符串都要用urlencode()函数进行编码,不然

chinapay的服务器就是报HTTP 500的错误。

这个问题,我是怎么发现的呢?其实做javascript非跨域发送数据的时候,我就用firebug看过数据传输了

curl_post

curl_post

仔细看看上面POST传输的数据。中间没有中文字符,但是有特殊字符都是通过urlencode()处理过的。 继续阅读

PHP处理数字

PHP 是一门脚本语言,但它很神奇,你用POST一串数字过去,用var_dump()打印出来,你会发现,这串数字的格式是string。

今天,我要做一个功能,把12位数字,如:000000100000

像上面这种以分为单位的数字,一般人看起来很麻烦,所以,我们要处理一下显示成如下的样子

数字处理后的效果图

数字处理后的效果图

像这样,就看起来方便一点。要怎么处理,我本打算用正则,但/d 是匹配出0-9的数字,我要从新写匹配方式,再三反思,还是用

简单的方式


function transAmt($value)

{

//将字符串转换成数组

$array = str_split($value);

//对数组进行遍历

foreach($array as $key=>$va)

{

if($va != 0)

{

$start = $key;

break;

}

}
//对字符串组进行分割
$len = strlen($value) - $start;
$substr =  substr($value,$start,$len);
 //对数据进行处理,先获取子串的长度
  $smallnum = substr($substr,-2,2);
   $bignum = substr($substr,0,$len-2);
   return $bignum.".".$smallnum;
 }

这样就完事了,就是把字符串转换成数组,再操作数组。

这应该算是PHP 操作字符串的惯用手法。

编程的最简单的思路:遇到问题,针对问题提出解决问题的方法,再多个问题总结,得到共同点。

总的来说,就是把面向过程的函数转换成面向对象的类。

图片新闻的设计与实现

今天项目中要做一个图片新闻的,就是把文字新闻里面的图片匹配出来。存在数据库里面,就不要手动在上传图片

只要做到在新闻编辑器上传的新闻代码中匹配出 SRC=后面的路径就可以了。

这里要用到正则表达式,不懂正则表达式的,可以先搜索一下资料了解一下。

  /**模式匹配**/
$regex = "/src=(.+?).(jpg|gif|png|bmp)/i";
$str = '<img src="hnaz/Public/images/xnlogo.gif" width=\"100\" height=\"200\"  />';
$matches = array();
echo '<pre>'
if(preg_match_all($regex, $str, $matches)){
    var_dump($matches);
}else
{
   echo "木有匹配出来";
}
echo $str;
?>

继续阅读

PHP在线打包下载

昨天晚上,为了弄这个打包下载的事,弄的事焦头烂额。有几个问题,第一个是开始PHP_ZIP.dll的问题。话说只要把PHP.INI里面的extend_dir里面的前的”;”号去掉。再重启IIS或者apache就可以了。

问题是老是找不到系统配置的真正的PHP.INI。

PHP配置图

PHP配置图

第二个是告诉你配置文档的路径,按着找就可以了。我当时脑袋秀逗了,浪费了很多时间。

这个开启PHP_ZIP扩展库以后,就可以开始打包下载了。

 $filename= date("YmdHis");  
  
 $zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释  
 
   $zip->open($filename.".zip", ZipArchive::OVERWRITE); //$data 就是从数据库里面读出的数字
    
   foreach( $data as $val){  
   
      $attachfile = "E:\bysj\bysj".$val['fileaddr'].$val['filename']; //写硬路径,但建议用PHP环境变量
 
        $attachfile=iconv("UTF-8","GBK",$attachfile); //转码,是打包中文文档的关键

	    $zip->addFile( $attachfile , basename($attachfile)); //压栈

	                       }

    $zip->close();//关闭  

header("Content-type:text/html;charset=utf-8");//设置页面编号

header("Cache-Control: public");

header("Content-Description: File Transfer");

header('Content-disposition: attachment; filename='.basename($filename)); //文件名  

header("Content-Type: application/zip"); //zip格式的  

header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件   

header('Content-Length: '. filesize($filename)); //告诉浏览器,文件大小  

@readfile($filename.".zip");

上面的代码基本就可以实现文档打包下载了,也解决了中文文档无法打包下载的问题。
但我数据库里面明明是用UTF-8存储的数据,但为嘛读出了,ZIP老是找不到文档呢?一直困惑。

PHP链表操作

在php中运行数据结构,基本都是用数组模拟的,只是用一直思想而已。

今天遇到的这个问题是,两个链表进行合并。

链表合并效果图

链表合并效果图

问题描述:A链表是模版链表,B链表的长度不确定,A,B二个链表结合后形成C链表。链表结构单位是

说一下编程思想:A链表是模版链表所以在运算完成了,长度了唯一不变的。而B链表的长度是不确定的。所以可以先对B链表进行判断,分了三步
  1. B链表是不是为空
  2. B链表是不是比A链表短或者相等
  3. B链表是不是比A链表长

编程就是要列出尽可能的可能性。抓住变量,由于题目要求,当A链表和B链表相等时,直接返回B链表,所以不用考虑这个问题。 继续阅读