MySQL学习 -- 数据基本操作

插入数据 向表中指定字段插入 insert into 表名(字段列表) values(对应字段列表); insert class(name,sex) values('wangyu','man'); insert class(sex,name) values('man','wangyu'); insert class(name) values('wangyu'); 向表中所有字段插入 insert into 表名 values(表结构); // 值列表必须于字段顺序一致 insert into class values(1,'gg','woman'); 查询数据 查询表中所有数据 selec * from 表名; select * from class; 查询表中的部分字段 select 字段列表 from 表名; select id from class; select id,name from class; 简单的条件查询 select 字段名 from 表名 where 条件; select name from class where sex = 'man'; 删除数据 delete from 表名 [where 条件]; 注:如果没有where条件,意味删除该表所有数据。 delete from class where sex = 'woma'; 更新数据 update 表名 set 字段名 = 新值 [where 条件]; ...

January 20, 2018 · 1 min · 97 words · Norman Wang

MySQL学习 -- 数据表操作

创建数据表 创建普通表 create table 数据库名.数据表名(字段名 字段类型[字段属性])[表选项]; use 数据库名 create table 数据表名(字段名 字段类型[字段属性])[表选项]; create table test.class(name varchar(10))charset utf8; 复制已有表结构 create table 表名 like 数据库名.被复制的表名; 只复制表结构,不复制数据 use test; create table teacher like test1.teacher; create test.table teacher like test1.teacher; 显示数据表 查看所有表 show tables; 匹配显示表 show tables like ‘匹配模式’; show tables like '%dec'; 显示表结构 显示表中包涵的字段信息(名字,属性,类型等) describe 表名 desc 表名 show columns from 表名 desc class 显示表创建语句 show create table 表名; show create table 表名\g (推荐) show create table class\g 设置表属性 alter table 表名 表选项 ...

January 19, 2018 · 1 min · 186 words · Norman Wang

MySQL学习 -- 数据库操作

创建数据库 基本语法 create database 数据库名 [库选项]; 库选项:数据库的相关属性(可有可无) 字符集:charset 字符集 校对集:collate 校对集 显示数据库 显示所有数据库 基本语法 show databases; 系统数据库解析 information_schema 保存数据库所有的结构信息 mysql 核心数据库:权限关系 performance_schema 效率库 显示部分数据库 基本语法:show databases like ‘匹配模式’; _:匹配当前位置单个字符 %:匹配指定位置多个字符 获取以my开头的所有数据库:’my%’; 获取以m开头,后面第一个字母不确定,最后为database的数据库:’m_database’; 获取以database结尾的数据库:’%database’; 显示创建的数据库 基本语法:show create database 数据库名; 选择数据库 要想操作表,必须进入相应的数据库 基本语法:use 数据库名; 修改数据库 修改数据库字符集(库选项) 5.5版本之前可以修改名字,以后版本不可以修改 基本语法:alter database 数据库名字 charset 字符集; 删除数据库 基本语法:drop database 数据库名字;

January 14, 2018 · 1 min · 54 words · Norman Wang

PHP学习 -- 数组排序算法

