首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
138
篇与
的结果
2023-08-07
php源码加密
php源码加密第一种<?php function encode_file_contents($filename) { $type=strtolower(substr(strrchr($filename,'.'),1)); if('php'==$type && is_file($filename) && is_writable($filename)){// 如果是PHP文件 并且可写 则进行压缩编码 $contents = file_get_contents($filename);// 判断文件是否已经被编码处理 $contents = php_strip_whitespace($filename); // 去除PHP头部和尾部标识 $headerPos = strpos($contents,'<?php'); $footerPos = strrpos($contents,'?>'); $contents =substr($contents,$headerPos+5,$footerPos-$headerPos); $encode = base64_encode(gzdeflate($contents));// 开始编码 $encode = '<?php'."\n eval(gzinflate(base64_decode("."'".$encode."'".")));\n\n?>"; return file_put_contents($filename,$encode); } return false; } //调用函数 $filename='dam.php'; encode_file_contents($filename); echo "OK,加密完成!" ?>第二种PHP 代码 加密此加密方法支持任意PHP版代码如下:<?php function RandAbc($length=""){//返回随机字符串 $str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return str_shuffle($str); } $filename='dam.php'; $T_k1=RandAbc();//随机密匙1 $T_k2=RandAbc();//随机密匙2 $vstr=file_get_contents($filename);//要加密的文件 $v1=base64_encode($vstr); $c=strtr($v1,$T_k1,$T_k2);//根据密匙替换对应字符。 $c=$T_k1.$T_k2.$c; $q1="O00O0O"; $q2="O0O000"; $q3="O0OO00"; $q4="OO0O00"; $q5="OO0000"; $q6="O00OO0"; $s='$'.$q6.'=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$'.$q1.'=$'.$q6.'{3}.$'.$q6.'{6}.$'.$q6.'{33}.$'.$q6.'{30};$'.$q3.'=$'.$q6.'{33}.$'.$q6.'{10}.$'.$q6.'{24}.$'.$q6.'{10}.$'.$q6.'{24};$'.$q4.'=$'.$q3.'{0}.$'.$q6.'{18}.$'.$q6.'{3}.$'.$q3.'{0}.$'.$q3.'{1}.$'.$q6.'{24};$'.$q5.'=$'.$q6.'{7}.$'.$q6.'{13};$'.$q1.'.=$'.$q6.'{22}.$'.$q6.'{36}.$'.$q6.'{29}.$'.$q6.'{26}.$'.$q6.'{30}.$'.$q6.'{32}.$'.$q6.'{35}.$'.$q6.'{26}.$'.$q6.'{30};eval($'.$q1.'("'.base64_encode('$'.$q2.'="'.$c.'";eval(\'?>\'.$'.$q1.'($'.$q3.'($'.$q4.'($'.$q2.',$'.$q5.'*2),$'.$q4.'($'.$q2.',$'.$q5.',$'.$q5.'),$'.$q4.'($'.$q2.',0,$'.$q5.'))));').'"));'; $s='<?php '.$s. ' ?>'; echo "OK,加密完成!"; echo $s; //生成 加密后的PHP文件 //$fpp1 = fopen('dam.php','w'); $fpp1 = fopen('temp'.$filename,'w'); fwrite($fpp1,$s) or die('写文件错误'); ?>效果如下:<? $O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};eval($O00O0O("JE8wTzAwMD0iUWFLRlBtWFdaaGtJeWZUckJFdWxOUlNvSll0QWRwc0hxVm54dkxiT0RjVWp6Q0dpd01lZ25IRE1za0tSeGxoZmlhcWpUekJ5SXV3U2RnR0pBUE90cHZYVUZRTkNtZVlXRWNvYnJaTFZzbThJY2t1eXhreUJ4d0pTZDFUYVlpZU9mTVRUdnpsYVkwdm5udmRUdno5d0RxT0lja3V5eGt5Qnh3SlNkMWRzcTFuWFFjSmJRYjhiRHFPSWNYSXlBTTlQTmtJT0FSdXlLM1RsQW9WU1loOXN2Y0pCWU05cWZjNFhSa3ZCeGNlVlF5VGFZaUpCWWg5c3ZjNVh4S3VhSFI1V050dmh4djlyZ0t1U0RjaFBDcjBEZWt2VUFSeWl4djlGTmtJeWZNZHNxMW5CZDFQeU5rbkZxbzlseG92aVFYVFNlY2U3bW5QaXhLTTFIS2R5SzI5QmcyWVZZaDlzdmM0WHhYdkJnM3VQTjI0RnhYdkJnM3VQTjI0QmVvbHJkRU9JY3lQeU5rdWFxbzlseG92aUNXUE9OMk1objJVbGUzWlNkMVB5Tmt1YVkydkVlMnlGTmJlUENyMERSa3ZCeE05Wk4yTWh4S2Y2Q2tVRmdSdW1Ob01FZWlWWFJrdkJ4TTl6Z2JlUENyMERSa3ZCeE05Wk4yTWh4S2Y2Q2tVRmdSdW1Ob01FZWlWWFJrdkJ4TTltTjI1a0hSQWF3UjVQZGloN2ZKMERkb0lGTmt4UHhpSjlmbzV5QWlUSHhSNWhLMElGTmt4UHgxOWROa2hTZGk0RkhSNVdRMklGTmt4UHhpNVBOa2hYUWNKWHgydkJ4S2RsTmNlUENyMERkb3ViZm0wVlJrdkJ4TTl6Z1dTNnhrTVdBbzlpTHdWaGcyOUJ4a3lYUXE1aGdiMCtnUnVsZXR1eWVicmhnMjlCeGt5WFFxNWhnYjArZzI5QnhreVhRcTUwTjBNaWVrTTVEY2hQQ3IwRFJrdkJ4TTlxeEtJRUhSOUJDV1BFQW9NaUFjVlBDcjBEZkowRGR0SXllM0lQTjI0VnN3VEJ4S2VWUmt2QnhNOXF4S0lFSFI5QkswNWxOUnZFZW9NV3h3Vlhla1VHZWllUENpSlZtblNJY1hkeWVLdlBla3ZhTjI1V3h3VHdxMDlZUWJBUE5rWkZIUk1XZzJ2RWVpNXJIdEpYQ3IwRG4ybHlnMkdQTmtBZGVjVlBDcjBEZWt2VUFSeWl4djlGTmtJeWZNZHNxMW5CZDJseWdSdXllYjVySHRKWENyMERtblBQeGJKU2RNOW5xMUlZUmlBWE4zdUZBS2RPZDEwUExyMERtblNoeDN2aU5tMTFla1VoeFJJRnhvWVNkTTlucTFJWVJpQVhOM3VGQUtkT2QxMFBDcjBEbW5QOXhSVUV4S09JY2J1WEFLZE9zd2VCUTJJRk5vVXlnM3VQTjI0RnFveWJla01pTFlkRk4yR0VRWFRTZWNlN21uUDltblNJY2J1WEFLZE9zd0FoZ1I5U2dSNVhRWFRTZWNlN21uUy9zVjBEc3RJV2VreXJBbTRWQWtNaWZvMUVzcXIvc3d1RXhLSUVIUjlCUXE1RUhSbi9zV3JGZTJJaUhLVDBzYkpJY1dVa2VrTUd4S0l5QWNUaU4zQUVzd2YySWNycGZiSlZ4WGRsTlJ2Yk4zZGh4S2Y5Zmg1c2ZiVGJOM2RoeEtmOWZXSmJmb3hpZ1IxeWUzVGxnMnlCeEUwYlpjZittblNkc294aWdSMXlmdElpZ0UwYmdSdUdIUjVhQW85clFYVFNlY2ZWTms5aXhLSVBMa1k5Zms1RmVrdkVIS1B5ZmJUa2VrTUd4UmRGZWt1eWVXMGJxaDhiZm81bE5SWTlmWHVGZXp4aWdSMXlmYlRFZzNkRk5vVVBOa2U5Zms1RmZiVEdnS2RYSFI1M0hSdTBIbTBiWmNmVk5STWl4MnlCSG92UHgybDBzd2ZyZmJUMGdLZFh4S245ZmsxbEhSNGJmYzgrbW5TVmZjSlZmY0pJY2JKVnNveGlnUjF5ZTJ2MGZvSUZOdFo5Zld6MlpjcjNRY1NiZmNUaU4zQUVzd2Y0SVduT0RiZlZIUm45Zmt4aWdSMXlmVzRJY1ZoOHhYZGxOUllWZTNkV3N3ZE94UngwUVhUU2VjZlZOa01HeHEwYk5vdmtBenhpZ1IxeWZiVEJOM2R5ZTJ5NnhxMGJOazlpeEtJUExrWWJmbzFsZWtBUE5YQVB4dHVTc3dmcmZiVEdnS2RYSFI1U3hSeVhIdG45ZldKYmZveGlnUjF5Z2s5aXhvdmlzd2ZyZmJURWczZEZOb1VQTmtlOWZrNUZmYlQwZ0tkWHhLbjlmazFsSFI0YmZjOCttblNkc294aWdSMXlmdElpZ0UwYmUzQVBBb0lTeFhkbE5SWUJIdHVHTmNmVk5rTUd4cTBiTlJ5aHVYZGxOUlliZmNKVnhYZGxOUnZiTjNkaHhLZjlmV0piZnRJV2VrOU9Ob3lCeEUwYk5rOGJmbzVGZWt2RUhLUHlzd2RCTjNkeWUyeTZ4d2ZWSFJuOWZrMVB4enhpZ1IxeWZiVDBIS3VPeHEwYk5SeWh1WGRsTlJZYmZjOCtmSjBEZmNKVmZjSlZmY0o4eFhkbE5SWVZlM2RXc3dmOHNFMGh4M3ZpTm04K2ZiSlZOazlpeEtJUExrWTlmazVGZWt2RUhLUHlmYlRrZWtNR3hSZEZla3V5ZVcwYnFoOGJmbzVsTlJZOWZrMWxIUjRiZm95aHN3QUdnUnlCZGlURWczZEZOb1VQTmtlOWZrTUJBbzhiZm8xbGVrQVBOWEFQeHR1U3N3ZnJmYlRHZ0tkWEhSNVN4UnlYSHRuOWZXSmJmY1QwZ0tkWHhLbjlmeTlFeFJVa2ZiSkZzVjBEZmNKOHhYZGxOUllWZTNkV3N3ZHZOWHVQQW9VeXh6eGlnUjF5UXFmNWZXNDh4WGRsTlJZVmUzZFdzd2R2Tlh1UEFvVXl4enhpZ1IxeVFxWnJmVzQ4eFhkbE5SWVZlM2RXc3dkdk5YdVBBb1V5eHp4aWdSMXlRcVlic1dyRnhYZGxOUnZFeEtuK21uUzhRMnhpZ1IxeWUydjBzVjBEc281RnhYZGxOUnZFc1dVYk4ydTVzV3pVbW5TOFEyZEZ4dGgrc2M5Qk4yeGlnUjF5ZUU0SWNiSlZmSjBEZkowRG1uU0ljV3JGSHR1R05tNEljVj09IjtldmFsKCc/PicuJE8wME8wTygkTzBPTzAwKCRPTzBPMDAoJE8wTzAwMCwkT08wMDAwKjIpLCRPTzBPMDAoJE8wTzAwMCwkT08wMDAwLCRPTzAwMDApLCRPTzBPMDAoJE8wTzAwMCwwLCRPTzAwMDApKSkpOw==")); ?>
2023年08月07日
16 阅读
0 评论
0 点赞
2023-08-07
PHP文件上传详解
PHP文件上传详解上传文件分为两个部分,HTML显示部分和PHP处理部分,HTML部分主要是让用户来选择所要上传的文件,然后通过PHP中的$_FILES,我们可以把文件上传到服务器的指定目录。先来看一下HTML部分。? 上传: 说明:form标答的action="upload.php"是指点击这个form中的submit的时候,这个上传命令会被发送到这个叫 upload.php的页面去处理。method="post"是指以post方式去送,enctype="multipart/form-data"属 性规定了在提交这个表单时要使用哪种内容类型,在表单需要二进制数据时,比如文件内容,请使用"multipart/form-data",如果要上传文 件,这个属性是必要的。input中的type="file"时,规定了应该把输入作为文件来处理,并且在input后面会有一个浏览的按钮。我们再来看一个PHP处理页面 upload.php?<?phpif($_FILES'myfile' !='') { if($_FILES'myfile' > 0) { echo "错误状态:" .$_FILES'myfile'; }else { move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }}else{ echo "alert(请上传文件!);";}?>说明:在解释这篇代码前,我们有必要了解以下知识。$_FILES'myfile' 是指被上传文件的名称$_FILES'myfile' 是指被上传文件的类型$_FILES'myfile' 是指被上传文件的大小,单位为字节(B)$_FILES'myfile' 是指被上传文件存在服务器中的临时副本文件名称,文件被移动到指定目录后临文件将被自动消毁。$_FILES'myfile' 是指由文件上传中有可能出现的错误的状态码,关于各状态含义后在会说明。了解了这些,我们再来看一下upload.php的代码。首先,$_FILES['myfile']['name']中的myfile是指在上面HTML页面中上传文件标签的name值,根据这个我们才能知道我 们正在处理的文件是哪一个input提交过来的,然后再来判断一下 $_FILES'myfile' 不是否为空,根据这个我们可以知道用户有没有上传文件,从而执行不同的操作。如果上传了文件并且状态是0就说明上传成功,我们就可以用 move_uploaded_file方法把上传的文件存放到指定目录,上面这个例子是指把上传的文件移动到同目录下的uploads文件夹下,这个路径 是相对于这个PHP文件(既upload.php)的相对目录。比如,我们想把上传的文件移动到upload.php上一层叫user的文件夹中的话,我 们就可以这样写:move_uploaded_file($_FILES['myfile']['tmp_name'] , "../user/" . $FILES'myfile'),这种方法使用起来很方便、灵活,这样一个文件就被上传到服务器中了,可以打开服务器中的目录查看该 文件。允许用户上传文件是一个有巨大的安全风险的行为,因此,通常情况下,我们会对用户上传的文件做一些限制,比如常见的限制文件类型和文件大小,来看一下。?<?phpif($_FILES'myfile' !='') { if($_FILES'myfile' > 0) { echo "错误状态:" .$_FILES'myfile'; }else { if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES'myfile' =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES'myfile' < 20480){ move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }else { echo "alert(请上传小于2MB的jpeg或Gif类型的附件);"; } }}else { echo "alert(请上传文件!);";}?>从上面的代码可以看出,我们规定了上传的文件类型必须是jpeg或者Gif并且必须小于2MB的文件($_FILES'myfile'的默认单位是字节)这里必须提到的是,对于IE浏览器,它识别jpg文件的类型必须是 pjpeg,而对于 FireFox,则必须是 jpeg,因此,我们必须对jpeg和pjpeg都作判断。这样一来,我们可以限制用户上传的一些危险的比如木马或者病毒脚本,来保证了服务器的安全运行。现在,一个上传文件程序就基本成形了。但时在有些时候,考虑到用户体验,我们还可以对用户上传过程中发生的错误作出一些提醒,让用户明白是哪里出了问题,我们会对$_FILES['myfile']['error']作出一些说明,先来看一下在PHP中对$_FILES'myfile'常见6种状态的定义。?$_FILES'teacher_pic' = 1 文件大小超过了PHP.ini中的文件限制$_FILES'teacher_pic' = 2 文件大小超过了浏览器限制$_FILES'teacher_pic' = 3 文件部分被上传$_FILES'teacher_pic' = 4 没有找到要上传的文件$_FILES'teacher_pic' = 5 服务器临时文件夹丢失$_FILES'teacher_pic' = 5 文件写入到临时文件夹出错错误信息状态为1时说明上传的文件超过了php.ini中的文件大小限制,我们可以打开php.ini这个文件。来找一下; Maximum allowed size for uploaded files.upload_max_filesize = 2M我这里是在第516行,这一句说定义了PHP中上传文件的最大字节数,默认情况下是2MB,这个设置是PHP全局上传限 制,权限最高,即使$_FILES['myfile']['size']设为10MB,也只能上传2MB以下的文件。比如,在默认情况下,如果规 定$_FILES'myfile' < 10MB,在用户上传文件大于2MB的情况下,就会现在$_FILES['teacher_pic']['error'] = 1的情况,一般来说,我们须要把$_FILES'myfile'的值设定在upload_max_filesize值之下(设大了也 没用,呵呵)。当然,你完全可以把php.ini中的upload_max_filesize值调的更大,但实际应用中,我们考虑到服务器的负载能力,不 建议upload_max_filesize的值超过20MB,这样会造成网站附件增大,这在论坛社区上可以很明显的看出来。了解了这些,我们就可以对错误状态作出定义,我们再来完善一下代码,来看一下。?<?phpif($_FILES'myfile' !=''){ if($_FILES'myfile' > 0){ switch($_FILES'myfile'){ case 1: echo "文件大小超过了PHP.ini中的文件限制!"; break; case 2: echo "文件大小超过了浏览器限制!"; break; case 3: echo "文件部分被上传!"; break; case 4: echo "没有找到要上传的文件!"; break; case 5: echo "服务器临时文件夹丢失,请重新上传!"; break; case 6: echo "文件写入到临时文件夹出错!"; break; } }else { if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES'myfile' =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES'myfile' < 20480) { move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }else { echo "alert(请上传小于2MB的jpeg或Gif类型的附件);"; } }}else { echo "alert(请上传文件!);";}?>可以看出,我们使用了switch语句来对6种错状态作出定义,这样来下,在发生错误的时间,用户就会明白,是哪里出了问题。但是还有一种情况就是,用户上传的文件在指定的目录中已经存在,这里我们可以使用file_exists方法来判断一下:?<?phpif($_FILES'myfile' !=''){ if($_FILES'myfile' > 0){ switch($_FILES'myfile'){ case 1: echo "文件大小超过了PHP.ini中的文件限制!"; break; case 2: echo "文件大小超过了浏览器限制!"; break; case 3: echo "文件部分被上传!"; break; case 4: echo "没有找到要上传的文件!"; break; case 5: echo "服务器临时文件夹丢失,请重新上传!"; break; case 6: echo "文件写入到临时文件夹出错!"; break; } }else { if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES'myfile' =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES'myfile' < 20480) { if (!file_exists("uploads/" .$_FILES"myfile")) move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES'myfile'); echo "alert(上传成功!);"; }else{ echo "alert(您上传的文件已经存在!);"; } }else { echo "alert(请上传小于2MB的jpeg或Gif类型的附件);"; } }}else { echo "alert(请上传文件!);";}?>我的个娘呀,终于写完了,一个完整的上传程序终于完成了,这只是上传文件最原始的方法,这样更容易自己理解,使用时大家可以考虑把它写成类现在我们再来总结一下上传中的逻辑判断顺吧。先判断是否上传文件如果有再来判断上传中是否出错如果出错,则提示出错信息如查没出错,再判断文件类型如果类型符合条件,再判断指定目录中有没有存在该文件如果没有就把该文件移至指定目录
2023年08月07日
10 阅读
0 评论
0 点赞
2023-08-07
PHP分页器制作,自动生成分面页码
PHP分页器制作,自动生成分面页码PHP分页器制作,自动生成分面页码,JS调用函数<?php class PageView{ /**页码**/ public $pageNo = 1; /**页大小**/ public $pageSize = 20; /**共多少页**/ public $pageCount = 0; /**总记录数**/ public $totalNum = 0; /**偏移量,当前页起始行**/ public $offSet = 0; /**每页数据**/ public $pageData = array(); /**是否有上一页**/ public $hasPrePage = true; /**是否有下一页**/ public $hasNextPage = true; public $pageNoList = array(); public $jsFunction ='jsFunction'; /** * * @param unknown_type $count 总行数 * @param unknown_type $size 分页大小 * @param unknown_type $string */ public function __construct($count=0, $size=20,$pageNo=1,$pageData =array(),$jsFunction='jsFunction'){ $this->totalNum = $count;//总记录数 $this->pageSize = $size;//每页大小 $this->pageNo = $pageNo; //计算总页数 $this->pageCount = ceil($this->totalNum/$this->pageSize); $this->pageCount = ($this->pageCount<=0)?1:$this->pageCount; //检查pageNo $this->pageNo = $this->pageNo == 0 ? 1 : $this->pageNo; $this->pageNo = $this->pageNo > $this->pageCount? $this->pageCount : $this->pageNo; //计算偏移 $this->offset = ( $this->pageNo - 1 ) * $this->pageSize; //计算是否有上一页下一页 $this->hasPrePage = $this->pageNo == 1 ?false:true; $this->hasNextPage = $this->pageNo >= $this->pageCount ?false:true; $this->pageData = $pageData; $this->jsFunction = $jsFunction; } /** * 分页算法 * @return */ private function generatePageList(){ $pageList = array(); if($this->pageCount <= 9){ for($i=0;$i<$this->pageCount;$i++){ array_push($pageList,$i+1); } }else{ if($this->pageNo <= 4){ for($i=0;$i<5;$i++){ array_push($pageList,$i+1); } array_push($pageList,-1); array_push($pageList,$this->pageCount); }else if($this->pageNo > $this->pageCount - 4){ array_push($pageList,1); array_push($pageList,-1); for($i=5;$i>0;$i--){ array_push($pageList,$this->pageCount - $i+1); } }else if($this->pageNo > 4 && $this->pageNo <= $this->pageCount - 4){ array_push($pageList,1); array_push($pageList,-1); array_push($pageList,$this->pageNo -2); array_push($pageList,$this->pageNo -1); array_push($pageList,$this->pageNo); array_push($pageList,$this->pageNo + 1); array_push($pageList,$this->pageNo + 2); array_push($pageList,-1); array_push($pageList,$this->pageCount); } } return $pageList; } /*** * 创建分页控件 * @param * @return String */ public function echoPageAsDiv(){ $pageList = $this->generatePageList(); $pageString ="<div class='pagination'><div class='page-bottom'>"; if(!empty($pageList)){ if($this->pageCount >1){ if($this->hasPrePage){ $pageString = $pageString ."<a class='page-next' href=\"javascript:" .$this->jsFunction . "(" . ($this->pageNo-1) . ")\">上一页</a>"; } foreach ($pageList as $k=>$p){ if($this->pageNo == $p){ $pageString = $pageString ."<span class='page-cur'>" . $this->pageNo . "</span>"; continue; } if($p == -1){ $pageString = $pageString ."<span class='page-break'>...</span>"; continue; } $pageString = $pageString ."<a href=\"javascript:" .$this->jsFunction . "(" . $p . ")\">" . $p . "</a>"; } if($this->hasNextPage){ $pageString = $pageString ."<a class='page-next' href=\"javascript:" .$this->jsFunction . "(" . ($this->pageNo+1) . ")\">下一页</a>"; } } } $pageString = $pageString .("</div></div>"); return $pageString; } } ?><style type="text/css"> <!-- .pagination {font-family: Tahoma;overflow: hidden; padding-top: 12px; text-align: center;} .pagination-tab { margin-bottom: 20px;} .pagination a, .pagination .page-cur, .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g, .pagination .page-break, .pagination .page-skip { display: inline-block;font-family: Tahoma,SimSun,Arial; height: 22px;line-height:22px; margin: 0; min-width: 16px;padding: 0 5px; text-align: center; vertical-align: top; white-space: nowrap;} .pagination a, .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g, .pagination .page-cur, .pagination .page-break { border: 1px solid #ed3d83; color:#e9357d; font-weight:bold;} .pagination a:hover { border: 1px solid #ed3d83;text-decoration: none; background-color:#f95f9d; color:#fff;} .pagination .page-prev_g, .pagination .page-prev, .pagination .page-next, .pagination .page-next_g { width: 36px; background-image: url(../static/img/page.gif);} .pagination .page-prev { background-position: -0px -38px; padding-left: 16px;} .pagination .page-prev_g { background-position:0px -59px; padding-left: 16px; color:#cbcbcb; font-weight:normal;} .pagination .page-next { background-position: 0px 0px; padding-right: 16px; font-weight:normal;} .pagination .page-next_g { background-position: -0px -19px; padding-right: 16px; color:#cbcbcb;} .pagination .page-cur {background-color: #f95f9d; border: 1px solid #ed3d83;color: #fff;font-weight: bold;} .pagination .page-break {border: medium none; background:none transparent; color:#333;} --> </style>PHP调用 $pageNo = $_GET['pageNo']; if(empty($pageNo)){ $pageNo = 1; } //分页数据 $pageData = News::getNewsPage($pageNo,$pageSize); //取得总行数 $count = News::getNewsCount(); //创建分页器 $p = new PageView($count['0']['TOTAL'],$pageSize,$pageNo,$pageData); //生成页码 $pageViewString = $p->echoPageAsDiv();效果图如下:
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-07
PHP分页显示制作详细讲解
PHP分页显示制作详细讲解1、前言分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一。对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解,力求让看完这篇文章的朋友在看完以后对于分页显示的原理和实现方法有所了解。本文适合初学者阅读,所有示例代码均使用php编写。2、原理所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:每页多少条记录($PageSize)?当前是第几页($CurrentPageID)?现在只要再给我一个结果集,我就可以显示某段特定的结果出来。至于其他的参数,比如:上一页($PReviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。以MySQL数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。前10条记录:select * from table limit 0,10第11至20条记录:select * from table limit 10,10第21至30条记录:select * from table limit 20,10……这一组sql语句其实就是当$PageSize=10的时候取表内每一页数据的sql语句,我们可以总结出这样一个模板:select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize拿这个模板代入对应的值和上边那一组sql语句对照一下看看是不是那么回事。搞定了最重要的如何获取数据的问题以后,剩下的就仅仅是传递参数,构造合适的sql语句然后使用php从数据库内获取数据并显示了。以下我将用具体代码加以说明。3、简单代码请详细阅读以下代码,自己调试运行一次,最好把它修改一次,加上自己的功能,比如搜索等等。<?php // 建立数据库连接 $link = mysql_connect("localhost", "mysql_user", "mysql_passWord") or die("Could not connect: " . mysql_error()); // 获取当前页数 if( isset($_GET['page']) ){ $page = intval( $_GET['page'] ); } else{ $page = 1; } // 每页数量 $PageSize = 10; // 获取总数据量 $sql = "select count(*) as amount from table"; $result = mysql_query($sql); $row = mysql_fetch_row($result); $amount = $row['amount']; // 记算总共有多少页 if( $amount ){ if( $amount < $page_size ){ $page_count = 1; } //如果总数据量小于$PageSize,那么只有一页 if( $amount % $page_size ){ //取总数据量除以每页数的余数 $page_count = (int)($amount / $page_size) + 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一 }else{ $page_count = $amount / $page_size; //如果没有余数,则页数等于总数据量除以每页数的结果 } } else{ $page_count = 0; } // 翻页链接 $page_string = ''; if( $page == 1 ){ $page_string .= '第一页|上一页|'; } else{ $page_string .= '<a href=?page=1>第一页</a>|<a href=?page='.($page-1).'>上一页</a>|'; } if( ($page == $page_count) || ($page_count == 0) ){ $page_string .= '下一页|尾页'; } else{ $page_string .= '<a href=?page='.($page+1).'>下一页</a>|<a href=?page='.$page_count.'>尾页</a>'; } // 获取数据,以二维数组格式返回结果 if( $amount ){ $sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size"; $result = mysql_query($sql); while ( $row = mysql_fetch_row($result) ){ $rowset[] = $row; } }else{ $rowset = array(); } // 没有包含显示结果的代码,那不在讨论范围,只要用foreach就可以很简单的用得到的二维数组来显示结果 ?>4、OO风格代码以下代码中的数据库连接是使用的pear db类进行处理Pager.class.php<?php // FileName: Pager.class.php // 分页类,这个类仅仅用于处理数据结构,不负责处理显示的工作 Class Pager { var $PageSize; //每页的数量 var $CurrentPageID; //当前的页数 var $NextPageID; //下一页 var $PreviousPageID; //上一页 var $numPages; //总页数 var $numItems; //总记录数 var $isFirstPage; //是否第一页 var $isLastPage; //是否最后一页 var $sql; //sql查询语句 function Pager($option) { global $db; $this->_setOptions($option); // 总条数 if ( !isset($this->numItems) ) { $res = $db->query($this->sql); $this->numItems = $res->numRows(); } // 总页数 if ( $this->numItems > 0 ) { if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; } if ( $this->numItems % $this->PageSize ) { $this->numPages= (int)($this->numItems / $this->PageSize) + 1; } else { $this->numPages = $this->numItems / $this->PageSize; } } else { $this->numPages = 0; } switch ( $this->CurrentPageID ) { case $this->numPages == 1: $this->isFirstPage = true; $this->isLastPage = true; break; case 1: $this->isFirstPage = true; $this->isLastPage = false; break; case $this->numPages: $this->isFirstPage = false; $this->isLastPage = true; break; default: $this->isFirstPage = false; $this->isLastPage = false; } if ( $this->numPages > 1 ) { if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; } if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; } } return true; } /*** * * 返回结果集的数据库连接 * 在结果集比较大的时候可以直接使用这个方法获得数据库连接,然后在类之外遍历,这样开销较小 * 如果结果集不是很大,可以直接使用getPageData的方式获取二维数组格式的结果 * getPageData方法也是调用本方法来获取结果的 * ***/ function getDataLink() { if ( $this->numItems ) { global $db; $PageID = $this->CurrentPageID; $from = ($PageID - 1)*$this->PageSize; $count = $this->PageSize; $link = $db->limitQuery($this->sql, $from, $count); //使用Pear DB::limitQuery方法保证数据库兼容性 return $link; } else { return false; } } /*** * * 以二维数组的格式返回结果集 * ***/ function getPageData() { if ( $this->numItems ) { if ( $res = $this->getDataLink() ) { if ( $res->numRows() ) { while ( $row = $res->fetchRow() ) { $result[] = $row; } } else { $result = array(); } return $result; } else { return false; } } else { return false; } } function _setOptions($option) { $allow_options = array( 'PageSize', 'CurrentPageID', 'sql', 'numItems' ); foreach ( $option as $key => $value ) { if ( in_array($key, $allow_options) && ($value != null) ) { $this->$key = $value; } } return true; } } ?>test_pager.php<?php // FileName: test_pager.php // 这是一段简单的示例代码,前边省略了使用pear db类建立数据库连接的代码 require "Pager.class.php"; if ( isset($_GET['page']) ) { $page = (int)$_GET['page']; } else { $page = 1; } $sql = "select * from table order by id"; $pager_option = array( "sql" => $sql, "PageSize" => 10, "CurrentPageID" => $page ); if ( isset($_GET['numItems']) ) { $pager_option['numItems'] = (int)$_GET['numItems']; } $pager = @new Pager($pager_option); $data = $pager->getPageData(); if ( $pager->isFirstPage ) { $turnover = "首页|上一页|"; } else { $turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首页</a>|<a href='?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一页</a>|"; } if ( $pager->isLastPage ) { $turnover .= "下一页|尾页"; } else { $turnover .= "<a href='?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一页</a>|<a href='?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾页</a>"; } ?>需要说明的地方有两个:这个类仅仅处理数据,并不负责处理显示,因为我觉得将数据的处理和结果的显示都放到一个类里边实在是有些勉强。显示的时候情况和要求多变,不如自己根据类给出的结果处理,更好的方法是根据这个Pager类继承一个自己的子类来显示不同的分页,比如显示用户分页列表可以:显示不同的分页<?php Class MemberPager extends Pager { function showMemberList() { global $db; $data = $this->getPageData(); // 显示结果的代码 // ...... } } /// 调用 if ( isset($_GET['page']) ) { $page = (int)$_GET['page']; } else { $page = 1; } $sql = "select * from members order by id"; $pager_option = array( "sql" => $sql, "PageSize" => 10, "CurrentPageID" => $page ); if ( isset($_GET['numItems']) ) { $pager_option['numItems'] = (int)$_GET['numItems']; } $pager = @new MemberPager($pager_option); $pager->showMemberList(); ?>第二个需要说明的地方就是不同数据库的兼容性,在不同的数据库里截获一段结果的写法是不一样的。mysql: select * from table limit offset, rows pgsql: select * from table limit m offset n ......所以要在类里边获取结果的时候需要 使用pear db类的limitQuery方法。
2023年08月07日
10 阅读
0 评论
0 点赞
2023-08-07
360发布通用php防护代码
360发布通用php防护代码360发布通用php防护代码,其实最初是协助phpcms来 防护安全用的,现在看来可以加入到任何有漏洞的网站里面 ,拿phpcmsv9问题,解决方案如下,其他网站以此类推!1.将360_safe3.php传到要包含的文件的目录2.在页面中加入防护,有两种做法,根据情况二选一即可:a).在所需要防护的页面加入代码require_once('360_safe3.php');就可以做到页面 防注入、跨站 如果想 整站防注,就在网站的一个公用文件 中,如数据库链接文件config.inc.php中! 添加require_once('360_safe3.php'); 来调用本代码常用php系统添加文件PHPCMS V9 \phpcms\base.phpPHPWIND8.7 \data\sql_config.phpDEDECMS5.7 \data\common.inc.phpDiscuzX2 \config\config_global.phpWordPress \wp-config.phpMetinfo \include\head.phpb).在每个文件最前加上代码在php.ini中找到:Automatically add files before or after any PHP document. auto_prepend_file = 360_safe3.php路径; -------------------------------------360_safe3.php源文件360_safe3.php 源文件如下,大家可以参考下<?php //Code By Safe3 function customError($errno, $errstr, $errfile, $errline) { echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />"; die(); } set_error_handler("customError",E_ERROR); $getfilter="'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; $postfilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; $cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){ if(is_array($StrFiltValue)) { $StrFiltValue=implode($StrFiltValue); } if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){ //slog("<br><br>操作IP: ".$_SERVER["REMOTE_ADDR"]."<br>操作时间: ".strftime("%Y-%m-%d %H:%M:%S")."<br>操作页面:".$_SERVER["PHP_SELF"]."<br>提交方式: ".$_SERVER["REQUEST_METHOD"]."<br>提交参数: ".$StrFiltKey."<br>提交数据: ".$StrFiltValue); print "360websec notice:Illegal operation!"; exit(); } } //$ArrPGC=array_merge($_GET,$_POST,$_COOKIE); foreach($_GET as $key=>$value){ StopAttack($key,$value,$getfilter); } foreach($_POST as $key=>$value){ StopAttack($key,$value,$postfilter); } foreach($_COOKIE as $key=>$value){ StopAttack($key,$value,$cookiefilter); } if (file_exists('update360.php')) { echo "请重命名文件update360.php,防止黑客利用<br/>"; die(); } function slog($logs) { $toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm"; $Ts=fopen($toppath,"a+"); fputs($Ts,$logs."\r\n"); fclose($Ts); } ?>
2023年08月07日
13 阅读
0 评论
0 点赞
1
...
26
27
28