PHP开发过程中常见问题快速解决

news2024/12/29 13:41:10

1.PHP解决文件名不合法,无法创建

   文件名称不能含有 /\:*?"<>|符号,直接替换关键词就OK了

$search = array('*','$','\\','/',"'",'"','*','?',':','<','>','|',' ','[',']','【','】','(',')','(',')');
$name="1=:.php";
$new_name=str_replace($search, '_',$name);

2.PHP判断文件名合法性

function isValidFileName($fileName) {
    // 定义合法字符范围(只包含英文、数字、点号和连接线)
    $validChars = '[a-zA-Z0-9\.\-\_]';
    
    // 构建正则表达式模式
    $pattern = '/^' . $validChars . '{1,256}$/u';
    
    return preg_match($pattern, $fileName);
}
 
// 测试函数
$fileNames = ['test.txt', '.hidden', '_temp', 'my file!'];
foreach ($fileNames as $fileName) {
    if (isValidFileName($fileName)) {
        echo "{$fileName} 是有效的文件名" . PHP_EOL;
    } else {
        echo "{$fileName} 不是有效的文件名" . PHP_EOL;
    }
}

3.PHP获取数据库所有数据表名_PHP获取数据表结构_PHP获取获取数据表索引结构

        示例如下,变量$DB为pdo连接数据库

        PHP获取数据库所有表名:

<?
$query = "SHOW TABLES";
$rs=$DB->query($query);
if($rs!=null){ foreach($rs as $res){ $tables[]=$res; } }
if(is_array($tables)){  $tables=array_unique(array_flatten($tables)); } //获取数据库全部数据表名
print_r($tables); //打印结果


function array_flatten($array) { //多维转一维数组
    $result = array();
    foreach ($array as $value) {
        if (is_array($value)) {
            $result = array_merge($result, array_flatten($value));
        } else {
            array_push($result, $value);
        }
    } return $result; }

PHP获取数据表结构:

$table _name='seo_article'; //数据表名
$re=$DB->query("SHOW FULL FIELDS FROM $table _name"); 
foreach($re as $rowe){ $table[$rowe['Field']]=$rowe; } //数据表结构
print_r($table); //打印结果

PHP获取数据表索引结构:

$table _name='seo_article'; //数据表名
$stmt=$DB->query("SHOW INDEX FROM $table _name"); //获取数据表索引结构
while($row = $stmt->fetch()){ $index[]=$row; }
print_r($index); //打印结果

4.PHP数组重新排序方式大全

一、常见的排序方式

PHP为开发者提供了多种排序方式,包括:

  1. sort(): 对数组进行升序排序
  2. rsort(): 对数组进行降序排序
  3. asort(): 对数组进行升序排序,并保留键值关系
  4. ksort(): 对数组按键名进行升序排序
  5. arsort(): 对数组进行降序排序,并保留键值关系
  6. krsort(): 对数组按键名进行降序排序
  7. usort(): 对数组使用用户自定义的比较函数进行排序
  8. uasort(): 对数组使用用户自定义的比较函数进行排序,并保留键值关系
  9. uksort(): 对数组使用用户自定义的比较函数按键名进行排序
  10. PHP根据数组元素值长度排序:

function start($array){
        uasort($array, function ($a, $b) {
        return strlen($a) > strlen($b); // 改为  < 就变成了降序排序
        });  return ($array); }

5.PHP数组值拼接成字符串 ,将数组元素组合为字符串       

        推荐:implode()函数与join()函数

        说明:join() 是 implode() 的别名函数,俩者没有区别

join(separator,string,limit)

参数描述
glue连接数组元素的字符
array需要组合为字符串的数组

代码示例:

<?php
$array = array('姓名', '电话', '电子邮箱');
$char = join("-", $array);
echo $char; //输出结果姓名-电话-电子邮箱
?>

6.PHP将多维数组转为一维数组      

当遇见多维数组数据太多,不好提取重要值时,则需要转为一维数组

方法1:递归函数

可以使用递归函数来实现多维数组转换为一维数组。下面是使用递归函数的示例代码:

function array_flatten($array) {
    $result = array();
    foreach ($array as $value) {
        if (is_array($value)) {
            $result = array_merge($result, array_flatten($value));
        } else {
            array_push($result, $value);
        }
    }
    return $result;
}

方法2:array_walk_recursive()函数

array_walk_recursive()函数可以遍历多维数组中的所有元素,并将其添加到新的一维数组中。下面是使用该函数的示例代码:

function array_flatten($array) {
    $result = array();
    array_walk_recursive($array, function($value) use (&$result) {
        array_push($result, $value);
    });
    return $result; }

