PHP判断自定义函数定义所在文件

 更新时间:2016年11月25日 15:36  点击:2000
函数可以通过样相关函数找到位置这个问题小编还是第一次听过了,不过这个函数小编测试还真是有效了,下面来看这两段代码

破解什么代码的时候。用到这个代码就最好不过了。马上收藏起来。以后可以使用。下面说说使用这个 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');//处理数据后,转向到其他页面
}

利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,
或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全

我们知道浏览器因为考虑到安全问题一般情况下是不支持跨域提交form表单了,但有时我们工作又需要了,下面就来看看一篇跨域提交form表单例子。

远程出于安全因素考虑,直接跨域访问是不允许的,下面介绍二种跨域的方法。

一,通过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来调用打印机来打印,如果打印完了把记录删除,再执行一条打印了,具体代码如下。

类实现想法是:先把要打印的数据都收集起来,在用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"];
         }
      }
   }

思想很简单,收集数据再一个一个处理。 这样就不仅解决了网络打印的问题,还避免了网络打印打印过程排队的问题

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Vue 组件复用多次自定义参数操作

    这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • 自定义jquery模态窗口插件无法在顶层窗口显示问题

    自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
  • 自定义feignClient的常见坑及解决

    这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20