本文涉及到 冒泡算法 选择排序 快速排序 归并排序 顺序查找 二分/折半查找 <?php // 数组排序算法 // 冒泡算法 两个数字比较 较大的数字放到右边 $arr = array(9,5,6,1,89,6,6,1,2,3,6); for($j = 0,$len = count($arr);$j < $len;$j++){ for($i =0,$len =count($arr);$i < $len-1-$j;$i++){ if($arr[$i] > $arr[$i+1]){ $temp = $arr[$i]; $arr[$i] = $arr[$i+1]; $arr[$i+1] = $temp; } } } echo '<pre>'; print_r($arr); echo '<hr>'; // 选择排序 $arr1 = array(5,6,2,3,1,0); for($i = 0,$len = count($arr1);$i < $len;$i++){ // 假定一个最小的 $min = $i; // 用假定最小的和剩余其他的比较 for($j = $i+1;$j < $len;$j++){ // 当前比较的元素 < 假定的,把当前的下标赋值给min if($arr1[$j] < $arr1[$min]){ $min = $j; } } // 交换真正的最小值 if($min != $i){ $temp = $arr1[$i]; $arr1[$i] = $arr1[$min]; $arr1[$min] = $temp; } } echo '<pre>'; print_r($arr); echo '<hr>'; // 快速排序 $arr2 = [5,6,1,2,3,0]; function quick_sort($arr2){ // 递归出口 数组长度<=1时候就已经排好了 $len = count($arr2); if($len <=1) return $arr2; // 存放数组 $left = $right = array(); for($i =1;$i < $len;$i++){ // 一般情况下把第一个元素当作比较元素,比它小的放到left里面,大的放到right里面 if($arr2[$i] < $arr2[0]){ $left[] = $arr2[$i]; }else{ $right[] = $arr2[$i]; } } // 递归点 $left = quick_sort($left); $right = quick_sort($right); returnarray_merge($left,array($arr2[0]),$right); } echo '<pre>'; print_r(quick_sort($arr2)); echo '<hr>'; // 归并排序 // 二路归并 必须是两个有序数组 // $arr4 = [1,3,5]; // $arr5 = [2,3]; // // 创建一个空数组用于存放归并空间 // $arr6 = array(); // while (count($arr4) && count($arr5)) { // $arr6[] = $arr4[0] < $arr5[0] ? array_shift($arr4) : array_shift($arr5); // } // print_r(array_merge($arr6,$arr4,$arr5)); $arr3 = [5,1,3,9,0]; function merge_sort($arr){ // 递归出口 数组长度<=1时候就已经排好了 $len = count($arr); if($len <=1) return $arr; // 拆分 $middle = floor($len/2); $left = array_slice($arr,0,$middle); $right = array_slice($arr,$middle); // 递归点,保证left和right为有序数组 $left = merge_sort($left); $right = merge_sort($right); $m = array(); while (count($left) &&count($right)) { // 只要left right里面有元素,就进入循环 // 取出left right里面的第一个元素进行比较 哪个小就把小的放入m中 $m[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right); } return (array_merge($m,$left,$right)); } print_r(merge_sort($arr3)); echo '<hr>'; // 查找算法 // 顺序查找 $arr4 = [8,9,7,12,0]; functioncheck_order($arr,$num){ for($i =0,$len =count($arr);$i < $len;$i++){ if($arr[$i] == $num){ return $i; } } returnfalse; } var_dump(check_order($arr4,102)); // 二分/折半 查找 $arr5 = [1,5,7,15,98,120]; $ress = 5; functioncheck_break($arr,$ress){ // 取得边界 $right = count($arr); $left = 0; while ($left <= $right) { // 得到中间值 $middle = floor(($left + $right)/2); // 匹配数据 if($arr[$middle] == $ress){ return $middle +1; } // 值在右边 if($arr[$middle] < $ress){ $left = $middle + 1; }else{ $right = $middle - 1; } } returnfalse; } var_dump(check_break($arr5,$ress));

January 14, 2018 · 2 min · 350 words · Norman Wang

PHP学习 -- 两种方法实现斐波那契数列