7.PHP判断日期时间格式是否正确

        原理:Date() 函数把时间戳格式化为可读性更好的日期和时间,再进行判断,若前后结果不一致 则肯定是不正确的

$date='2024-08-22';
if(date('Y-m-d',strtotime($date)) != $date){ echo'不正确'; }

$date='2024-08-22 0:00:00'; //判断达到时分秒
if(date('Y-m-d H:i:s',strtotime($date)) != $date){ echo'不正确'; }

8.PHP各种将字符串转换为大小写

将所有字母转换为大写

$str = "phil丶Annuo";
$str = strtoupper($str);
echo $str; //输出:PHIL丶ANNUO

将所有字母转换为小写

$str = "PHIL丶ANNUO";    //定义需要转换的字符串
$str = strtolower($str);
echo $str; //输出:phil丶Annuo

将字符串中每个单词的首字母转换为大写

$foo = '晓柠笔创Annuo ydtdml_com annuo';
$foo = ucwords($foo);
echo $foo; //输出:晓柠笔创Annuo Ydtdml_com Annuo

将首个字符转换为大写

$foo = 'annuo ydtdml_com';
$foo = ucfirst($foo);
echo $foo;//输出:Annuo ydtdml_com

将末尾字符转换为大写

$foo='annuo';
$foo=ucfirst(strrev($foo)); //strrev反转顺序
$foo=strrev($foo); echo $foo; //输出:annuO

9.PHP将字符串解析成变量或数组_PHP解析cookie字符串为数组并还原为字符串

parse_str() 函数把字符串解析到变量中。

注释:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。


语法

parse_str(string,array)

参数描述
string必需。规定要解析的字符串。
array可选。规定存储变量的数组名称。该参数指示变量存储到数组中。
<?php
parse_str("name=晓柠&age=笔创");
echo $name."==".$age;
//运行结果:晓柠==笔创
?>

例如,假设有如下cookie字符串:

foo=bar; baz=qux; name=John%20Doe

可以使用以下代码解析:

$cookieStr = 'foo=bar; baz=qux; name=John%20Doe';
parse_str(str_replace('; ', '&', $cookieStr), $cookies);
print_r($cookies);

输出结果为

Array
(
    [foo] => bar
    [baz] => qux
    [name] => John Doe
)

解释

  1. str_replace('; ', '&', $cookieStr) 将cookie字符串中的分号和空格替换为&符号,以便使用parse_str()函数解析。

  2. parse_str()函数将解析后的cookie键值对保存在$cookies数组中。

  3. print_r()函数输出数组内容。

    还原字符串

    可以使用PHP内置的函数http_build_query()将数组转换为URL编码的查询字符串,然后再替换掉一些特殊字符,即可得到Cookie字符串。

例如,假设有如下数组:

$cookies = array(    'foo' => 'bar',    'baz' => 'qux',    'name' => 'John Doe');

可以使用以下代码将其转换为Cookie字符串:

$cookieStr = http_build_query($cookies);$cookieStr = str_replace(['&', '='], ['; ', '='], $cookieStr);echo $cookieStr;

输出结果为:

foo=bar; baz=qux; name=John+Doe

解释:

  1. http_build_query()函数将数组转换为URL编码的查询字符串。

  2. str_replace()函数将查询字符串中的&符号替换为分号和空格,将=符号替换为=号,以得到Cookie字符串。

10.PHP explode函数详解_字符串分隔_字符串打散为数组

explode定义和用法

explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。

注释:"separator" 参数不能是一个空字符串。

注释:该函数是二进制安全的。


语法

explode(separator,string,limit)

参数描述
separator必需。规定在哪里分割字符串。
string必需。要分割的字符串。
limit可选。规定所返回的数组元素的数目。

可能的值:

  • 大于 0 - 返回包含最多 limit 个元素的数组

  • 小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组

  • 0 - 会被当做 1, 返回包含一个元素的数组

使用 limit 参数来返回一些数组元素:

<?php

$str = 'one,two,three,four';

//  返回包含一个元素的数组
print_r(explode(',',$str,0));print "<br>"; 
// 数组元素为 
2print_r(explode(',',$str,2));print "<br>"; 
// 删除最后一个数组元素
print_r(explode(',',$str,-1));?>
运行结果:
Array
(
    [0] => one,two,three,four
)

Array
(
    [0] => one
    [1] => two,three,four
)

Array
(
    [0] => one
    [1] => two
    [2] => three
)

小提示:join() 函数可将数组元素合并成一个字符

echo join('分隔符',$array);

11.PHP获取某字符出现的次数

PHP计算获取某字符出现的次数,比较少用到的函数,所以手生,记录一下防止又去百度翻阅!

