破解什么代码的时候。用到这个代码就最好不过了。马上收藏起来。以后可以使用。下面说说使用这个 PHP获取指定函数定义在哪个文件中 函数的方法。这需要顺便定义一个function XX() 就OK了
使用方法
function a(){ } function_dump('a');
然后就可以了 下面是核心代码
function function_dump($funcname) { try { if(is_array($funcname)) { $func = new ReflectionMethod($funcname[0], $funcname[1]); $funcname = $funcname[1]; } else { $func = new ReflectionFunction($funcname); } } (ReflectionException $e) { echo $e->getMessage(); return; } $start = $func->getStartLine() - 1; $end = $func->getEndLine() - 1; $filename = $func->getFileName(); echo "function $funcname defined by $filename($start - $end)\n"; }
数组与Json格式其实是非常像了,我们可以利用相关的函数来进行相互转换的,下面来给各位整理一个从mysql读取数据之后再利用php函数转换成json回传,具体如下
数组转Json
<?php header("Content-Type: text/html; charset=utf-8"); $mydb=mysql_connect("localhost","root","root"); if (!$mydb){ die('Could not connect:'. mysql_error()); } $db_selected=mysql_select_db("mysql",$mydb); //$sql = "SELECT * from Person WHERE Lastname='Adams'"; $sql="SELECT * from user"; $result=mysql_query($sql,$mydb); //print_r(mysql_fetch_array($result)); //处理输出数组格式 //$db1=mysql_query("select * from `tb_info`"); /* $arr=array(); while($rows=mysql_fetch_array($db1)){ $key=$rows['id'] $arr[$key] = $rows['qucount'] } */ /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, 'urlencode', true); $json = json_encode($array); return urldecode($json); } $array = array ( 'Name'=>'希亚', 'Age'=>20 ); /* $array=array ( 0 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 1 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 2 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '25', 'name' => '男士', 'province' => '上海', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 3 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '186****1046', ), 4 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '200元的爱玛电动车代金券', 'mobile' => '186****1046', ), 5 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 6 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 7 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 8 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '河南', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 9 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 10 => array ( 'icon' => array ( 'hasPhoto' => '1', 'photoPath' => '/201412/11/11/49/1418269782350A03EA57_c.jpg', ), 'age' => '20', 'name' => '白日做梦', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), ); */ echo JSON($array); ?>
json对象转成
普通数组 也就是 Array 的最简单方法还是 用 json_decode() 方法,只需要在后面多写一个参数就可以搞定
json_decode($json,true);
这样就可以将 json 转换成数组形式了,key 保持原来格式
$json = ’{“name”:”zhangsan”,”age”:20,”sex”:”nan”}’; print_r(json_decode($json,true));
这样的json数据解析后 就会成为下面这样的数组
Array
(
[name] => zhangsan
[age] => 20
[sex] => nan
)
数组转json 中文字符
<?php $josin=array( '0'=>array( 'name'=>'四海一家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '1'=>array( 'name'=>'四海二家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '2'=>array( 'name'=>'四海三家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '3'=>array( 'name'=>'四海四家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '4'=>array( 'name'=>'四海五家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), ); $k=JSON($josin); echo $k; /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, 'urlencode', true); $json = json_encode($array); return urldecode($json); }表单重复提交肯定不是 们所需要的了我们最多的办法就是直接使用php查询数据库进行处理了,今天我整理了不需要查询数据库就可以防止用户重复提交的三种方法
js 阻止重复提交
第一个是将告诉浏览器禁用submit按钮的表单被提交之后,第二个是将更改按钮的文本来给用户一些知道发生了什么。这是代码添加到你的表单标记:onsubmit="document.getElementById('myButton').disabled=true;document.getElementById('myButton').value='Submitting, please wait...';"你的表单标记将类似于:
或jquery做法
$(document).ready(function(){
$(input:submit).click(){
setTimeout(function(){obj.disabled=true;},100)
};
});
PHP程序员就是这样实现防止用户多表单提交的;这种方法应用于大多数的浏览器(IE +,FireFox、Opera、…)。
Session阻止重复提交
由于表单变量的内容由$_POST[‘name’]引用,也许在处理完表单后,直接将$_POST[‘name’]销毁(unset())即可, 其实不然可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST[‘name’],刷新后,$_POST[‘name’]还是会被赋值,一 样有效。
可利用Session解决。首先给Session赋个值,比如400,第一次提交成功后改变Session的值,当第二次提交时去检查这个Session的值,如果不是400,就不再处理表单中的数据。 可设置Session的有效时间?
<?php
if (isset($_POST[‘action’]) && $_POST[‘action’] == ’submitted’) {
session_start();
isset($_SESSION[‘num’]) or die (“no session”);
if ($_SESSION[‘num’]==400){
echo ‘<a href=”‘.$_SERVER[PHP_SELF] .'”>Please try again</a>';
$_SESSION[‘num’]=500;
} else {
echo “However you have submitted”;
}
} else {
session_start() or die(“session is not started”);
$_SESSION[‘num’]= 400;
?>
<form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”POST”>
Name: <input type=”text” name=”personal[name]”><br>
Email: <input type=”text” name=”personal[email]”><br>
Beer: <br>
<select multiple name=”beer[]”>
<option value=”warthog”>Warthog</option>
<option value=”guinness”>Guinness</option>
<option value=”stuttgarter”>Stuttgarter Schwabenbr</option>
</select><br>
<input type=”hidden” name=”action” value=”submitted”>
<input type=”submit” name=”submit” value=”submit me!”>
</form>
<?php
}
?>
cookie阻止重复提交
引入cookie机制来解决(这个方法不建议用,原因后面会写到)
提交页面代码如下a.php代码如下:
<form id="form1" name="form1" method="post" action="b.php">
<p>说明
<input type="text" name="titile" />
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
<?php
setcookie("onlypost", 't'); //设置cookie,可以带上时间值。像有些论坛防止灌水就可以将你的一些基本信息存放到里面。
?>
处理页面b.php代码如下:
<?php
if($_COOKIE['onlypost'] == 't'){
printr($COOKIE);
//处理提交的内容 如果验证成功则处理
print "ok";
setcookie("onlypost", 'f'); //改变cooike值删除也可以了
}
?>
利用header函数跳转
一旦用户点击提交按钮,处理完数据后跳到其他页面
if (isset($_POST['submit'])) {
header('location:success.php');//处理数据后,转向到其他页面
}
利用数据库来添加约束
直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,
或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全
远程出于安全因素考虑,直接跨域访问是不允许的,下面介绍二种跨域的方法。
一,通过php curl
function curlPost($url,$params)
{
$postData = '';
foreach($params as $k => $v)
{
$postData .= $k . '='.$v.'&';
}
rtrim($postData, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, count($postData));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$output=curl_exec($ch);
curl_close($ch);
return $output;
}
echo curlPost("http://111cn.net",array('name'=>"tank"));
以前很多人用curl来抓,邮箱的通讯录,不过现在已经不可以了。哈哈。
二,利用jquery form,ajax提交
1,下载jquery.form.js
2,js代码
$('#testform').submit(function() {
$(this).ajaxSubmit({
type: 'post', // 提交方式 get/post
dataType:"json",//数据类型
url: 'your url', // 需要提交的 url
success: function(data) { // data 保存提交后返回的数据,一般为 json 数据
// 此处可对 data 作相关处理
alert('提交成功!');
}
$(this).resetForm(); // 提交后重置表单
});
return false; // 阻止表单自动提交事件
});
3,php代码
header("Access-Control-Allow-Origin:*"); //跨域权限设置,允许所有
header("Access-Control-Allow-Origin:http://www.111cn.net"); //只允许111cn.net跨域提交数据
类实现想法是:先把要打印的数据都收集起来,在用js调用window打印函数。目前就使用于IE。
类提供打印排队功能。(PS,说白了就是一条一条读取数据)
代码如下 | 复制代码 |
class Wprint{ //收集打印代码 private $data = array(); //处理打印代码 private $handle; public function __construct() { header("Content-type:text/html;charsetutf-8"); $this->link(); //链接数据库 $this->collect($_POST["username"],$_POST["content"],$_POST["ip"]); $this->handle(); } //链接数据库 private function link() { $link = mysql_connect('localhost', 'root', '123456'); mysql_select_db('shen', $link); mysql_query('SET NAMES utf8'); } //收集打印代码 private function collect($username,$content,$ip) { $code["username"] = $username; $code["content"] = $this->check($content); $code["ip"] = $ip; $code["state"] = 0; $code["priority"] = 0; array_push($this->data,$code);//数据节点入栈 } //处理打印代码入库 private function handle() { foreach($this->data as $value) { $sql = "insert into print(username,content,ip,state,priority) values('{$value["username"]}','{$value["content"]}', '{$value["ip"]}','{$value["state"]}','{$value["priority"]}')"; $query = mysql_query($sql); if($query) { $id = mysql_insert_id(); //获取最近insert操作得到的ID echo "数据收集成功,正在排队打印,排队ID为".$id; $this->num($id); } else { echo "数据收集失败,请3秒后再一次提交"; } } } //检查传人数据是否为空 private function check($string) { if(strlen($string) == 0 || $string == " ") { echo "数据收集失败,打印内容为空"; exit; }else { return $string; } } //获取打印排队人数 private function num($id) { $sql = "select id from print where state=0 and id<".$id." order by id asc"; $query = mysql_query($sql); $num = mysql_num_rows($query); echo ",您前面还有".$num."个人在排队"; } //打印数据 public function Yprint() { $sql = "select id,content from print where state=0 order by id asc limit 1"; $query = mysql_query($sql); $row = mysql_fetch_array($query); if(!empty($row["content"])) { echo "<script tyle=\"text/javascript\"> window.print(); </script>"; $id = $row["id"]; $sql = "update print set state=1 where id=".$id; mysql_query($sql); echo "打印处理完成"; }else { echo $row["content"]; } } } |
思想很简单,收集数据再一个一个处理。 这样就不仅解决了网络打印的问题,还避免了网络打印打印过程排队的问题