首页
我的邻居
留下你的脚印
Search
1
用PDO得知数据库中某个表的总行数
11,302 阅读
2
积木报表大屏配置动态数据时php api跨域问题的解决
167 阅读
3
layui实现表格分页和总数
157 阅读
4
部署 Memos 接入 QQ 机器人
140 阅读
5
layui弹出提示框并关闭子页刷新父页面
138 阅读
默认分类
PHP
登录
Search
标签搜索
layui
php
api
layuimini
pdo
mysql
积木报表
php跨域
php表格分页
layui表格分页
ruoyi
若依框架
Moxne
累计撰写
14
篇文章
累计收到
2
条评论
首页
栏目
默认分类
PHP
页面
我的邻居
留下你的脚印
搜索到
14
篇与
的结果
2023-05-21
用PDO得知数据库中某个表的总行数
$sql = "select id,xm,srxk,zgzt,zrsj,from_unixtime(create_time,'%Y-%m-%d') as create_time from jsgl"; $result = $pdo->query($sql); $result->rowCount()//用PDO得知数据库中某个表的总行数
2023年05月21日
11,302 阅读
0 评论
0 点赞
2023-05-21
layuimini表格接口实例
<?php //引入数据库连接文件 require_once '../server/db.php'; header("content-Type: application/json; charset=utf-8");//字符编码设置 $sql = "select id,xm,srxk,zgzt,zrsj,from_unixtime(create_time,'%Y-%m-%d') as create_time from jsgl;"; $result = $pdo->query($sql); $arr = array(); // 输出每行数据 while($row = $result->fetch(PDO::FETCH_ASSOC)) { $count=count($row);//不能在循环语句中,由于每次删除row数组长度都减小 for($i=0;$i<$count;$i++){ unset($row[$i]);//删除冗余数据 } array_push($arr,$row); } //编写符合表格需要的json格式 $res = [ "code" => 0, "msg" => '获取成功', "count" =>$counts, 'data' =>$arr ]; //print_r($arr); echo json_encode($res,JSON_UNESCAPED_UNICODE);//json编码 ?>
2023年05月21日
100 阅读
0 评论
0 点赞
2023-05-21
一个简单的api,读取mysql数据并用json格式输出
<?php header("content-Type: application/json; charset=utf-8");//字符编码设置 $servername = "xxx"; $username = "xxx"; $password = "xxxx"; $dbname = "xxx"; // 创建连接 $conn =new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } //sql语句,并将时间戳格式的时间转换为年-月-日格式 $sql = "select id,xm,srxk,zgzt,zrsj,from_unixtime(create_time,'%Y-%m-%d') as create_time from jsgl;"; $result = $conn->query($sql); $arr = array(); // 输出每行数据 while($row = $result->fetch_assoc()) { $count=count($row);//不能在循环语句中,由于每次删除row数组长度都减小 for($i=0;$i<$count;$i++){ unset($row[$i]);//删除冗余数据 } array_push($arr,$row); } //print_r($arr); echo json_encode($arr,JSON_UNESCAPED_UNICODE);//json编码 $conn->close(); ?>
2023年05月21日
84 阅读
0 评论
0 点赞
2023-05-13
配置一个舒适的 zsh 环境
作为 *nix(指 macOS)重度用户,也作为 VPS 玩家,每天接触最多的就是终端。一个高效、美观的终端可以显著提升日常作业的效率和幸福感。安装使用 zsh一般的 Linux 发行版,默认 Shell 大多是 bash,可能需要自己安装 zsh。macOS 的默认 Shell 就是 zsh。通过 echo $SHELL 可以查看当前使用的 Shell。通过 cat /etc/shells 可以查看系统安装的所有 Shell。安装后,在终端输入 zsh 就可以进入 zsh。运行 chsh -s /bin/zsh 可以将默认 Shell 换成 zsh,这样打开终端或者用 SSH 登录,默认就会使用 zsh。如果没有进行配置,刚打开 zsh,可能感觉和 bash 的区别并不大。事实上,zsh 最强大之处就在于其可拓展性以及插件生态。配置下面这些主题 / 插件,使用体验就可以吊打 bash 了!(我并不喜欢 oh-my-zsh,原因之一是启动有点慢。这里我还是用原生 zsh 配置了)Powerlevel10kPowerlevel10k 是一套 zsh 主题,强调速度、灵活性以及开箱即用的体验。Github 项目地址这个主题非常强大,第一次使用就惊艳到了我。Powerlevel10k 初始配置首先第一次使用就有一个非常友好的 configuration wizard 引导你进行「傻瓜式」的配置。这个主题也提供了相当多的样式,可以根据偏好自己选择。不管是简洁还是炫酷的风格都有……而且它还支持集成 git。当进入一个 git 仓库,当前输入行前就会显示对应的信息,包括有多少更改未提交、分支名等等。Powerlevel10k 会显示 git 仓库的信息p10k 本身提供了丰富的插件(这好像是插件的插件)。一切都是可以自定义的。如果不满足于引导式配置程序简单的配置,也可以自己修改相应的配置文件(如图中右边显示的 127.0.0.1:10800 就是我配置了终端显示当前代理)。支持在终端显示时间、网络甚至内存等等各种信息。这个主题的安装也非常方便(其实本质上是 zsh 插件),先 clone 这个 git 仓库(我自己一般都 clone 到 ~/.zsh 目录下),然后在 .zshrc 中引入即可:source ~/.zsh/powerlevel10k/powerlevel10k.zsh-theme重启终端,应该就能看到 configuration wizard。建议配套使用它提供的字体:MesloLGS。这是一个特制的等宽字体,内置了各种小图标,可以显示在终端里。如果不使用这个字体,许多图标就无法显示,当然 wizard 会询问你图标显示是否正常,若回答不正常,配置后就不会显示图标。zsh 插件推荐zsh-autosuggestionszsh 上像 fish shell(另一种功能丰富的 Shell)一样快速且低调的自动建议插件。Github 项目地址这个插件可以根据历史记录等对当前的输入提供建议,建议会以浅灰色的背景显示于当前输入文本「下方」:zsh-autosuggestions 提供了 echo 的建议像这张图中一样,只要输入 ec 两个字符,这个插件就会建议 echo $SHELL(由于我刚刚输入过这个命令),并以灰色显示。我可以照着输入,也可以按方向右键直接自动补全。(是不是有点 Copilot 的感觉 🙃)安装方法类似,clone 仓库后在 .zshrc 里加入:source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh重启终端即可生效。(官方的安装指南也介绍了用包管理器安装的方法,可以参考)zsh-autocompletezsh-autocomplete 为 zsh 终端添加了实时预输入自动补全功能。Github 项目地址这是我最喜欢的一个插件!之前使用过 Fig 这个软件,这是一个终端的拓展程序,可以在输入的时候实时提供一个小下拉列表,显示自动补全的各个候选项。然而劝退我的是这个软件需要登录才能使用,而且随着商业化也变得愈发臃肿。于是我找到了更优秀、更原生的平替,就是 zsh-autocomplete。这个插件和 Fig 一样可以在输入的时候实时提供自动补全,而且是在终端内实时更新的。这被称为「实时预输入自动补全」(real-time type-ahead autocompletion)。即每多输入一个字符,补全列表就会发生变化,根据用户的输入实时更新。更舒服的是它可以实时显示常用命令各种选项的解释文本,有了这个插件基本可以不需要 man 了,也不再需要死记硬背各种 arguments 是什么意思。这个功能大大提高了终端的操作效率。zsh-autocomplete 可以实时显示各种选项的解释和其他插件的用法一样,clone 到本地之后只要在 .zshrc 里 source 即可:source ~/.zsh/zsh-autocomplete/zsh-autocomplete.plugin.zsh这个插件对实时响应的要求比较高,所以如果是网速很慢的国外 VPS(输入一个字母都要等一下的那种)不建议使用,不然可能会非常卡。zsh-syntax-highlightingzsh 上像 fish-shell 一样的语法高亮。Github 项目地址安装这个插件后,终端中输入的合法的命令会显示为绿色,不合法的命令会显示为红色,不用回车运行即可检查输入是否正确。并且输入存在的文件地址时,其会自动显示下划线,也可以一目了然地检查文件地址是否输入正确。大大提升了效率。安装也是 clone 后 source 即可。source ~/.zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zshGit 同步 zsh 配置最后介绍一个奇技淫巧,用 Git 同步 $HOME(即 ~ 表示的用户目录)下的配置文件。由于我有不止一台 VPS,还有 macOS,平时折腾还经常装新的系统,每次都重新按如上配置 zsh 非常麻烦,所以我用一个 git 仓库存储了 $HOME 目录下的配置文件,包括 zsh、vim 等的配置。具体是这些文件:.vim/.zsh/.gitignore.p10k.zsh.tmux.conf.vimrc.zshrc直接在 $HOME 目录下 git init 就可以初始化空 git 仓库。然而 $HOME 文件夹下有太多繁杂的文件,如何实现只跟踪这几个文件呢?秘诀就在于这个 .gitignore 文件:*没错,要求忽略所有文件。需要添加某个文件或文件夹的时候,可以使用 --force 强制跟踪。git add .zshrc --force这个地方的要求本质上是要用 .gitignore 维护一个白名单(而不是通常的黑名单),我搜集了不少其他解决方案,但是都有不完美之处。忽略全部文件再用 --force 添加,是我认为最简洁优雅的方案了。现在添加 remote,就可以保持同步啦~
2023年05月13日
49 阅读
0 评论
0 点赞
2023-05-13
Typecho 主题 PJAX 无刷新以及遇到的一些问题
最近给 Typecho 主题 Daydream 加上了 PJAX 无刷新。本以为加一段代码就好,结果遇到了一大堆问题,无法提交评论、插件无效、数学公式没法渲染……特此记录一下。什么是 PJAXpjax = pushState + ajax对于传统的 Typecho 主题,实际上就是服务端渲染(SSR)的代表,用户每请求一个页面,服务器(php)就渲染好这个页面的内容(包括文章、评论之类的动态内容),渲染好一个静态的 HTML 然后传给浏览器。这样虽然方便,但是不难发现传输数据量其实不小。在加载不同的页面的时候,有不少部分是重复渲染的,比如页面的页眉、页脚,每个页面都是一样的,但是加载每个页面都要重新加载一次。这就会降低访问体验。而以调用 Restful 接口等方式进行客户端渲染(CSR)的单页应用程序(SPA)则是与之对立的另一个典型。用户第一次访问只加载一个页面框架,其中的 js 代码通过接口向服务器请求数据,然后在客户端进行渲染。进入新的页面链接时只刷新需要更新的部分(一般是通过 DOM 操作)。这样每次只需要修改页面中很少的信息量,可以加快加载的速度。这称为无刷新技术。然而 Typecho 并不是以这种 CSR 的思路构建的。(我之前开过的一个坑 Vuecho 其实就是这种尝试,这是一个 demo:alpha.skywt.cn)那么 PJAX 实际上就是以上两者的「折中方案」。通过这段神奇的 js 代码,它可以自己判断哪些部分刷新了,然后在刷新(或者进入新的页面)时通过 DOM 操作更新要更新的部分。虽然后端的实现完全是服务器端渲染,但是前端看起来就好像是客户端渲染一样,实现全站无刷新,可以获得非常迅捷的体验。给 Typecho 主题加上 PJAX⚠️ 本文使用的是 jquery-pjax。这一步其实非常简单(麻烦的在后面),首先把博客的动态内容(即从一个页面进入另一个页面要更新的内容)用一个 之类的标签包裹起来,并将 id 设置为 pjax-container。这个容器就叫做 PJAX 容器。在这个容器外部,是刷新页面不需要更新的部分,如每个页面都一样的页眉、导航栏、页脚。在这个容器内部,是刷新页面需要重新加载的部分,比如从文章列表进入一篇文章,容器中的内容由「文章列表」改变为「文章内容」。一般主题的结构包含 header.php、footer.php,只要在 header.php 的末尾加上容器的开放 tag,在 footer.php 的开头加上容器的封闭 tag 即可。最后渲染出来的页面应该像是这样:<head> <!-- ... --> </head> <body> <header><!-- 页眉,标题什么的 --></header> <nav><!-- 导航栏什么的 --></nav> <main id="pjax-container"> <!-- 网站主体内容,文章列表 / 文章内容 / 评论什么的 --> </main> <script> // 下面要加上的代码 </script> <footer><!-- 页脚什么的 --></footer> </body>在 footer.php 或者其他地方(PJAX 容器的后面,就是上面这段代码的 部分)加上这段代码:$(document).pjax('a[href^="<?php $this->options->siteUrl()?>"]:not(a[target="_blank"])', {container: '#pjax-container', fragment: '#pjax-container'});$(document).on('pjax:send',function() {// alert('开始加载'); // 开始加载时要运行的代码(如显示加载动画)});$(document).on('pjax:complete', function() {// alert('加载完成'); // 加载完成后要运行的代码(如去除加载动画)});传入 pjax 函数的第一个参数是 selector,它告诉 PJAX,只对于目标为本站内的且没有设置在新页面打开(target="_blank")的链接进行无刷新加载,其他链接(如站外链接)则会正常加载。第二个参数是 container,指定 id 为 pjax-container 的元素作为 PJAX 容器,当然也可以任意修改。可以查阅文档修改更多参数。on 和 complete 都是 PJAX 事件,文档里也列举了更多事件。可以用这个测试一下 PJAX 开启成功了没有。经过以上步骤(应该)可以发现页面之间的切换明显变快了。解决评论问题启用 PJAX 后,如果从一个页面进入另一个页面(比如从首页进入某个文章页面),提交评论会发现页面刷新了一下(或者 Safari 干脆显示无法加载),没法正常发表评论。必须手动刷新这个页面才能发评论。这是因为 Typecho 提交评论的 js 脚本放在 里(F12 可以看到),而当我们刷新页面, 中的脚本并不会更新(因为其在 PJAX 容器之外)。所以只有第一次进入页面可以正常提交评论,进入其他页面后就不行。解决方法也很简单。在评论区加上这段从 里 copy 出来的代码:(function() {window.TypechoComment = { dom: function(id) { return document.getElementById(id); }, create: function(tag, attr) { var el = document.createElement(tag); for (var key in attr) { el.setAttribute(key, attr[key]); } return el; }, reply: function(cid, coid) { var comment = this.dom(cid), parent = comment.parentNode, response = this.dom('<?php echo $this->respondId; ?>'), input = this.dom('comment-parent'), form = 'form' == response.tagName ? response : response.getElementsByTagName('form')[0], textarea = response.getElementsByTagName('textarea')[0]; if (null == input) { input = this.create('input', { 'type': 'hidden', 'name': 'parent', 'id': 'comment-parent' }); form.appendChild(input); } input.setAttribute('value', coid); if (null == this.dom('comment-form-place-holder')) { var holder = this.create('div', { 'id': 'comment-form-place-holder' }); response.parentNode.insertBefore(holder, response); } comment.appendChild(response); this.dom('cancel-comment-reply-link').style.display = ''; if (null != textarea && 'text' == textarea.name) { textarea.focus(); } return false; }, cancelReply: function() { var response = this.dom('<?php echo $this->respondId; ?>'), holder = this.dom('comment-form-place-holder'), input = this.dom('comment-parent'); if (null != input) { input.parentNode.removeChild(input); } if (null == holder) { return true; } this.dom('cancel-comment-reply-link').style.display = 'none'; holder.parentNode.insertBefore(response, holder); return false; } };})();注意其中的 <?php echo $this->respondId; ?>,这就是前文评论失败的原因——每个页面的 respondId 不一样,所以这个是需要刷新的。除此之外,需要关闭 Typecho 后台的「设置」-「评论」-「评论提交」中取消勾选「开启反垃圾保护」。这个选项实际上是开启反 CSRF 攻击的防护,即每次加载页面服务器会传一个每次不同的随机字符串(在页面里表单最后面一个名为 _ 的 hidden input 元素),提交评论时表单里会带上它,而用 PJAX 的方式去拿这个字符串非常麻烦,索性关闭了。最好加上一些反垃圾评论的插件,因为没有了反 CSRF 防护,可以用脚本轻易多次提交评论。经过以上的修改,应该可以正常提交评论了。解决插件问题KaTeX 数学公式没法渲染(第一次加载能渲染,进入新页面没法渲染),也是和评论类似的问题。渲染 KaTeX 公式的这段 js 代码:renderMathInElement(document.body, { delimiters: [ {left: "$$", right: "$$", display: true}, {left: "$", right: "$", display: false}, ] });放在 PJAX 容器之外,所以只会在最初加载页面的时候执行一次。它涉及到 DOM 操作,我们希望它每次都能执行。解决方法是放在 PJAX 容器内部,或者在 complete 事件中也执行一次。除此之外,包括 aplayer 插件、fancybox 图片灯箱、代码高亮等等都是类似的问题,只要把 DOM 操作的代码放到 PJAX 容器内部即可。经过以上的操作,基本上网站的 PJAX 就没问题啦。享受极速的响应吧~
2023年05月13日
25 阅读
0 评论
0 点赞
1
2
3