$str='晓柠笔创-晓柠资源-晓柠公众号';
echo substr_count($str,"晓柠");
输出结果:2

12.PHP unicode编码转中文

//用于json_encode编码后
function unicode_decode($str){ //unicode转中文
return preg_replace_callback("#\\\u([0-9a-f]{4})#i",
function ($r) {return iconv('UCS-2BE', 'UTF-8', pack('H4', $r[1]));},
$str); }
echo unicode_decode('\u6D4B\u8BD5\u4E00\u4E0B'); //运行结果:测试一下

13.PHP获取文件夹内最新多个文件名

PHP获取文件夹内最新的50个文件名称

$dir_list=@printdir($dir);
krsort($dir_list);//根据键名(文件时间) 大到小重新排序

function printdir($dir){ 
    $files = array();
    //opendir() 打开目录句柄
    if($handle = @opendir($dir)){
    //readdir()从目录句柄中(resource,之前由opendir()打开)读取条目,
    //如果没有则返回false
        while(($file = readdir($handle)) !== false){//读取条目
            if( $file != ".." && $file != "."){//排除根目录
                if(is_dir($dir . "/" . $file)) {//如果file 是目录,则递归
                    $files[$file] = printdir($dir . "/" . $file);
                } else {
                    //获取文件修改日期
                    $filetime = date('Y-m-d H:i:s', filemtime($dir ."/". $file));
                    //文件修改时间作为健名
                    $files[$filetime] = $file; 
                $i++; if($i==50){ return $files; break; } //最多获取多少个文件名,多了怕卡
                }
            }
        }
        @closedir($handle);
        return $files;
    }
}

14.PHP与JS屏蔽电脑端代码

JS屏蔽电脑端代码,屏蔽win电脑端与苹果笔记本Mac(屏蔽后会跳转指定网址),感觉这个比PHP屏蔽好用一点(因为一般别人在F12控制台伪造了UA 也会被屏蔽)

<script type="text/javascript"> 
    var system ={ 
        win : false, 
        mac : false, 
        xll : false
    };
    var p = navigator.platform; 
    system.win = p.indexOf("Win") == 0; 
    system.mac = p.indexOf("Mac") == 0; 
    system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);
    if(system.win||system.mac||system.xll){   
        window.location.href="https://baidu.com"; //跳转地址
    }</script>

话不多说了,上PHP屏蔽代码

<?php
function strexists2($string, $find) { return !(strpos($string, $find) === false); }
function deep_in_array2($value, $array) { 
        foreach($array as $item) {   
            if(!is_array($item)) {   
              if (strpos($value, $item) !== false) {   
                    return true;  
                } else {  continue; } }   
                
            if(in_array($value, $item)) {  
                return true;      
            } else if(deep_in_array($value, $item)) {  
                return true;      
            }  
        }   return false;   }			
			
function mobile() {
	$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
	$ualist = array('android', 'midp', 'nokia', 'mobile', 'iphone', 'ipod', 'blackberry', 'windows phone');
	if((deep_in_array2($useragent, $ualist) || strexists2($_SERVER['HTTP_ACCEPT'], "VND.WAP") || strexists2($_SERVER['HTTP_VIA'],"wap")))
if(strpos($useragent,'iphone')!==false||strpos($useragent,'ipod')!==false) return '苹果'; else return '安卓';
	else
  return '电脑'; }
 
if(mobile()=='电脑'){ exit(header("location:https://baidu.com")); } //跳转地址

15.PHP从网址URL里面提取域名

PHP利用parse_url函数从网址里面获取出域名

$url='https://blog.csdn.net/qq_35997094/article/details/90487548';

$host=parse_url($url);
$host=$host['host'];
echo $host;  //输出结果:blog.csdn.net

PHP获取一级域名,可根据URL获取也可根据二级域名获取出

<?
$domain="www.ydtdml.com";
echo get_host($domain);

