php+js处理大量input输入框与表单提交获取问题

 更新时间:2016年11月25日 16:19  点击:1796
表单提交是开发中常用的一些功能了,但是有时我们对于有些客户的要求一个页面能写出100个input出来,对于这种我们肯定不希望一个个填写并且一个个验证了,那么我们要如何来处理呢?

近段时间接到一个比较奇葩的需求,对方要求在企业站中加入一个类似word的表单,并供用户在线填写与提交。

仔细看了一下,该表单的字段高达一百多个,这个量级是相当可怕的。如果每个input手动去填写id和name的话,该是一个多么可怕的体力活啊。

反复思考了一下,为避免苦逼的去逐个填写input的id与name,决定用JS配合PHP的方式来解决这个表单一连串的提交工作。

 表单组成部分

表单首先按照客户的要求,将需要填写的表格与选项按照word文档的原型进行布局,使其符合用户体验,如下图:

 

 

(上图只是截取表单的一小部分作为范例,实际上这个表单是无比之大的)

当表单的html布局完成之后,我们就需要开始对这些表单的input设定id与name用于表单提交了。

前言中已经说道到了input非常多,所以我们这里采用JS的方式来为input自动添加id与name。代码如下(jquery方式):

 代码如下 复制代码
$(document).ready(function(){
var inputNum = 0;
$(‘input’).each(function(){
$(this).attr({name:‘val’+inputNum,id:‘val’+inputNum});
inputNum++
})})

通过js处理后,该页面的所有input都会自动按照自增1的方式对id和name进行添加。至此,这个表单的基本上可以正常使用了。(frome咱就不解释了,程序员都懂的。)

 20131201104034

表单GET部分

OK,上面已经可以正常的把表单提交到PHP程序中进行处理了。当然上面的办法也适用于任何一种web程序,比如说.net,jsp,asp等等…..

下一步我们就需要对提交过来的字符串进行拆解,以获取表单内的值。关于如何获取表单的传值,本文就不做解释了。

由于表单传过来的值也是N个,所以我们也不可能一个一个的去写数组变量来获取这些值,所以这里也需要用到一些办法来处理。

好,下面我们来说正事。首先我们按照之前的js程序逻辑来思考,如何让这些数组每个自增1来实现数组的输出。

程序代码如下:

 代码如下 复制代码

<?php
$num = 0; //初始化计数变量
$_REQUEST['val'.$num]; $num++; //插入到需要获取值的地方,每个需要获取传值的地方重复使用这串代码即可
?>

这组代码主要用在表单input与request顺序一致的情况下使用,如果不能一一对应顺序的话,则会出现混乱。因此用的时候需要慎重!

提交数据库的时候可以考虑使用foreach的方式将获取的传参处理成数组再插入数据库会比较方便。

头像上传功能我们用到最多的就简单的flash+php来实现上传前剪切图片然后达到我们想要的效果了,下面我来给各位整理几个基于ci整合Avatar头像上传功能,希望例子能帮助到各位。

然后在控制器中调用即可:实现方法

 代码如下 复制代码

//重新设置session(防止新传头像无法显示)
$this->session->set_userdata('user_info',$user_info);
 
//项目决对路径
$base_path = rtrim(str_replace('\\','/', FCPATH),'/');
 
require APPPATH.'libraries/avatar.class.php';
 
$au = new avatar($base_path.'/uploads/user/'.$user_info['mid'].'/',$base_path.'/uploads/user/temp/','/uploads/user/','/faceapi/');
if(!$user_info['face']){
    $uid = 'uface_'.$user_info['mid'];
}else{
    $uid = $user_info['face'];
}
 
$this->data['urlAvatarBig']   = $user_info['face'] ? $au->getAvatarUrl($uid,'big') : (($this->user_info['sex']==0 )? static_url().'/uploads/user/dfgirl.png' : static_url().'/uploads/user/dfboy.png' );
$this->data['urlCameraFlash'] = $au->renderHtml($uid);
$this->data['uid'] = $uid;//头像标示
$this->load->view('center/member/edit_face',$this->data);


