【PHP】在PHP语言中使用JSON

Continue Read..

从5.2版本开始,PHP原生提供json_encode()json_decode()函数,前者用于编码,后者用于解码。

一、json_encode()

该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:

  $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

  echo json_encode($arr);

结果为

  {"a":1,"b":2,"c":3,"d":4,"e":5}

再看一个对象转换的例子:

  $obj->body = 'another post';

  $obj->id = 21;

  $obj->approved = true;

  $obj->favorite_count = 1;

  $obj->status = NULL;

  echo json_encode($obj);

结果为

  {
    "body":"another post",

    "id":21,

    "approved":true,

    "favorite_count":1,

    "status":null
  }

由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。

二、索引数组和关联数组

PHP支持两种数组,一种是只保存"值"(value)的索引数组(indexed array),另一种是保存"名值对"(name/value)的关联数组(associative array)。

由于javascript不支持关联数组,所以json_encode()只将索引数组(indexed array)转为数组格式,而将关联数组(associative array)转为对象格式。

比如,现在有一个索引数组

  $arr = Array('one', 'two', 'three');

  echo json_encode($arr);

结果为:

  ["one","two","three"]

如果将它改为关联数组:

  $arr = Array('1'=>'one', '2'=>'two', '3'=>'three');

  echo json_encode($arr);

结果就变了:

  {"1":"one","2":"two","3":"three"}

注意,数据格式从"[]"(数组)变成了"{}"(对象)。

如果你需要将"索引数组"强制转化成"对象",可以这样写

  json_encode( (object)$arr );

或者

  json_encode ( $arr, JSON_FORCE_OBJECT );

三、类(class)的转换

下面是一个PHP的类:

  class Foo {

    const ERROR_CODE = '404';

    public $public_ex = 'this is public';

    private $private_ex = 'this is private!';

    protected $protected_ex = 'this should be protected';

    public function getErrorCode() {

      return self::ERROR_CODE;

    }

  }

现在,对这个类的实例进行json转换:

  $foo = new Foo;

  $foo_json = json_encode($foo);

  echo $foo_json;

输出结果是

  {"public_ex":"this is public"}

可以看到,除了公开变量(public),其他东西(常量、私有变量、方法等等)都遗失了。

四、json_decode()

该函数用于将json文本转换为相应的PHP数据结构。下面是一个例子:

  $json = '{"foo": 12345}';

  $obj = json_decode($json);

  print $obj->{'foo'}; // 12345

通常情况下,json_decode()总是返回一个PHP对象,而不是数组。比如:

  $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

  var_dump(json_decode($json));

结果就是生成一个PHP对象:

  object(stdClass)#1 (5) {

    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)

  }

如果想要强制生成PHP关联数组,json_decode()需要加一个参数true:

  $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

  var_dump(json_decode($json),true);

结果就生成了一个关联数组:

  array(5) {

     ["a"] => int(1)
     ["b"] => int(2)
     ["c"] => int(3)
     ["d"] => int(4)
     ["e"] => int(5)

  }

五、json_decode()的常见错误

下面三种json写法都是错的,你能看出错在哪里吗?

  $bad_json = "{ 'bar': 'baz' }";

  $bad_json = '{ bar: "baz" }';

  $bad_json = '{ "bar": "baz", }';

对这三个字符串执行json_decode()都将返回null,并且报错。

第一个的错误是,json的分隔符(delimiter)只允许使用双引号,不能使用单引号。第二个的错误是,json名值对的"名"(冒号左边的部分),任何情况下都必须使用双引号。第三个的错误是,最后一个值之后不能添加逗号(trailing comma)。

另外,json只能用来表示对象(object)和数组(array),如果对一个字符串或数值使用json_decode(),将会返回null。

  var_dump(json_decode("Hello World")); //null

六、参考材料

  * PHP Manual

  * Ed Finkler, JSON is Everybody's Friend

(完)

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【PHP】CodeIgniter+SWFUpload实现多文件(或图片)一起上传功能

Continue Read..

首先下载CodeIgniter和SWFUpload,,,,这个大家自己下载...最好去官网下

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />

<title>php jquery uploadify多文件上传</title>

<script type="text/javascript" src="/images/uploadify/jquery-1.7.2.js" charset="utf-8"></script>

</head>

<body>

<div class="infor_box"><div class="infor_box_title"><span>补充信息<em>(可选择)</em></span>上传相片可使效果提高三倍</div>

<table cellpadding="0" cellspacing="0" border="0" class="frame">

<tr><th>上传图片:</th><td>

<?php session_start();$_SESSION["file_info"] = array(); //用于保存上传文件信息?>

<link href="/images/uploadify/default.css" rel="stylesheet" type="text/css" />