function get_host($domain=""){
    $url = $domain ? $domain : $_SERVER["HTTP_HOST"];
    $url=str_replace(['http://','https://','/'],null,$url); 
    $dual_host = array('aaa.pro','ac.cn','ac.kr','ac.mu','aca.pro','acct.pro','ae.org','ah.cn','ar.com','avocat.pro','bar.pro','biz.ki','biz.pl','bj.cn','br.com','busan.kr','chungbuk.kr','chungnam.kr','club.tw','cn.com','co.ag','co.am','co.at','co.bz','co.cm','co.com','co.gg','co.gl','co.gy','co.il','co.im','co.in','co.je','co.kr','co.lc','co.mg','co.ms','co.mu','co.nl','co.nz','co.uk','co.ve','co.za','com.af','com.ag','com.am','com.ar','com.au','com.br','com.bz','com.cm','com.cn','com.co','com.de','com.ec','com.es','com.gl','com.gr','com.gy','com.hn','com.ht','com.im','com.ki','com.lc','com.lv','com.mg','com.ms','com.mu','com.mx','com.nf','com.pe','com.ph','com.pk','com.pl','com.ps','com.pt','com.ro','com.ru','com.sb','com.sc','com.se','com.sg','com.so','com.tw','com.vc','com.ve','cpa.pro','cq.cn','daegu.kr','daejeon.kr','de.com','ebiz.tw','edu.cn','edu.gl','eng.pro','es.kr','eu.com','fin.ec','firm.in','fj.cn','game.tw','gangwon.kr','gb.com','gb.net','gd.cn','gen.in','go.kr','gov.cn','gr.com','gs.cn','gwangju.kr','gx.cn','gyeongbuk.kr','gyeonggi.kr','gyeongnam.kr','gz.cn','ha.cn','hb.cn','he.cn','hi.cn','hk.cn','hl.cn','hn.cn','hs.kr','hu.com','hu.net','idv.tw','in.net','incheon.kr','ind.in','info.ec','info.ht','info.ki','info.nf','info.pl','info.ve','jeju.kr','jeonbuk.kr','jeonnam.kr','jl.cn','jp.net','jpn.com','js.cn','jur.pro','jx.cn','kg.kr','kiwi.nz','kr.com','law.pro','ln.cn','me.uk','med.ec','med.pro','mex.com','mo.cn','ms.kr','ne.kr','net.af','net.ag','net.am','net.br','net.bz','net.cm','net.cn','net.co','net.ec','net.gg','net.gl','net.gr','net.gy','net.hn','net.ht','net.im','net.in','net.je','net.ki','net.lc','net.lv','net.mg','net.mu','net.my','net.nf','net.nz','net.ph','net.pk','net.pl','net.ps','net.ru','net.sb','net.sc','net.so','net.vc','net.ve','nm.cn','no.com','nom.ag','nom.co','nom.es','nom.ro','nx.cn','or.at','or.jp','or.kr','or.mu','org.af','org.ag','org.am','org.bz','org.cn','org.es','org.gg','org.gl','org.gr','org.hn','org.ht','org.il','org.im','org.in','org.je','org.ki','org.lc','org.lv','org.mg','org.ms','org.mu','org.my','org.nz','org.pk','org.pl','org.ps','org.ro','org.ru','org.sb','org.sc','org.so','org.uk','org.vc','org.ve','pe.kr','pro.ec','qc.com','qh.cn','radio.am','radio.fm','re.kr','recht.pro','ru.com','sa.com','sc.cn','sc.kr','sd.cn','se.com','senet','seoul.kr','sh.cn','sn.cn','sx.cn','tj.cn','tw.cn','uk.com','uk.net','ulsan.kr','us.com','us.org','uy.com','web.ve','xj.cn','xz.cn','yn.cn','za.com','zj.cn'); 
    $url_arr   = explode(".", $url);
    if (count($url_arr) <= 2) {
        $host = $url;
    } else {
        $last   = array_pop($url_arr);
        $last_1 = array_pop($url_arr);
        $last_2 = array_pop($url_arr);
        $host   = $last_1.'.'.$last;
        if (in_array($host, $dual_host)) {
            $host = $last_2.'.'.$last_1.'.'.$last;
        }
    }
    return $host;}
?>

输出结果:ydtdml.com

16.PHP使用array_diff优雅的删除数组中指定的value值

在开发过程中经常需要删除数组中某个值;
比如说有个数组;

$names = [
    '张三',
    '李四',
    '王麻子'
]

我们希望删除 李四 这个值;
常规的思路是先用 array_search 函数获取 李四 在 $names 中的键名;
然后使用 unset 删除;
为了严谨还得判断李四是否存在;

$key = array_search('李四', $names);
if ($key !== false) {
    unset($names[$key]);
}

这里有个坑是为了避免要删除的值在数组第0个位置的时候;
此处不能使用 if($key) 来判断;
而是应该使用if ($key !== false) ;
另外unset 不会重新格式化数组的key
操作完后会是这个样子的;

这个0和2少了1很是难受;
上面这两种操作中我们还可以用 array_splice 替代 unset

if ($key !== false) {
    array_splice($names, $key, 1);
}

而且一旦数组中有多个李四

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四'
];

那上面这种方式还只能删除第一个李四;
如果要删除全部的李四就需要循环了;

foreach ($names as $k => $v) {
    if ($v === '李四') {
        unset($names[$k]);
    }
}