视图中的调用方法

 代码如下 复制代码


<div style="float:left;width:455px;height:253px;overflow:hidden;margin-left:10px;"><?php echo $urlCameraFlash ?></div>
 
<script type="text/javascript">
function updateavatar(){
    $('#userface').attr('src','/uploads/user/<?php echo $user_info['mid'].'/'.$uid?>_big.jpg?aid='+Math.random());
}
</script>

下面再来补充一下avatar.class.php了

 代码如下 复制代码

<?php
class avatar{
 public $savePath;
 public $tempPath;
 public $viewPath;
 public $urlPath;
 public $mid;
 public function __construct($savePath,$tempPath,$viewPath,$urlPath,$mid){
  $this->savePath=$savePath;
  $this->tempPath=$tempPath;
  $this->viewPath='http://'.$_SERVER['HTTP_HOST'].$viewPath;
  $this->urlPath='http://'.$_SERVER['HTTP_HOST'].$urlPath;
  $this->mid = $mid;

 }
 // 第一步:上传原始图片文件
 private function uploadAvatar($uid){
  // 检查上传文件的有效性
  if(empty($_FILES['Filedata'])){
   return -3; // No photograph be upload!
  }
  // 本地临时存储位置
  $tmpPath = $this->tempPath."{$uid}.jpg";
  // 如果临时存储的文件夹不存在,先创建它
  $dir=dirname($tmpPath);
  if(!file_exists($dir)){
   @mkdir($dir,0777, true );
  }
  // 如果同名的临时文件已经存在,先删除它
  if(file_exists($tmpPath)){
   @unlink($tmpPath);
  }
  // 把上传的图片文件保存到预定位置
  if ( @copy($_FILES['Filedata']['tmp_name'], $tmpPath) || @move_uploaded_file($_FILES['Filedata']['tmp_name'], $tmpPath)) {
   @unlink($_FILES['Filedata']['tmp_name']);
   list($width, $height, $type, $attr) = getimagesize($tmpPath);
   if ( $width < 10 || $height < 10 || $width > 3000 || $height > 3000 || $type == 4 ) {
    @unlink($tmpPath);
    return -2; // Invalid photograph!
   }
  } else {
   @unlink($_FILES['Filedata']['tmp_name']);
   return -4; // Can not write to the data/tmp folder!
  }

  // 用于访问临时图片文件的 url
  $tmpUrl =$this->viewPath."temp/{$uid}.jpg";
  return $tmpUrl;
 }
 private function flashdata_decode($s) {
  $r = '';
  $l = strlen($s);
  for($i=0; $i<$l; $i=$i+2) {
   $k1 = ord($s[$i]) - 48;
   $k1 -= $k1 > 9 ? 7 : 0;
   $k2 = ord($s[$i+1]) - 48;
   $k2 -= $k2 > 9 ? 7 : 0;
   $r .= chr($k1 << 4 | $k2);
  }
  return $r;
 }