<script type="text/javascript" src="/images/uploadify/swfupload.js" charset="utf-8"></script>

<script type="text/javascript" src="/images/uploadify/handlers.js" charset="utf-8"></script>

<script type="text/javascript">

var swfu;

window.onload = function () {

swfu = new SWFUpload({

// Backend Settings

upload_url: "/uptest/imgup/",

post_params: {"SSID": Math.random()},

// File Upload Settings

file_size_limit : "1024 MB", // 2MB

//file_types : "",

file_types_description : "图像文件",

file_upload_limit : 100 ,

//file_queue_limit : 20,

// Event Handler Settings - these functions as defined in Handlers.js

//  The handlers are not part of SWFUpload but are part of my website and control how

//  my website reacts to the SWFUpload events.

swfupload_preload_handler : preLoad,

swfupload_load_failed_handler : loadFailed,

file_queue_error_handler : fileQueueError,

file_dialog_complete_handler : fileDialogComplete,

upload_progress_handler : uploadProgress,

upload_error_handler : uploadError,

upload_success_handler : uploadSuccess,

//upload_success_handler : function (file, serverData, responseReceived) {

// console.dir(file);

//alert("Successfully uploaded: "+fileObj.filePath);

//alert(response);

// getResult(response);//获得上传的文件路径

//},

upload_complete_handler : uploadComplete,

 

// Button Settings

button_image_url : "/images/uploadify/SmallSpyGlassWithTransperancy_17x18.png",

button_placeholder_id : "spanButtonPlaceholder",

button_width: 220,

button_height: 18,

button_text : '<span class="uploadbutton">请选择图片文件,支持按住Ctrl后多选</span>',

button_text_style : '.uploadbutton{font-size: 13pt;} .buttonSmall {font-size: 13pt;}',

button_text_top_padding: 0,

button_text_left_padding: 18,

button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,

button_cursor: SWFUpload.CURSOR.HAND,

// Flash Settings

flash_url : "/images/uploadify/swfupload.swf",

flash9_url : "/images/uploadify/swfupload_FP9.swf",

custom_settings : {

upload_target : "divFileProgressContainer",

thumbnail_height: 400,

thumbnail_width: 600,

thumbnail_quality: 100

},

// Debug Settings

debug: true

});

};

</script>

<div style="width: 220px; height: 18px; border: solid 1px #7FAAFF; background-color: #C5D9FF; padding: 2px;"><span id="spanButtonPlaceholder"></span></div>

<div id="divFileProgressContainer"></div>

<div id="thumbnails"></div>

<div id="upflash"></div><p class="mt5 mb5">提醒:</p><ul><li>1、盗用他人图片的行为一经核实,将删除该信息。 </li><li>2、请勿上传有水印、盖章等任何侵犯他人版权或含有广告信息的图片,一经核实,将删除该信息。</li></ul></td></tr>

</table></div>

<div class="blank10"></div>

 

 

<div id="divTxt" style="display:none"><span style="color:red"><strong>已经上传的图片有:</strong></span><br></div><br>

 

 

<form action="/uptest/upload" enctype="multipart/form-data" method="post">

<input type="file" name="Filedata" />

<input type="submit" value="提交" />

</form>

</body>

</html>

 

上面就是加载SWFUpload   界面是看下图

 

点击查看原图

 

 

这里主要说说里面的几个参数

upload_url :php要执行上传的函数   比如   /uptest/imgup/

post_params: {"SSID": Math.random()}    这个是ssid值...用随机的就行了

file_size_limit : "1024 MB"   //上传图片的大小....貌似是所有文件的总大小

file_upload_limit : 100    //上传文件的数量   比如你写5..那么只能一起传5个文件...

 

custom_settings : {

     upload_target : "divFileProgressContainer",

     thumbnail_height: 400,

     thumbnail_width: 600,

     thumbnail_quality: 100

    },

 

这个是自定义的一个参数..我测试的时候在这个地方调试了很久...

其中的upload_target  是一个div   也就是你上传成功之后图片  无刷新直接在页面上显示  

下面2个就是上传图片之后处理图片的高宽...我就在这里调试了很久..我开始写的600 800   然后传图片的时候总是出现传不上去的情况.

开始百度..都是找国内的..没一个靠谱的...没办法..就去谷歌看英文...总的来说就是宽高大了...改小就行了...(英语不行.用软件翻译的)

下面就讲php的上传