除了上面这些常规操作;
还有一个骚操作是利用 array_flip 两次反转数组;

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四',
];
$names = array_flip($names);
unset($names['李四']);
$names = array_flip($names);

如果王麻子也有两个的话;
因为键名不能重复的原因;
这种操作后只会保留1个王麻子;
因此这种方式不够完美;
到了最后;
拿出了标题中的array_diff
array_diff 本来是用来计算数组的差集;
不过根据我们小学学过的知识扩展下;
这个求差集可以用来删除数组指定的值;
如果忘了差集的概念;

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四',
];
$names = array_diff($names, ['李四']);

array_diff 跟 unset 一样并不会格式化键名;
如果需要格式化键名;
就再加个 array_value

$names = [
    '张三',
    '李四',
    '王麻子',
    '李四',
];
$names = array_values(array_diff($names, ['李四']));

17.PHP获取数组内字符串最长的元素值_php输出数组的内长度最大的值

PHP获取数组内字符串长度最大的元素值

小提示:strlen中文字计算为长度3,mb_strlen中文字计算为长度1

   function get_array_long($array) { 
        $index = 0;
        foreach ($array as $k => $v) {
            if (strlen($array[$index]) < strlen($v)) //灵位运用:修改为>则获取长度最小的值
                $index = $k;
        }
        return $array[$index]; }

18.PHP文件操作 - 替换某行,插入某行,删除某行,获取行号

<?php

replaceTarget("test.txt", "aaaaaaaaaaaaaaaaa", "AAAAA");

#查找内容行数后 替换此行内容
function replaceTarget($filePath, $replaceCont, $target){
    $result = null;
    $fileCont = file_get_contents($filePath);
    $targetIndex = strpos($fileCont, $target); #查找目标字符串的坐标

    if ($targetIndex !== false) {
        #找到target的前一个换行符
        $preChLineIndex = strrpos(substr($fileCont, 0, $targetIndex + 1), "\n");
        #找到target的后一个换行符
        $AfterChLineIndex = strpos(substr($fileCont, $targetIndex), "\n") + $targetIndex;
        if ($preChLineIndex !== false && $AfterChLineIndex !== false) {
            #删掉指定行,插入新内容
            $result = substr($fileCont, 0, $preChLineIndex + 1) . $replaceCont . "\n" . substr($fileCont, $AfterChLineIndex + 1);
            file_put_contents($filePath, $result);
            //$fp = fopen($filePath, "w+");
            //fwrite($fp, $result);
            //fclose($fp);
        }
    }
}

#在需要查找的内容后 新起一行插入内容
function insertAfterTarget($filePath, $insertCont, $target)
{
    $result = null;
    $fileCont = file_get_contents($filePath);
    $targetIndex = strpos($fileCont, $target); #查找目标字符串的坐标

    if ($targetIndex !== false) {
        #找到target的后一个换行符
        $chLineIndex = strpos(substr($fileCont, $targetIndex), "\n") + $targetIndex;
        if ($chLineIndex !== false) {
            #插入需要插入的内容
            $result = substr($fileCont, 0, $chLineIndex + 1) . $insertCont . "\n" . substr($fileCont, $chLineIndex + 1);
            file_put_contents($filePath, $result);
            //$fp = fopen($filePath, "w+");
            //fwrite($fp, $result);
            //fclose($fp);
        }
    }
}

#删除内容所在的某一行
function delTargetLine($filePath, $target)
{
    $result = null;
    $fileCont = file_get_contents($filePath);
    $targetIndex = strpos($fileCont, $target); #查找目标字符串的坐标

    if ($targetIndex !== false) {
        #找到target的前一个换行符
        $preChLineIndex = strrpos(substr($fileCont, 0, $targetIndex + 1), "\n");
        #找到target的后一个换行符
        $AfterChLineIndex = strpos(substr($fileCont, $targetIndex), "\n") + $targetIndex;
        if ($preChLineIndex !== false && $AfterChLineIndex !== false) {
            #重新写入删掉指定行后的内容
            $result = substr($fileCont, 0, $preChLineIndex + 1) . substr($fileCont, $AfterChLineIndex + 1);
            file_put_contents($filePath, $result);
            //$fp = fopen($filePath, "w+");
            //fwrite($fp, $result);
            //fclose($fp);
        }
    }
}

#获取某段内容的行号
/**
 * @param $filePath
 * @param $target   待查找字段
 * @param bool $first   是否再匹配到第一个字段后退出
 * @return array
 */