 // 第二步:上传分割后的三个图片数据流
 private function rectAvatar( $uid ){
  // 从 $_POST 中提取出三个图片数据流
  $bigavatar    = $this->flashdata_decode( $_POST['avatar1'] );
  $middleavatar = $this->flashdata_decode( $_POST['avatar2'] );
  if ( !$bigavatar || !$middleavatar) {
   return '<root><message type="error" value="-2" /></root>';
  }
  
  //不存在目录,则创建
  if(!file_exists($this->savePath)){
   @mkdir($this->savePath,0777, true );
  }

  // 保存为图片文件
  $bigavatarfile    = $this->savePath."{$uid}_big.jpg";
  $middleavatarfile = $this->savePath."{$uid}_middle.jpg";

  $success = 1;
  $fp = @fopen($bigavatarfile, 'wb');
  @fwrite($fp, $bigavatar);
  @fclose($fp);

  $fp = @fopen($middleavatarfile, 'wb');
  @fwrite($fp, $middleavatar);
  @fclose($fp);

  // 验证图片文件的正确性
  $biginfo    = @getimagesize($bigavatarfile);
  $middleinfo = @getimagesize($middleavatarfile);
  if ( !$biginfo || !$middleinfo || $biginfo[2] == 4 || $middleinfo[2] == 4 ) {
   file_exists($bigavatarfile) && unlink($bigavatarfile);
   file_exists($middleavatarfile) && unlink($middleavatarfile);
   $success = 0;
  }
  // 删除临时存储的图片
  $tmpPath = $this->tempPath."{$uid}.jpg";
  @unlink($tmpPath);
  //临时保存头像
  $con=mysql_connect('localhost','root','root');
  mysql_select_db('zenyue');
  mysql_query("set names utf8");
  $sql="update zen_user set `face`='".$uid."' where mid='".$this->mid."'";
  mysql_query($sql);
  return '<?xml version="1.0" ?><root><face success="' . $success . '"/></root>';
 }
 // 从客户端访问头像图片的 url
 public function getAvatarUrl( $uid, $size='middle' ){
  $ci = &get_instance();
  $user_info = $ci->session->userdata('user_info');
  return $this->viewPath."{$user_info['mid']}/{$uid}_{$size}.jpg";
 }
 // 处理 HTTP Request
 // 返回值:如果是可识别的 request,处理后返回 true;否则返回 false。
 public function processRequest(){
  // 从 input 参数里拆解出自定义参数
  $arr = array();
  parse_str( $_GET['input'], $arr );
  $uid = $arr['uid'];
  if ( $_GET['a'] == 'uploadavatar') {
   // 第一步:上传原始图片文件
   echo $this->uploadAvatar( $uid );
   return true;
  } else if ( $_GET['a'] == 'rectavatar') {
   // 第二步:上传分割后的三个图片数据流
   echo $this->rectAvatar( $uid );
   return true;
  }
  return false;
 }
 // 编辑页面中包含 camera.swf 的 HTML 代码
 public function renderHtml( $uid ){
  // 把需要回传的自定义参数都组装在 input 里
  $ci = &get_instance();
  $user_info = $ci->session->userdata('user_info');
  $input = urlencode("uid={$uid}&FSESSIONID=".session_id().'&mid='.$user_info['mid']);
  $baseUrl = '/public/zen/js/avatar/';
  $uc_api = urlencode( $this->urlPath.'avatar.php');
  $urlCameraFlash = "{$baseUrl}camera.swf?m=user&inajax=1&appid=1&ucapi={$uc_api}&input={$input}&uploadSize=2048";
  $urlCameraFlash = '<script src="'.$baseUrl.'common.js?B6k" type="text/javascript"></script><script type="text/javascript">document.write(AC_FL_RunContent("width","455","height","253","scale","exactfit","src","'.$urlCameraFlash.'","id","mycamera","name","mycamera","quality","high","bgcolor","#ffffff","wmode","transparent","menu","false","swLiveConnect","true","allowScriptAccess","always"));</script>';
  return $urlCameraFlash;
 }
}

下面本文章重点给大家介绍关于php中nusoap调用java axis2发布的webservice例子,希望此例子能帮助大家。

调用webservice

开发环境是:Eclipse3.6 (java IDE)+ JDK 1.6 + Tomcat 7.0 + Axis2 1.6 + php 5.2.14 (IDE为eclipse-php-helios-SR1-win32.zip)+ apache2.2.15,这些软件随时都在更新,请读者谷歌百度一下到官网下载。

一、在java端编写服务,并利用axis2发布成服务

本文的服务名为sayHi,里面有一个函数sayHello():

 代码如下 复制代码
package Hi;
publicclass sayHi {
  public String sayHello(String user,String info) {
    return"Hello, My Friend "+ user + info;
  }
}

二、编写php客户端,调用axis2发布的webservice

2.1 下载nusoap.rar,将解压出来的lib文件夹添加到工程

2.2 编写客户端php,内容如下:

 代码如下 复制代码

<?php
require_once ("./lib/nusoap.php");

// 要访问的webservice路径
$NusoapWSDL="http://localhost:8080/axis2/services/sayHi?wsdl";