function uploadfile($watefile,$formname,$type=''){

$config['upload_path'] = './uploads/';

$config['allowed_types'] = 'gif|jpg|png|bmp|jpeg';

$config['max_size'] = 20480;

$config['encrypt_name'] = TRUE;

$this->load->library('upload',$config); //加载上传类

$field_name = $formname; //指定表单名称

if (!$this->upload->do_upload($field_name)){ //上传

$tempfile = false;

}else{

if(!empty($watefile)){

$this->load->library('image_lib');

$data = $this->upload->data(); //获取上传后的数据

$config1['source_image'] = $config['upload_path'].$data['file_name'];  

$config1['wm_type'] = 'overlay';

$config1['wm_overlay_path'] = $watefile; 

$config1['wm_vrt_alignment'] = 'bottom';

$config1['wm_hor_alignment'] = 'center';

$config1['wm_padding'] = '-50';

//var_dump("<pre>",$config1);

$this->image_lib->initialize($config1); 

$field_name = $this->image_lib->watermark(); 

}

$tempfile = $this->ftp_file($field_name);

}

if(empty($type)){return $tempfile;}else{return 'FILEID:'.$tempfile;}

}

 

 

我这里是先将图片存到本地..然后看是否要打水印..然后传到ftp的目录下...大概方法是这样...其中'FILEID:'.$tempfile;这个是格式

js里面会匹配的...不要随便改...最后..我也改了js的一点东西...原来这个上传的js是用session先存值...然后在存到数据库...这里你们可能会说为什么要先存到session

 

这个上传多图片明显是某个添加功能里面的一块..如果没有添加之后的id...怎么把图片和添加的信息绑定起来...用seesion比较占服务器

我就想让他返回图片的地址..用input装着..隐藏...提交表单的时候一起提交

下面贴修改js的地方

修改的文件是handlers.js

function uploadSuccess(file, serverData) {

try {

var progress = new FileProgress(file,  this.customSettings.upload_target);

 

if (serverData.substring(0, 7) === "FILEID:") {

addImage(serverData.substring(7));

            getResult(serverData.substring(7));//自己加的

progress.setStatus("Upload Complete.");

progress.toggleCancel(false);

} else {

addImage("error.gif");

progress.setStatus("错误.");

progress.toggleCancel(false);

alert(serverData);

 

}

 

 

} catch (ex) {

this.debug(ex);

}

}

//自己加的函数...就是用js生成一个input

function getResult(content){

//通过上传的图片来动态生成text来保存路径

var board = document.getElementById("divTxt");

board.style.display="";

var newInput = document.createElement("input");

newInput.type = "text"; 

newInput.size = "45"; 

newInput.name="myFilePath[]";

var obj = board.appendChild(newInput);

var br= document.createElement("br"); 

board.appendChild(br);

obj.value=content;

 

}


声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

一个缩略图类

Continue Read..

一个缩略图类,测试了下,非常不错,备用

20120426增加了png透明图功能,以前的png透明图缩略后背景变成黑色,现在改好了,针对透明png单独处理,测试正常

下载地址如下:

 resizeimage.rar

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【PHP】根据数组的val求Key

Continue Read..
array_search($v, $arr);

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【php+jquery+Fck】关于php使用Fck编辑器插入分页标签的小记

Continue Read..
关于Fck编辑器在PHP文章分页中的应用,总结了常用的两种方法,代码来源于网络,我只是进行了总结:

如下

首先是定义替换分页符的类来达到分页的效果,类有两种

第一:

<?
/***********FCKEditor分页处理*********/
function pageBreak($content)
{
 //把文章内容按照<div style="page-break-after: always"><span style="display: none">&nbsp;</span></div>分割成数组
 $content  = $content;
 $pattern  = "/<div style=\"page-break-after: always\"><span style=\"display: none\">&nbsp;<\/span><\/div>/";
 $strSplit = preg_split($pattern, $content, -1, PREG_SPLIT_NO_EMPTY); //将文章内容分割成数组
 $count    = count($strSplit);   //分割后的数组单元数目
 $outStr   = ""; //返回的字串
 $i        = 1;
 
 if ($count > 1 ) {
  $outStr   = "<div id='page_break'>";
  foreach($strSplit as $value) {
   if ($i <= 1) {
    $outStr .= "<div id='page_$i'>$value</div>";
   } else {
    $outStr .= "<div id='page_$i' class='collapse'>$value</div>";
   }
   $i++;
  }
  
  $outStr .= "<div class='num'>";
  for ($i = 1; $i <= $count; $i++) {
   $outStr .= "<li>$i</li>";
  }
  $outStr .= "</div></div>";
  return $outStr;
 } else {
  return $content;
 }
}
?>
利用ajax方式无刷新分页,好处是有渐现效果,并且速度比较快,分页无连接地址

调用代码如下:

<?php echo pageBreak($rs['content']) ?>

需配合jquery-1.5.min.js使用

<head>需内加入如下脚本:

<script language = "JavaScript" src ="jquery-1.5.min.js"></script>