function getLineNum($filePath, $target, $first = false)
{
    $fp = fopen($filePath, "r");
    $lineNumArr = array();
    $lineNum = 0;
    while (!feof($fp)) {
        $lineNum++;
        $lineCont = fgets($fp);
        if (strstr($lineCont, $target)) {
            if($first) {
                return $lineNum;
            } else {
                $lineNumArr[] = $lineNum;
            }
        }
    }
    return $lineNumArr;
}

19.PHP将数组键与数组值全部转为大写小写的方法

PHP将数组键名全部转为大小写的简单方法:

$result = array_change_key_case($Array, CASE_LOWER); //键名转小写


$result = array_change_key_case($Array, CASE_UPPER ); //键名转大写
print_r($result);

PHP将数组值全部转为大小写的方法:

$result = array_map('strtolower',$myArray); //数组值转小写

$result = array_map('strtoupper',$myArray); //数组值转大写
print_r($result);

20.PHP判断数据是否是XML格式

function iss_xml($content){    //判断返回的内容是不是 xml 格式
    $xml_parser = xml_parser_create();
    $res = xml_parse($xml_parser, $content, true);
    xml_parser_free($xml_parser);    return $res;
}
if (iss_xml("xml数据")) {    echo "真";
} else { echo "假"; }

21.PHP判断是不是微信或QQ打开,是则跳转提示使用浏览器打开

PHP判断是不是微信或QQ打开,是则跳转提示使用浏览器打开,之前也发布过同款文章,但这次样式不同,且本次比较简化!

原理:若是微信或者QQ打开,提示图会覆盖网页,但网页功能仍在运行!

<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">

<style>
.top-guide[data-v-cd35abb6] {
    padding-top: .16rem;
    animation: myfirst   1.6s infinite;
}
@keyframes myfirst {
    0% {
    transform: translateY(0);
    }
    50% {
        transform: translateY(.21333rem);
    }
    100% {
        transform: translateY(0);
    }
}


.guide {
    text-align: center;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 10;
    width: 100vw;
    height: 100vh;
    background: rgba(51,51,51,.92);
}

</style>
<? if(strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')!==false ||strpos($_SERVER['HTTP_USER_AGENT'], 'QQ/')){ $display='display:inherit';
}else{ $display='display:none';   } ?>

<img data-v-cd35abb6="" src="/yd1.png" alt="引导图" class="top-guide" style="max-width: 100%;margin: auto;{{{PHP2}}}">
<div data-v-cd35abb6="" class="guide" style="{{{PHP3}}}">
<img data-v-cd35abb6="" src="/yd2.png" alt="引导图" style="width: 96%;"></div>

21.PHP获取文件或文件夹所有者名称

$file = 'install'; // 要查询的文件路径
 
echo get_fileowner($file); //正常宝塔网站返回www

function get_fileowner($file) {
$ownerId = fileowner($file);
if ($ownerId !== false){  $userInfo = posix_getpwuid($ownerId);
if(isset($userInfo['name'])){ return $userInfo['name']; //返回文件所有者名称
}else{ return false; } //无法获取文件所有者信息
}else{ return false; }  }//无效的文件路径或没有该文件

22.php 取中间n位字符

在PHP中,要取字符串的中间n位字符,可以使用mb_substr函数,它支持多字节字符集(例如UTF-8)。以下是一个示例代码:

function getMiddleChars($str, $n) {
    $length = mb_strlen($str); // 获取字符串长度
    if ($length <= $n) {
        // 如果字符串长度小于等于要取的字符数,直接返回原字符串
        return $str;
    } else {
        // 计算起始位置和结束位置
        $start = floor(($length - $n) / 2);
        $length = $n;
        return mb_substr($str, $start, $length);
    }
}

$middleNChars = getMiddleChars('晓柠笔创公众号', 4);
echo $middleNChars; //输出结果:晓柠笔创

23.PHP两个三元运算符“??” 和“?:”的用法和区别

"??"是php7新引入的语法,它相当于是isset($k)?

“??”被称为空合并运算符。它的语法形式为 k1 ?? k2。它的作用是如果 k1 不为 null,则返回 k1 的值,否则返回 k2 的值。这个运算符主要用于简化对变量是否为空的判断,并提供一个默认值。

直接上实例吧,基本一看就懂:

isset($aaa) ? $aaa : $bbb;
?? 合并操作符的简写形式
$aaa ?? $bbb;

俩代码一个效果


$aaa ? $aaa : $bbb;
?: 三元运算符的简写形式
$aaa ?: $bbb
注意:当$aaa未被声明时,[??]不会报错(因为用了isset),[?:]会报一个Notice

24.ajax回调函数局部变量如何全局变量赋值

原因是因为ajax默认是异步请求,返回的值只能在内部使用,我们可以将异步请求修改为同步:

async:false, //同步请求 ,默认是true异步请求