// 生成客户端对象
$client = new nusoap_client($NusoapWSDL);
//$client->soap_defencoding    =    'UTF-8';  
//$client->decode_utf8    =    false;

// 设置参数(注意:PHP只能以'数组集'方式传递参数)
$param = array( 'user' => '国假不旅游 ',
'info' => ' Welcome to my home!');

// 调用远程方法 'sayHello'为服务中的方法名
//'http://Hi'为wsdl文件中targetNamespace的值
$result = $client->call('sayHello', $param,'http://Hi');

// 显示执行结果
if (!$err=$client->getError()){ 
echo $result;   
}else{ 
echo $err; 

?>

三、执行结果为:

Hello, My Friend 国假不旅游 Welcome to my home!

webservice乱码问题

许多使用NuSoap 调用.NET WebService或J2EE WebService的朋友可能都遇到过中文乱码问题(我用的是PHP调用NuSoap),下面介绍这一问题的出现的原因和相应的解决方法。
NuSoap调用WebService出现乱码的原因:

通常我们进行WebService开发时都是用的UTF-8编码,这时我们需要设置:

$client->soap_defencoding = ‘utf-8′;

同时,需要让xml以同样的编码方式传递:

$client->xml_encoding = ‘utf-8′;

至此应该是一切正常了才对,但是我们在输出结果的时候,却发现返回的是乱码。

NuSoap调用WebService出现乱码的解决方法:

实际上,开启了调试功能的朋友,相信会发现$client->response返回的是正确的结果,为什么$result = $client->call($action, array(‘parameters’ => $param)); 却是乱码呢?

研究过NuSoap代码后我们会发现,当xml_encoding设置为UTF-8时,NuSoap会检测decode_utf8的设置,如果为true,会执行 PHP 里面的utf8_decode函数,而NuSoap默认为true,因此,我们需要设置:

下面来看一个使用php创建word文档的例子的,创建word文件处理类非常的简单,我们只要加载起来然后创建类再生成就可以了。

例子

 代码如下 复制代码

<?php
include("word.php");
$word=new word;
$word->start();
?>

<title>直接用php创建word文档</title>
 <h1>直接用php创建word文档</h1>
 作者:axgle
<hr size=1>
 <p>如果你打开word.doc,看到了这里的介绍,则说明word文档创建成功了。
<p>
不论是在什么操作系统下,使用本方法都可以直接用PHP生成word文档。绝对不是吹牛!
就算是没有安装word,也能够生成word文件。
当然了,生成的word文件可以用word,wps或者其他软件打开。
<p>
<b>使用方法:</b>
<br>
首先用$word->start()表示要生成word文件了。
然后你可以输出任何的HTML代码,不论是从文件读过来再写到这里,
还是直接在这里输出HTML,都没有关系。

<p>等你输出完毕后,用$word->save($path)方法,其中$path是你想
生成的word文件的名称(可以给出完整的路径).当你使用了$word->save()
方法后,这后面的任何输出都和word文件没有关系了,也就是说word的生成
工作就完成了。之后就和你平常使用php的方式一样拉。随便你输出什么东西,
都直接在浏览器里输出,而不会写到word里面去。
<p>这是本人想到的一个很有意思的方法,它的实现方法出人意料的简单,并且避免
了对windows环境的依赖。
<br>哈哈,很有意思吧?享受它吧!
<hr size=1>

 

 代码如下 复制代码

<?php
$word->save("data.doc");//保存word并且结束.

echo '
<title>直接用php创建word文档</title>
<h1>直接用php创建word文档</h1>
生成word了吗?在你的目录下看看有没有data.doc!
<br>
如果你用的是windows,并且安装得有word,可以查看<p>
<a href="data.doc" target=_blank>这里</a>';
?>

word.php文件

 代码如下 复制代码

<?php
class word

/*
@GNU:GPL
@author axgle <axgle@yahoo.com.cn>
@date 2005.4.20
*/

function start()
{
ob_start();
print'<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">';

}

function save($path)
{

print "</html>";
$data = ob_get_contents();

ob_end_clean();

$this->wirtefile ($path,$data);
}

function wirtefile ($fn,$data)
{

$fp=fopen($fn,"wb");
fwrite($fp,$data);
fclose($fp);
}

}

