`$a ?? 0` 等同于 `isset($a) ? $a : 0`。 `$a ?: 0` 等同于 `$a ? $a : 0`。 `empty`:判断一个变量是否为空(`null` `false` `00` `0` `'0'`这类,都会返回`true`)。 `isset`:判断一个变量是否设置(值为`false` `00` `0` `'0'`这类,也会返回`true`)。 ```php // session_status() // https://www.php.net/manual/zh/function.session-status.php // 返回值 // PHP_SESSION_DISABLED 会话是被禁用的。 // PHP_SESSION_NONE 会话是启用的,但不存在当前会话。 // PHP_SESSION_ACTIVE 会话是启用的,而且存在当前会话。 ``` ------------ mysql.php参考 ```php // 参考文章:https://www.cnblogs.com/liujunhang/p/10926632.html // PHP 官网 关于MySQL的介绍:https://www.php.net/manual/zh/set.mysqlinfo.php ``` ------------ mysql ``` // 常用sql语句总结 // 在上面的代码中,我们尝试了通过mysqli对mysql数据进行的增删改查操作,其中较为核心的是,sql语句的使用。 // 下面我们来说一下常用的sql语句语法: // 创建数据库 // create database 数据库名 default character set = 'utf8'; // 创建数据表 // create table 数据表名 ( // -- 下面是表中的一些字段 // id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, // firstname VARCHAR(30) NOT NULL, // lastname VARCHAR(30) NOT NULL, // email VARCHAR(50), // reg_date TIMESTAMP // ) // 插入数据 // insert into table_name (column1, column2, column3,...) values (value1, value2, value3,...) // 读取数据 // select column_name(s) from table_name // 如果传入一个*,则表示搜索所有的数据: // select * from table_name // 也可以在后面加入指定条件 // select * from table_name where 条件 // 修改 // update table_name // set column1=value, column2=value2,... // where some_column=some_value // 删除数据 // delete from table_name // where some_column = some_value ``` ------------ 会话相关 ```php // // 初始化会话。 // // 如果要使用会话,别忘了现在就调用: // session_start(); // // 重置会话中的所有变量 // $_SESSION = array(); // // 如果要清理的更彻底,那么同时删除会话 cookie // // 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身 // if (ini_get("session.use_cookies")) { // $params = session_get_cookie_params(); // setcookie(session_name(),"", -1, // $params["path"], $params["domain"], // $params["secure"], $params["httponly"] // ); // } // // 最后,销毁会话 // session_destroy(); ------------------------------------------------------ // //开启 Session // session_start(); // // 删除所有 Session 变量 // $_SESSION = array(); // //判断 cookie 中是否保存 Session ID // if(isset($_COOKIE[session_name()])){ // setcookie(session_name(),'',time()-3600, '/'); // } // //彻底销毁 Session // session_destroy(); ``` ------------ ``` //SQL join 用于把来自两个或多个表的行结合起来。 /* https://zhidao.baidu.com/question/1835987585872639700.html SQL语句中AS的意思是:别名。 AS用处: query时 用来重新指定返回的column名字。 示例 一个table有个column叫 id,query是select id from table1 如果不想叫id,就可重新命名。 如叫 systemID,可这样写:select id as systemId from table1。 create table 或 procedure 时 as 是个关键字。 示例 create table test as select * from table1 这时会create 一个table test,完全copy table table1里的全部数据。 create procdure name as (is) begin end;这时as和is可以互换。 */ ``` ------------ mysql-connect(full).php.bak ```php connect_error){ die("连接失败,错误:" . $conn->connect_error ."
"); } // 否则连接成功 echo "数据库连接成功!
"; // *************************************************** 通过mysqli 创建数据库 *************************************************** // /* // * 通过mysqli 创建数据库 创建连接语句:$conn = new mysqli($mysql_server_name, $mysql_username, $mysql_password); // */ // // 设置sql语句 // $sql = "create database stu_01 default character set = 'utf8' "; // // 发送sql语句 并且验证是否创建成功 // if($conn->query($sql) === TRUE){ // echo "数据库创建成功."; // }else { // echo "数据库创建失败 ,错误信息为:" . $conn->error; // 如果失败输出错误信息 // } // *************************************************** 通过mysqli 创建数据表 *************************************************** // // 使用sql 创建数据表 // $sql = "create table stu_info( // id int(6) UNSIGNED auto_increment primary key, // firstname varchar(30) not null, // lastname varchar(30) not null, // email varchar(50), // reg_date timestamp // )"; // if($conn->query($sql) === TRUE){ // echo "数据表创建成功。" ."
"; // }else { // echo "数据表创建失败,错误信息:" . $conn->error ."
"; // } // *************************************************** 通过mysqli 向数据表中插入信息 *************************************************** // // 设置插入数据的sql语句 // $sql = "insert into stu_info(firstname,lastname,email) values('张三','张小三','zhangsan@qq.com')"; // // 发送sql 语句 // if($conn->query($sql) === TRUE){ // echo "新记录添加成功!"."
"; // }else { // echo "新记录添加失败,错误信息:" . $conn->error ."
"; // } // // 下面开始插入多条数据 // $sql = "insert into stu_info(firstname,lastname,email) values('张三丰','张君宝','sanfeng@qq.com');"; // // 使用.= 的形式进行sql语句连接 // $sql .= "insert into stu_info(firstname,lastname,email) values('东方不败','东方拜拜','dongfang@qq.com');"; // // 发送sql // if($conn->multi_query($sql) === TRUE) { // echo "数据添加成功!" . '
'; // }else{ // echo "数据添加失败,错误信息如下: " . $conn->connect_error . '
'; // } // *************************************************** 通过mysqli 读取数据据库中的信息 *************************************************** // // 设置sql 语句,查询全部数据 // $sql = "select * from stu_info"; // // $sql = "select id ,firstname,lastname from stu_info;"; // // $sql = "select * from stu_info where id > 3;"; // // 发送sql语句,获得查询结果 // $result = $conn->query($sql); // // 如果查询的结果>0表示查询成功,那么就可以将数据输出 // // 函数 num_rows() 判断返回的数据。 // // 如果返回的是多条数据,函数 fetch_assoc() 将结合集放入到关联数组并循环输出。 // if(isset($result->num_rows) && $result->num_rows > 0) { // // 输出数据 // while($row = $result->fetch_assoc()){ // echo "id" . $row['id'] . '- Name:' . $row['firstname'] . " " . $row['lastname'] . '
'; // } // }else { // echo "暂无数据" . '
'; // } // *************************************************** 通过mysqli 删除数据 *************************************************** // // 设置sql // $sql = "delete from stu_info where lastname = '东方拜拜';"; // // 发送sql // if($conn->query($sql) === TRUE) { // echo "删除成功" . '
'; // }else { // echo "删除失败,错误信息为:" . $conn->connect_error . '
'; // } // *************************************************** 通过mysqli 删除数据 *************************************************** // // 设置sql语句 // $sql = "update stu_info set firstname='张小三小三小三小三小三' where id = 4"; // // 发送sql语句 // if($conn->query($sql) === TRUE) { // echo "修改成功" . '
'; // }else { // echo "修改失败,错误信息:" . $conn->connect_error . '
'; // } // *************************************************** 清空数据表 *************************************************** // $sql = "TRUNCATE `$mysql_database`.`stu_info`"; // // 发送sql语句,获得查询结果 // $result = $conn->query($sql); // *************************************************** 关闭数据库连接 *************************************************** // 连接之后,还需要将连接关闭 $conn->close(); // 常用sql语句总结 // 在上面的代码中,我们尝试了通过mysqli对mysql数据进行的增删改查操作,其中较为核心的是,sql语句的使用。 // 下面我们来说一下常用的sql语句语法: // 创建数据库 // create database 数据库名 default character set = 'utf8'; // 创建数据表 // create table 数据表名 ( // -- 下面是表中的一些字段 // id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, // firstname VARCHAR(30) NOT NULL, // lastname VARCHAR(30) NOT NULL, // email VARCHAR(50), // reg_date TIMESTAMP // ) // 插入数据 // insert into table_name (column1, column2, column3,...) values (value1, value2, value3,...) // 读取数据 // select column_name(s) from table_name // 如果传入一个*,则表示搜索所有的数据: // select * from table_name // 也可以在后面加入指定条件 // select * from table_name where 条件 // 修改 // update table_name // set column1=value, column2=value2,... // where some_column=some_value // 删除数据 // delete from table_name // where some_column = some_value ``` ------------ csrf document.txt ``` [https://www.zhihu.com/question/60102253] PHP加了Token验证表单防止CSRF后还有必要做其它的防范吗?比如判断REFERER,再加个验证码之类的?有没有这个必要,目前再写一个模板做练习,已经加上了Token验证,准备再加上判断REFERER时突然觉得这样会不会有点多此一举?或则有什么其它更好的方法吗? 目前的代码是这样的,先判断来源,再判断Token //判断请求-登陆 if($_GET['login']=='action'){ //判断REFERER $referer = $_SERVER["HTTP_REFERER"]; //获取前一页面的 URL 地址 $url = $_SERVER["HTTP_HOST"]; //获取本页面的主机 URL 地址 //echo "来源页面:$referer
本地页面:$url
"; //输出结果(测试用) if(preg_match("|$url|", $referer)){ //来源通过,判断Token令牌 session_start(); if($_POST['token'] == $_SESSION['token']){ unset($_SESSION['token']); echo "这是一个正常的提交请求"; }else{ echo "这是一个非法的提交请求"; } }else{ echo '非法来源的请求'; } } [https://blog.csdn.net/qq_31752115/article/details/103775475] php如何防止csrf攻击 CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。(推荐学习:PHP编程从入门到精通) 如:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。 防御CSRF攻击: 目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。 (1)验证 HTTP Referer 字段 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。 这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。 因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。 (2)在请求地址中添加 token 并验证 CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。 要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。 (3)在 HTTP 头中自定义属性并验证 这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。 ``` ------------ note____.txt ```php 查询IP(有道)API https://foundation.youdao.com/ip/ipinfo 如果有标DJ的是英式音标,标KK的是美式音标。bai 比如你查一个词coat,DJ:du[kəut],KK:[kot]。 若页面需默认用 极速 速核,增加标签: 若页面需默认用ie兼容内核,增加标签: 若页面需默认用ie标准内核,增加标签: HTML5 Boilerplate 使用相对协议请求 Google CDN 中的 jQuery ,使用方式为: 上面的例子中除了引用 Google CDN 中的文件外,还添加了一个本地 jQuery 链接,以便连接 Google CDN 失败后,使用本地副本。 分享到QQ的缩略图显示设置:未确认是否有效? H5手Q分享通用接口代码片段(https://blog.csdn.net/qq_35432904/article/details/81704321) error_reporting(0);//禁用错误报告 error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息 error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息 error_reporting(E_ERROR | E_WARNING | E_PARSE);//显示运行时错误,与error_reporting(E_ALL ^ E_NOTICE);效果相同。 error_reporting(E_ALL);//显示所有错误 js: // var flags = [ // {flag:'1',info:'清香1'}, // {flag:'2',info:'清香2'}, // {flag:'3',info:'清香3'}, // {flag:'4',info:'清香4'}, // {flag:'5',info:'清香5'}]; // var arr = '4'; // flags.map(e=>{ if(arr == e.flag){ console.log(e.info); alert(e.info);} }) HTMl中Meta标签 参考:https://www.cnblogs.com/cxzhome/p/8448463.html 详解HTML5中rel属性的prefetch预加载功能使用:https://www.cnblogs.com/suyuwen1/p/5506397.html header('Content-Type: text/html; charset=utf-8'); //网页编码 header('Content-Type: text/plain'); //纯文本格式 header('Content-Type: image/jpeg'); //JPG、JPEG header('Content-Type: application/zip'); // ZIP文件 header('Content-Type: application/pdf'); // PDF文件 header('Content-Type: audio/mpeg'); // 音频文件 header('Content-type: text/css'); //css文件 header('Content-type: text/javascript'); //js文件 header('Content-type: application/json'); //json header('Content-type: application/pdf'); //pdf header('Content-type: text/xml'); //xml header('Content-Type: application/x-shockw**e-flash'); //Flash动画 ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ``` ------------ ```php ```