使用 window 对象。你可以给 window 对象添加一个属性来存储 AJAX 请求返回的数据,例如: 

$.ajax({
  url: 'your-url',
   async:false, //同步请求 
   success: function(response) {
    // 将返回的数据存储在 window 对象中
    window.myData = response;
  }
});
console.log(myData);

25.php获取文件大小 mb

在PHP中,可以使用filesize()函数获取文件的大小,然后使用number_format()函数将字节转换为MB。以下是一个简单的示例代码:

$file='example.txt';
$size=filesize($file); $size_mb = number_format($size / 1024 / 1024,2);
echo "文件大小:{$size_mb} MB";

26.Nginx网站如何屏蔽电脑端,屏蔽蜘蛛,屏蔽微信,QQ等

将下方代码直接放置在网站伪静态规则里即可

if ($http_user_agent ~* "windows") { return 444; } #屏蔽电脑端
if ($http_user_agent ~* "MicroMessenger") { return 444; } #屏蔽微信
if ($http_user_agent ~* "QQ/") { return 444; } #屏蔽QQ内
   
if ($http_referer ~* "baidu.com|sogou.com|so.com|google.com|bing.com|sm.cn") { return 444; } 
if ($http_user_agent ~* "SemrushBot|python|AhrefsBot|hubspot|opensiteexplorer|leiki|webmeup|Baiduspider|baiduspider|sogou spider|sogou web|360spider|Bytespider|toutiao|Sosospider|YodaoBot|msnbot|Googlebot|Amazonbot|dataforseo|DataForSeoBot|semrush|babbar|mj12bot|116.0.0.0") { 
return 444; } #屏蔽各大搜索引擎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 11新版将至:Zen5、Zen4、Zen3游戏性能一起飞

锐龙9000系列发布之初&#xff0c;有些媒体和玩家发现&#xff0c;其游戏性能没有官方宣传的提升那么高&#xff0c;于是产生了一些质疑&#xff0c;AMD今天特意就此撰文&#xff0c;给出了详细的解释&#xff0c;并透露未来会随着Windows 11的升级而释放更多性能潜力。 事实上…

FreeRTOS学习:内存管理

FreeRTOS内存管理简介 在使用 FreeRTOS 创建任务、队列、信号量等对象的时候&#xff0c; FreeRTOS 一般都提供了两种方法&#xff0c; 动态方法创建&#xff1a;自动地从 FreeRTOS 管理的内存堆中申请所创建对象所需的内存&#xff0c;在对象被删除后&#xff0c;又可以将这…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…

Scrum敏捷开发高效实践课程:面向企业团队的系统化训练,旨在提升研发效率,优化项目管理,推动企业敏捷化发展。

课程简介&#xff1a; Scrum 是一种广泛应用的敏捷开发方法&#xff0c;用于项目管理和产品研发。该课程为期两天&#xff0c;专为研发管理者、项目经理、产品经理和研发团队设计。通过案例讲解和沙盘演练&#xff0c;学员将深入理解Scrum的核心理念&#xff0c;如产品价值驱动…

基于x86 平台opencv的图像采集和seetaface6的人脸跟踪功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸跟踪功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸跟踪模块从而实现…

谢广坤:愿意说话你自己起个头行不?刘能:我起头不费劲吗!

谢广坤&#xff1a;愿意说话你自己起个头行不&#xff1f;刘能&#xff1a;我起头不费劲吗&#xff01; --小品《欢乐农家》&#xff08;赵家班、上&#xff09;的台词与解说 刘能&#xff1a;大脚 谢大脚&#xff1a;咋的了这是 大过年的 刘&#xff1a;脚崴了 大脚&…

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术&#xff0c;但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上&#xff08;顶底&#xff09;分别配置为123456。汝等自管记好&#xff0c;今后自有妙用&#xff08;哈哈&#xff09;效果如图

饮水机开水前加入童锁判断

饮水机开水前加入童锁判断 引言 饮水机加入童锁, 是配合红外线, 进行防误触检测. 我们模仿红外线检测杯子, 加入童锁变量, 这个变量是人工控制的, 开水前,检测一下童锁,如果童锁锁住 , 则不能开水, 我们只需要修改一下底层即可. 本博客修改完的代码工程: https://wwyz.lanzou…

《计算机操作系统》(第4版)第6章 输入输出系统 复习笔记