?>

referer是php用来判断页面上级来源页面的一个超级变局变量了,我们可以使用referer来判断是从那个页面进入到此页面了,这样我们可以进行更好的跟踪了,下面我就来给各位朋友整理了几种伪造页面referer来源例子,希望例子能给各位朋友。

file_get_contents方法

 代码如下 复制代码

$opt=array('http'=>array('header'=>"Referer: $refer"));
$context=stream_context_create($opt);
$file_contents = file_get_contents($url,false, $context);

分析:

file_get_contents中stream_context_create就伪造来源的重要参数了,这个什么好说的非常的简单。

CURL方式

 代码如下 复制代码

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.111cn.net");
curl_setopt ($ch, CURLOPT_REFERER, "http://www.111cn.net/");
curl_exec ($ch);
curl_close ($ch);

分析:

curl伪造来源页面非常的简单这是它的优点了,所以我们只要在页面加上curl_setopt ($ch, CURLOPT_REFERER, "http://www.111cn.net/");就可以了。

SOCKET方式

 代码如下 复制代码

$server = 'www.111cn.net';
$host = 'www.111cn.net';
$target = 'index.php';
$referer = 'http://www.111cn.net/'; // Referer
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp){
  echo "$errstr ($errno)\n";
}else{
$out = "GET $target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Referer: $referer\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)){
echo fgets($fp, 128);
}
fclose($fp);
}

友情提示:三种性能比对fsockopen是最好的哦。

我们再使用

 代码如下 复制代码

<?php
echo "<hr />";
echo $_SERVER["HTTP_REFERER"];
?>

你会发现获取到的就是我们的www.111cn.net了哦,当然为造地址可以自行设置哦。

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • JS中artdialog弹出框控件之提交表单思路详解

    artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口。本文给大家介绍JS中artdialog弹出框控件之提交表单思路详解,对本文感兴趣的朋友一起学习吧...2016-04-19
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • JavaScript仿支付宝密码输入框

    那么今天我就用JavaScript代码来实现这个效果吧,那么首先介绍一下整个的思路,首先我们先将确定输入密码的位数,我的需求是5位,那么就用一个div标签包住5个input标签...2016-01-02
  • jquery获取tagName再进行判断

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].tagName 或: $(element).get(0).tagName...2014-05-31
  • DOM XPATH获取img src值的query

    复制代码 代码如下:$nodes = @$xpath->query("//*[@id='main_pr']/img/@src");$prurl = $nodes->item(0)->nodeValue;...2013-10-04
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序。这是中国人大多数使用的排序方法。那么在php程序中该如何操作呢?下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的大多数是有问题的...2015-10-23
  • 使用C#获取系统特殊文件夹路径的解决方法

    本篇文章是对使用C#获取系统特殊文件夹路径的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • php如何获取文件的扩展名

    网上也有很多类似的方法,不过都存在这样那样的不严谨的问题,本文就不一一分析了,这里只给出最正确的利用php 获取文件扩展名(文件后缀名)的方法。 function get_extension($filename){ return pathinfo($filename,PATHIN...2015-10-30
  • angularjs $http实现form表单提交示例

    这篇文章主要介绍了angularjs $http实现form表单提交示例,非常具有实用价值,需要的朋友可以参考下 ...2017-06-15
  • 基于JavaScript获取鼠标位置的各种方法

    这篇文章主要介绍了基于JavaScript获取鼠标位置的各种方法 ,需要的朋友可以参考下...2015-12-18
  • C#获取变更过的DataTable记录的实现方法

    这篇文章主要介绍了C#获取变更过的DataTable记录的实现方法,对初学者很有学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • vue项目,代码提交至码云,iconfont的用法说明

    这篇文章主要介绍了vue项目,代码提交至码云,iconfont的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30