什么是斐波那契数列 斐波那契数列的定义者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的列昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点相当于今日的阿尔及利亚地区,列昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯等地研究数学。 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…… 这个数列从第3项开始,每一项都等于前两项之和。 递推算法 function my_recursive($des){ if($des == 1 || $des == 2) return 1; $f[1] = 1; $f[2] = 1; for($i = 3;$i <= $des;$i++){ $f[$i] = $f[$i-1] + $f[$i-2]; } return $f[$des]; } 递归算法 function recursive($n){ // 递归出口 if($n == 1 || $n == 2) return 1; // 递归点 return recursive($n-1) + recursive($n-2); }

January 13, 2018 · 1 min · 72 words · Norman Wang

PHP学习 -- 数组相关的函数

<?php // 数组相关的函数 // 1. 排序函数 $arr = array(3,2,9,6,4,1,0); echo '<pre>'; sort($arr); // 按照值顺序排 不保留下标 重排 // asort($arr); // 按照值顺序排 保留下标 // ksort($arr); // 按照键顺序排 // krsort($arr); // 按照键逆序排 //shuffle($arr); print_r($arr); shuffle($arr); // 随机排序 print_r($arr); // 2. 指针函数 echo '<hr>'; $arr1 = array('wnagyu',15,'hui',5,9,3,1); echo current($arr1),'<br>'; // 查看当前指针 echo key($arr1),'<br>'; // 查看当前key echo next($arr1),next($arr1),'<br>'; // 移动指针到下一个 echo prev($arr1),'<br>'; // 移动指针到上一个 echo key($arr1),'<br>'; echo '<pre>'; print_r($arr1); echo '<hr>'; echo end($arr1),'<br>'; // 重置指针 返回最后一个值 echo reset($arr1),'<br>'; // 重置指针 返回第一个值 // 3. 其他函数 // array_push() 往数组中加入一个元素 (数组后面) // array_pop() 从数组中取出一个元素 (数组后面) // array_shift() 从数组中取出一个元素 (数组前面) // array_unshift() 往数组中加入一个元素 (数组前面) $arr2 = array('tg',5,'po',1,3,9,12,56); // 模拟数据结构 // 栈 先进后出 array_push($arr2,45); echo '<pre>'; print_r($arr2); array_pop($arr2); echo '<pre>'; print_r($arr2); // 队列 先进先出 // array_push() 后进 array_shift() 先出 // array_unshift() 前进 array_pop() 后出 $arr3 = [1,3,6,9,15,8]; echo '<pre>'; print_r(array_reverse($arr3)); // 反转数组 var_dump(in_array(1,$arr3)); // 查找值是否存在于数组中,返回true/false var_dump(in_array(123,$arr3)); print_r(array_keys($arr3)); // 返回下标 数组 print_r(array_values($arr3));// 返回值 数组

January 12, 2018 · 1 min · 143 words · Norman Wang

PHP学习 -- 全局变量和局部变量

全局变量 PHP的全局变量和JS里面的全局变量不一样,JS里面的全局变量是那都可以访问到,PHP里的全局变量只有函数内部访问不到 <?php $a = 1; function main(){ echo $a; // 错误,函数内部访问不到全局变量 } ?> 局部变量 只作用于函数里面 <?php $a = 1; function main(){ $b = 3; echo $b; // b是在函数内部定义,可以访问 } ?> 超全局变量 哪都可以访问 注:全局变量都储存在$GLOBALS下 通过$GLOBALS[‘变量名’]访问 局部作用域访问全局变量 使用$GLOBALS来访问全局变量 <?php $a = 1; function main(){ $b = 3; echo $b,$GLOBALS['a']; // 因为$GLOBALS是超全局变量,所有的全局变量都储存在$GLOBALS下面,所以可以访问 } ?> 使用global关键字 $a = 1; function main(){ global $a; echo $a; $a = 5; // 修改的还是一个变量 修改后a = 5; } main(); echo $a; // 运行结果为 1 5 原理:在函数内部和外部,对同一个变量名使用一块内存地址保存数据,从而实现共同拥有 ...

January 11, 2018 · 1 min · 81 words · Norman Wang

入门Vuex

State 获取State中的值的三种方法 直接在模板里面写 <p>{{ $store.state.count }}</p> 通过计算属性 computed: { count(){ return this.$store.state.count } } 通过mapstate computed: mapState(['count']) Mutations 直接写在模板里面(不传值) <button @click="$store.commit('add')">+</button> 通过mapmutations(推荐,传值不传值都可以使用) const mutations = { add(state){ state.count++; }, reduce(state,n){ state.count-=n; } } methods: { ...mapMutations(['reduce','add']) } <button @click="add()">+</button> <button @click="reduce(5)">-</button> getters 一般写法 const getters = { count : state => state.count+=100 } computed: { ...mapState(['count']), count(){ return this.$store.getters.count } } 简写 const getters = { count : state => state.count+=100 } computed: { ...mapState(['count']), ...mapGetters(['count']) } actions methods: { ...mapActions(['addAction','reduceAction']) } <button @click="addAction">+</button> <button @click="reduceAction">-</button> const actions = { addAction({commit}){ commit('add'); setTimeout(()=>{commit('reduce',3)},2000); console.log('我比reduce提前执行'); }, reduceAction(context){ context.commit('reduce',5); setTimeout(()=>{context.commit('add')},2000); console.log('我比reduce提前执行'); } }

December 7, 2017 · 1 min · 101 words · Norman Wang

node 图片验证码库

验证码演示 有库不用是傻逼,这个库有三组图片分别是red gray green ,其中red里面只是数字,不建议使用,剩下两个有字母和数字。 下面是一个老外写的例子,我就是直接参考它写的代码的。https://github.com/liangzeng/validat-num-demo 代码 var PW = require("png-word"); var pw = PW(PW.GRAY); //这里可以选GRAY PNGWord RED var r = require("random-word")("abcdefghijklmnopqrst0123456789"); const validat = (req, res) => { var numtxt = req.session.validat_num = r.random(4); pw.createPNG(numtxt,function(pngnum){ res.send(pngnum); }) } module.exports = validat <div class="remember"> <label for="remember-me"> <img src="/admin/validat" /> </label> <input name="validat" type="text" /> </div> 注意 需要 png-word random-word 这两个库 本人是在express下使用的,除了图片样式不咋地,贼好用 只是一个简单的数字加字母验证码,如果要反爬虫就直接用第三方验证码服务吧

November 29, 2017 · 1 min · 62 words · Norman Wang

关于 can't set headers after they are sent 错误解析

错误描述 这个错误翻译过来是在headers发送过以后不能再次发送。意思是发送了两次headers,所以会报错。 然后通过我的不懈努力,终于找到了问题所在。 解析 在处理HTTP请求时,服务器会先输出响应头,然后再输出主体内容,而一旦输出过一次响应头比如执行过 res.writeHead() 或 res.write() 或 res.end(),你再尝试通过 res.setHeader() 或 res.writeHead() 来设置响应头时,就会报这个错误。 有些方法比如 res.redirect() 会调用 res.writeHead() 说明:express中的 res.header() 相当于 res.writeHead() ,res.send() 相当于 res.write()

November 24, 2017 · 1 min · 25 words · Norman Wang