第6章 输入输出系统 一、I/O 系统的功能、模型和接口 1.I/O 系统的基本功能 (1)隐藏物理设备的细节。 (2)与设备的无关性。 (3)提高处理机和I/O 设备的利用率。 ( 4 ) 对I/O 设备进行控制。 (5)确保对设备的正确共享。 (6)错误处理。 2.I/O 系统的层次结构和模型 (…

21.1 Netty介绍及服务搭建

21.1 基于Netty实现聊天 一. 章节概述二. `Netty`介绍三. 阻塞与非阻塞1. 阻塞与非阻塞简介2. BIO同步阻塞3. NIO同步非阻塞4. AIO异步非阻塞IO5. 异步阻塞IO(用的极少)6. 总结四. Netty三种线程模型1. 单线程模型2. 多线程模型3. 主从线程模型五. 构建Netty服务器************…

【传输层协议】UDP协议 {端口号的范围划分;UDP数据报格式;UDP协议的特点;UDP的缓冲区;基于UDP的应用层协议}

一、再谈端口号 1.1 端口号标识网络进程 如何通过端口号找到主机上的网络进程&#xff1f; 在socket编程中bind绑定是最为重要的一步&#xff1a;他将套接字与指定的本地 IP 地址和端口号关联起来&#xff0c;这意味着指定的套接字可以接收来自指定 IP 地址和端口号的数据包…

跟李沐学AI:转置卷积

定义 卷积不会增大输入的高宽&#xff0c;通常卷积层后高宽不变或减半。转置卷积则可以用来增大输入的宽高。 转置卷积是一种卷积&#xff0c;它将输入和核进行了重新排列&#xff0c;通常用作上采用。 如果卷积将输入从变为&#xff0c;同样超参数的情况下&#xff0c;转置…

坐标大连!提交EI、Scopus、知网检索!第五届经济管理与大数据应用国际学术会议(ICEMBDA 2024)

合作ACM出版-EI稳检索 高录用&#xff0c;快见刊&#xff01; 管理、经济、金融、计算机相关主题均可投稿 目前仍有口头汇报名额&#xff0c;如有需要请尽快报名 重要信息 会议官网&#xff1a;www.icembda.org 会议时间&#xff1a;2024年10月25日-27日 会议地点&#x…

20.缓存的更新策略

定义 缓存中的旧数据与数据库不一致。 缓存更新策略的类型 1.内存淘汰&#xff0c;利用redis的内存淘汰机制&#xff0c;当内存不足时自动淘汰部分数据。下次查询时更新缓存。redis默认开启了此机制。这种保证数据的一致性差。 2.超时剔除&#xff0c;给缓存数据添加TTL时间…

保证MQ的高可用性:RabbitMQ为例

保证MQ的高可用性&#xff1a;RabbitMQ为例 一、单机模式二、普通集群模式三、镜像集群模式 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 消息队列&#xff08;MQ&#xff09;在软件开发中至关重要&#xff0c;其高可用性关乎系统稳定。R…

48、Python之模块和包:当导入模块时,Python解释器做了什么

引言 上一篇文章中&#xff0c;我们简单介绍了各种导入模块的方法&#xff0c;并通过代码演示了模块被导入之前的模块查找的路径解析过程&#xff0c;但是&#xff0c;只是局限在了加载模块之前。 今天这篇文章&#xff0c;打算把整个模块导入的全流程进行梳理&#xff0c;从…

Windows上传Linux文件行尾符转换

Windows上传Linux文件行尾符转换 1、Windows与Linux文件行尾符2、Windows与Linux文件格式转换 1、Windows与Linux文件行尾符 众所周知&#xff0c;Windows、Mac与Linux三种系统的文件行尾符不同&#xff0c;其中 Windows文件行尾符&#xff08;\r\n&#xff09;&#xff1a; L…

【初阶数据结构题目】40. 计数排序

计数排序 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff1a; 统计相同元素出现次数 根据统计的结果将序列回收到原来的序列中 思路&#xff1a; 例如&#xff1a;{6&#xff0c;1&#xff0c;2&#xff0c;9&#xff0c;4&#xff0c;…

书生模型实战L1---OpenCompass 评测

书生模型实战系列文章目录 第一章 入门岛L0&#xff08;Linux&#xff09; 第二章 入门岛L0&#xff08;python&#xff09; 第三章 入门岛L0&#xff08;Git&#xff09; 第四章 基础岛L1&#xff08;书生全链路开源介绍&#xff09; 第五章 基础岛L1&#xff08;Demo&#x…

【计算机三级-数据库技术】操作题大题(第六套)

第六套操作题 第46题 假定要建立一个学校科研项目管理的信息系统&#xff0c;需要管理如下信息&#xff1a; 教师&#xff1a;教师编号、教师姓名&#xff1b; 项目&#xff1a;项目编号、项目名称、资助额&#xff1a; 学生&#xff1a;学生编号、学生姓名、学位&#xff0c…