windows IIS中php增加mssql数据库支持
第一步:https://pecl.php.net/package/sqlsrv
在 changelog 中查看 php版本对应的 sqlsrv版本
第二步:下载对应 sqlsrv版本的 DLL,解压到php ext目录,修改 php.ini,
增加 extension=php_sqlsrv.dll
第三步:在 changelog 中查看所需要的 MS ODBC Driver 版本,并到给出的地址下载。
如:下载 Microsoft ODBC Driver 17 for SQL Server (x64)
下载后文件名为 msodbcsql.msi,安装并重启iis
就可以在php中使用 sqlsrv 驱动连接 mssql 数据库了
https://learn.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server
localStorage详解
转自:https://www.jianshu.com/p/39ba41ead42e
localStorage方法:
名称 | 作用 |
---|---|
clear | 清空localStorage上存储的数据 |
getItem | 读取数据 |
hasOwnProperty | 检查localStorage上是否保存了变量x,需要传入x |
key | 读取第i个数据的名字或称为键值(从0开始计数) |
length | localStorage存储变量的个数 |
propertyIsEnumerable | 用来检测属性是否属于某个对象的 |
removeItem | 删除某个具体变量 |
setItem | 存储数据 |
toLocaleString | 将(数组)转为本地字符串 |
valueOf | 获取所有存储的数据 |
mysql快速查询值是否存在
SELECT EXISTS(SELECT 1 FROM users WHERE id_number = '1234567890');
SELECT 1:在子查询中,选择常量 1 而不是实际的列数据,因为这里我们只关心是否存在匹配的行,而不关心具体的列数据。
FROM users:指定要查询的表。
WHERE id_number = '1234567890':指定查询条件,即证件号码必须匹配 '1234567890'。
Codeigniter示例:</p
$sql = 'SELECT EXISTS(SELECT 1 FROM users WHERE id_number=?) as `num`'; $res=$this->db->query($sql, array('123456'))->row_array(); echo $res['num']==1 ? 'yes' : 'no';
</p
php随机生成有效的公网ipv4地址
//随机生成有效的公网ipv4地址 function generateRandomPublicIPv4() { // 排除的IP范围(局域网、保留地址等) $excludedRanges = [ ['0.0.0.0', '0.255.255.255'], // 当前网络 ['10.0.0.0', '10.255.255.255'], // 私有网络 ['100.64.0.0', '100.127.255.255'], // Carrier-grade NAT ['127.0.0.0', '127.255.255.255'], // 环回地址 ['169.254.0.0', '169.254.255.255'], // 链路本地 ['172.16.0.0', '172.31.255.255'], // 私有网络 ['192.0.0.0', '192.0.0.255'], // IETF协议分配 ['192.0.2.0', '192.0.2.255'], // TEST-NET-1 ['192.88.99.0', '192.88.99.255'], // 6to4中继 ['192.168.0.0', '192.168.255.255'], // 私有网络 ['198.18.0.0', '198.19.255.255'], // 网络基准测试 ['198.51.100.0', '198.51.100.255'], // TEST-NET-2 ['203.0.113.0', '203.0.113.255'], // TEST-NET-3 ['224.0.0.0', '239.255.255.255'], // 组播地址 ['240.0.0.0', '255.255.255.254'], // 保留地址 ['255.255.255.255', '255.255.255.255'] // 广播地址 ]; foreach($excludedRanges as &$row){ $row[0]=ip2long($row[0]); $row[1]=ip2long($row[1]); } // 生成随机IP直到找到有效的公网IP do { // 生成随机IP $ipLong = mt_rand(ip2long('1.0.0.0'), ip2long('223.255.255.255')); $ip = long2ip($ipLong); $isValid = true; // 检查是否在排除范围内 foreach ($excludedRanges as $range) { list($start,$end)=$range; if ($ipLong >= $start && $ipLong <= $end) { $isValid = false; break; } } // 额外检查:排除以0或255结尾的地址(通常有问题) $parts = explode('.', $ip); if ($parts[3] == 0 || $parts[3] == 255) { $isValid = false; } } while (!$isValid); return $ip; }
云主机遭遇挖矿病毒处理方法
https://blog.csdn.net/qq_61872115/article/details/136987258
https://blog.csdn.net/qq_35573061/article/details/138495615
优秀开源项目
微信支付SDK
https://easywechat.com/
https://github.com/w7corp/easywechat
中国农历(阴历)与阳历(公历)转换与查询工具
https://github.com/overtrue/chinese-calendar/tree/master
更准确的 PHP 汉字转拼音解决方案
https://overtrue.me/php-chinese-to-pinyin/
https://overtrue.me/pinyin/
https://github.com/overtrue/pinyin
几个excel公式
根据单元格的值设置文字颜色等
>开始》条件设置》新建格式规则》使用公式确定要设置格式的单元格
=OR(D2="请填写",D2="号码错误")
或者
=AND(D2<>"校验通过")
点击“格式”自行设置
根据C列的证件号码校验身份证号是否正确
=IF(LEN(C2)=18,IF(AND(ISNUMBER(--LEFT(C2,17)),OR(RIGHT(C2,1)="X",ISNUMBER(--RIGHT(C2,1)))),IF(RIGHT(C2,1)=MID("10X98765432",MOD(SUMPRODUCT(MID(C2,ROW(INDIRECT("1:17")),1)*MOD(2^(18-ROW(INDIRECT("1:17"))),11)),11)+1,1),"校验通过","号码错误"),"号码错误"),"身份证号码应该为18位")
根据B列的证件类型和C列的证件号码校验身份证号是否正确
=IF(B2="身份证",IF(LEN(C2)=18,IF(AND(ISNUMBER(--LEFT(C2,17)),OR(RIGHT(C2,1)="X",ISNUMBER(--RIGHT(C2,1)))),IF(RIGHT(C2,1)=MID("10X98765432",MOD(SUMPRODUCT(MID(C2,ROW(INDIRECT("1:17")),1)*MOD(2^(18-ROW(INDIRECT("1:17"))),11)),11)+1,1),"校验通过","号码错误"),"号码错误"),"身份证号码应该为18位"),"")
通过注册表编辑器禁用TLS1.0、TLS1.1
定位到注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
- 创建或修改TLS 1.0键值
如果不存在 TLS 1.0 键,右键点击 Protocols → 新建 → 项,命名为 TLS 1.0。 - 在 TLS 1.0 下分别创建 Client 和 Server 子项。
设置禁用参数
Client项:
新建DWORD值:
Enabled → 值设为 0
Server项:
同样新建Enabled → 值设为 0 - 重启服务器
关闭注册表编辑器,重启系统使设置生效。
TLS 1.1 禁用步骤同上。
另外,可下载图形化工具 IIS Crypto 来禁用相关功能,下载地址:https://www.nartac.com/products/IISCrypto/download
php登录后台时一直提示验证码错误
查日志发现是新部署的业务 php/temp 目录没有写入权限
Session: Configured save path 'D:\php\temp' is not writable by the PHP process
Severity: Warning --> session_start(): Failed to initialize storage module: user (path: D:\php\temp\) D:\webroot\system\Session.php 143
我的LODOP打印控件代码备份
<script src="/static/lodop/LodopFuncs.js?v=reg"></script> <script> //定义打印控件 var LODOP = null; //已打印标识 var printFlag = [0,0]; //打印次数、页数 window.onload=function(){LODOP=getLodop();}; function createPage(data){ /** * LODOP基础知识 * 计量单位关系如下(其中px单位与像素类似,但不是一个概念) * 1in = 2.54cm = 25.4mm = 72pt = 96px * 1mm = 2.83465pt = 3.77953px * 1pt = 0.352777mm = 1.333333px * 1px = 0.264583mm = 0.75pt * * 字号默认单位为pt,不设置默认为9pt * 长度单位默认为px(SET_PRINT_PAGESIZE中的PageWidth和PageHeight除外,默认为0.1mm) * * 设置纸张大小(initOrient为1-3时会锁定打印方向,为0时由用户控制) * SET_PRINT_PAGESIZE(intOrient, PageWidth,PageHeight,strPageName) * 不调用此函数则由用户在打印设置中自主设置 */ //LODOP.PRINT_INIT('证书打印'); LODOP.PRINT_INITA(0,0,'330mm','240mm','证书打印'); //top,left,width,height,printName,整体打印有偏差时,只需要调整top和left值即可 LODOP.SET_PRINT_MODE('CUSTOM_TASK_NAME', data.name); //打印任务名 LODOP.SET_PRINT_MODE('POS_BASEON_PAPER',true); //true以纸张边缘为基点;false可打区域边缘为基点 LODOP.SET_PRINT_MODE('AUTO_CLOSE_PREWINDOW',1); //打印后自动关闭预览窗口 //LODOP.SET_PRINT_PAGESIZE(0, '240mm','330mm', 'CreateCustomPage'); // 第一个参数:1纵向打印2横向打印3宽度固定高度自适应0用户控制 LODOP.SET_PRINT_PAGESIZE(2,0,0,''); //后三个值无效时只用来设置打印方向 LODOP.SET_PRINT_STYLE('FontSize',13.5); //全局字号,单位pt LODOP.SET_PRINT_STYLE('FontName', '新宋体'); //全局字体(宋体、新宋体设置加粗无效) LODOP.SET_PRINT_STYLE('Bold',1); //全局加粗 LODOP.SET_SHOW_MODE('BKIMG_PRINT',false); //是否打印背景图 //LODOP.SET_PRINT_STYLE('Alignment', 2); //全局水平居中 //LODOP.ADD_PRINT_TEXT(top, left, width, height, textContent); //默认单位px LODOP.ADD_PRINT_TEXT(157,912,234,30, data.name); //LODOP.SET_PRINT_STYLEA(0, 'FontSize', 13.5); //为前面刚添加的项目设置字号、字体、颜色等打印式样 LODOP.ADD_PRINT_TEXT(231,912,234,30, data.gender); LODOP.ADD_PRINT_TEXT(306,912,234,30, data.nationality); LODOP.ADD_PRINT_TEXT(381,912,234,30, data.ethnic_group); LODOP.ADD_PRINT_TEXT(455,946,234,30, data.birth); LODOP.ADD_PRINT_TEXT(338,289,260,30, data.major_name); LODOP.ADD_PRINT_TEXT(418,254,260,30, data.grade); LODOP.ADD_PRINT_TEXT(498,289,260,30, data.certdate); LODOP.ADD_PRINT_TEXT(578,289,260,30, data.certno); LODOP.ADD_PRINT_TEXT(659,275,260,30, data.grade_begin_end); if(data.photo){ LODOP.ADD_PRINT_IMAGE(155,659,'36mm','49mm','<img border="0" src="'+data.photo+'?rnd='+Math.random()+'">'); LODOP.SET_PRINT_STYLEA(0,'Stretch',2);//默认不设置或0为截取模式;1按打印区域尺寸缩放(变形);2按原图比例(不变形)缩放模式 } } //更新打印日志 function update_print_log(row){ row.print=parseInt(row.print)+1; table.updateRow('myTable', {index:row.LAY_INDEX, data:row}, true); $.ajax({ type: 'POST', data: {act:'update_print_log', id:row.id}, success: function(res){ if(res.code)return layer.alert(res.msg); } }); } function batch_print(){ var data=table.checkStatus('myTable').dataCache; if(!data.length)return layer.msg('请选择要打印的记录', {time:2e3}); $.each(data, function(index,row){ createPage(row); LODOP.PRINT(); update_print_log(row) }); } //选择打印机 function print_printer(){ //return layer.alert('请在打印预览界面中点击菜单栏的"设置"选择打印机或打印设置。'); /* var printer_list=[]; for(var i=0; i<LODOP.GET_PRINTER_COUNT(); ++i){ printer_list.push(LODOP.GET_PRINTER_NAME(i)); } console.log(printer_list); return; */ } //打印维护 function print_edit(){ var row=create_data(); if(row===null)return layer.alert('无数据'); createPage(row); LODOP.ADD_PRINT_SETUP_BKIMG('<img border="0" src="/static/images/cert.jpg">'); LODOP.SET_SHOW_MODE('SHOW_SCALEBAR',1); //显示标尺 LODOP.SET_SHOW_MODE("BKIMG_LEFT",0); LODOP.SET_SHOW_MODE("BKIMG_TOP",0); LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_SETUP',true); LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_PREVIEW',true); LODOP.PRINT_SETUP(); } //打印预览 function print_view(){ var row=create_data(); if(row===null)return layer.alert('无数据'); createPage(row); LODOP.ADD_PRINT_SETUP_BKIMG('<img border="0" src="/static/images/cert.jpg">'); LODOP.SET_SHOW_MODE('BKIMG_IN_PREVIEW',1); //打印预览显示背景图 LODOP.SET_SHOW_MODE('SHOW_SCALEBAR',1); //显示标尺 LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD',1); //隐藏打印预览背景进纸版的图案 LODOP.SET_SHOW_MODE("BKIMG_LEFT",0); LODOP.SET_SHOW_MODE("BKIMG_TOP",0); LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_SETUP',true); LODOP.SET_SHOW_MODE('HIDE_PBUTTIN_PREVIEW',true); LODOP.PREVIEW(); } function print_design(){ LODOP.PRINT_INITA(0,0, '330mm','240mm', '打印设计'); LODOP.PRINT_DESIGN(); } //版本检测 function print_version(){ try{ if(LODOP.VERSION) { let str=LODOP.CVERSION ? 'C-Lodop版本:'+LODOP.CVERSION+'<br>Lodop版本:'+LODOP.VERSION : '本机已安装Lodop控件!<br>版本号:'+LODOP.VERSION; layer.alert(str); }; }catch(e){} } //打印预览、打印维护时展示的数据 function create_data(){ var data=table.getData('myTable'); if(!data.length)return null; var checkData=table.checkStatus('myTable').data; return checkData.length ? checkData[0] : data[0]; } </script>