<script type="text/javascript">
<!--
 $(document).ready(function(){
  $('#page_break .num li:first').addClass('on');
  
  $('#page_break .num li').click(function(){

   //隐藏所有页内容
   $("#page_break div[id^='page_']").hide();
    
   //显示当前页内容。
   if ($(this).hasClass('on')) {
    $('#page_break #page_' + $(this).text()).show();   
   } else {
    $('#page_break .num li').removeClass('on');
    $(this).addClass('on');
    $('#page_break #page_' + $(this).text()).fadeIn('normal');
   }
  });
 });
//-->
</script>

第二:

<?php
function pageUrl($content,$id)
{
 $content  = $content;
 $page =isset($_GET['page'])?$_GET['page']:1;
 $split ='<div style="page-break-after: always"><span style="display: none">&nbsp;</span></div>';
 $array =explode($split,$content);
 $maxpage = sizeof($array);
 if($page> $maxpage ){
  echo $array[0];
 }else{
  echo $array[$page-1];
 }
 if $maxpage>1){
  if($page<=1){
 echo "";
   }else{
 echo "<a href=/z_news.php/id/$id/page/".($page-1).">上一页</a>";
   }
 for($i=1;$i<= $maxpage;$i++){
 echo "<a href=/z_news.php/id/$id/page/".$i.">[".$i."页]</a>";
  }
   if($page>= $maxpage{
 echo "";
 }else{
 echo "<a href=/z_news.php/id/$id/page/".($page+1).">下一页</a>";
 }
 }
}
?>
这个类直接生成分页地址,比较传统,分页有链接地址

调用代码如下:

<?php echo pageUrl($rs['content'],$rs['id']) ?>

这个在源代码基础上做了些修改(红色部分),加入最大页数判断,使分页调用部分更容易根据需要识别

希望对新人有用


css教程控制分页样式

 

#page_break {

}
#page_break .collapse {
display: none;
}
#page_break .num {
padding: 10px 0;
text-align: center;
}
#page_break .num li{
display: inline;
margin: 0 2px;
padding: 3px 5px;
border: 1px solid #ff7300;
background-color: #fff;

color: #ff7300;
text-align: center;
cursor: pointer;
font-family: arial;
font-size: 12px;
overflow: hidden;
}
#page_break .num li.on{
background-color: #ff7300;

color: #fff;
font-weight: bold;
}

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

ubuntu设置ip

Continue Read..

今天测试metasploitable的时候发现只有ipv6的地址,多以想要手动修改,弄成ipv4的,

和centos的配置不同的,等会分别附上2种系统的改法。

metasploitable实际上是ubuntu修改的,就用ubuntu的方法改。

我的虚拟机都用的nat方式,

先切到root去,ubuntu默认不让root,先普通sudo passwd root,给root设置密码,成功后su root到root权限去

一、使用命令设置ubuntu的ip地址

1. 设置IP

ifconfig eth0 203.171.239.155 netmask 255.255.255.224

网卡eth0的IP地址、子网掩码

2. 设置网关 sudo route add default gw 203.171.239.129

3. 设置DNS 修改/etc/resolv.conf,在其中加入 nameserver DNS的地址1 nameserver DNS的地址2 完成。

不过,这样设置之后,下次开机时候似乎IP又不存在了。

二、改配置文件,一直有效

ubuntu的网络配置文件是:/etc/network/interfaces

vim /etc/network/interfaces (metasploitable里面vi貌似有问题,所以用vim

设置如下

auto eth0
iface eth0 inet static
address 192.168.254.115
gateway 192.168.254.1
netmask 255.255.255.0

设置完后执行

/etc/init.d/networking restart

三、配置DNS

vim /etc/resolv.conf

nameserver 192.168.254.1

nameserver 8.8.4.4

这样就ok了,网络正常了

=============================德玛西亚===========================

下面附上centos下的配置方法

网卡IP地址配置在这个文件里

/etc/sysconfig/network-script/ifcfg-eth0


动态修改,临时的,重启失效

ifconfig eth0 192.168.0.1

一直有效的直接改配置

vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=static //静态,dhcp方式就写dhcp

HWADDR= ;这里是你网卡的物理地址,通常检测到的网卡你就不用输入了

ONBOOT=yes

IPADDR=192.168.0.1

NETMASK=255.255.255.0  //子网掩码

NETWORK=192.168.1.0

BROADCAST=192.168.1.255

GATEWAY= ;这里输入你的网关,路由器的IP地址

重启网卡

/etc/init.d/network restart

配置dns

vim resolv.conf

nameserver 192.168.254.1

nameserver 8.8.4.4

另外,centos下还可以用setup命令在里面设置




声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权