打算开始系统的长久的学习web开发(偏后端)。
为了克服自己做一件事情不容易坚持的坏毛病,计划在 OurCoders上面记录学习日记,接受大家监督。
目标:
在年底前做出一个还算过的去的web产品并上线开始服务。(具体正在构思中)
方法:
因为本身有C++背景,同时学过点Python和Django,所以打算系统学习下php语言(毕竟php做东西更快,应用更广,而且未来工作机会也更多),以项目为驱动。
在每天工作之余坚持学习,每天打卡记录学习内容和学习感悟,至少每周有5天或者5天以上的记录,允许在两天内补交学习记录。
不贪大求全,每天有所进步就好。
以到今年年底2015年12月31号为期,到时再来撰写总结。
祝自己好运 :)
[2015-08-20] [2015-08-21] [2015-08-22]
学习内容:
在windows电脑上安装php运行环境。 在Linux下非root用户安装php运行环境。
学习体会:
windows下,安装WampServer,完成 :)
linux下比较麻烦,参考了网上的攻略,以及同事的帮助,也完成了 :)
参考文章:
linux apache/php: http://blog.csdn.net/hualichenxi123/article/details/7709547
Linux MySQL: http://blog.csdn.net/lmm2003/article/details/6915920
未完成:
对于MySQL,因为修改了默认的sock文件,所以每次登陆的时候都要指定我的sock文件地址,带上 选项 -S /somewhere/mydir/mysql.sock 不知道能否在config文件中设置完成?
[2015-08-23]
学习内容:
学习了《PHP和MySQL Web开发》一书第一篇 《使用PHP》,包含第一章到第七章。
学习体会:
第五章,数组的用法。
PHP中的array类似于python的list,但是两者在背后的内存管理上是完全不同的。举例如下:
PHP:
$vara=array(1,2,3);
$varb=$vara;
$varb[3]=4;
foreach($vara as $a)
echo $a;
foreach($varb as $b)
echo $b;
可以看到$vara 还是保持着1,2,3 不变,而$varb已经是 1,2,3,4.
也就是说,$varb = $vara 在内存上完全拷贝了一份vara给varb,两者是完全独立的。
这一点,php和C++比较像。
而对于Python,
a=[1,2,3]
b=a
b.append(4)
这个时候a和b都变成了[1,2,3,4] 也就是在内存上,两者是指向了相同的内存。
这个在函数的参数传递上也是,php是纯粹的传值,拷贝生成一份函数内部的本地变量,除非显示地指明是引用,加注& 在$vara上。
而对于python,如果参数是list,那么内部改变了list之后,外部的这个参数变量同样被改变了。
问题:
对于PHP,
$a=2;
$b=&$a;
$b=3;
echo $a;
这里输出什么?应该是3,$b 是$a 的一个别名。
[2015-08-24]
《PHP和MySQL Web开发》一书第9、10 两章,MySQL的基本操作
总结一下,
在安装完毕Wampserver之后,就可以运行你的MySQL操作了
最基本的MySQL操作命令:
一个数据库相当于一个文件夹,一个数据表相当于一个文件
mysql -h hostname -u username -p
-h表示主机,在本地的可以用localhost
-u 表示用户,比如root
-p 表示登录时需要密码,如果未设置密码,可以忽略
创建名为 books的数据库
mysql> CREATE database books;
GRANT 授权,REVOKE 取消授权
权限包括:
SELECT 选择 INSERT 插入 UPDATE 跟新 DELETE 删除
以及 INDEX 建立索引 ALTER 更改表的结构 CREATE 创建数据库或者表 DROP 删除数据库或者表
创建管理员
GRANT all on * to fred identified by '123abc' with grant option;
创建了一个叫做fred的用户,密码是123abc,能够操作所有的数据库(* 指定)以及有所有的权限(all指定),并允许他向其他用户授权。
撤销用户 fred
revoke all privileges, grant from fred;
针对数据库 books 创建没有任何权限的用户 sally,
GRANT usage on books.* to sally identified by 'sally123';
给予sally适当的授权
GRANT select, insert, update, delete, index, alter, create, drop on books.* to sally;
撤销给sally的部分授权
REVOKE alter, create, drop on books.* from sally;
撤销对sally的所有授权
REVOKE all on books.* from sally;
https://github.com/easyfly007/practice_php/blob/master/chap09/bookorama.sql
CREATE table customers(
customerid int unsigned not null auto_increment primary key,
name char(50) not null,
address char(100) not null,
city char(30) not null
}
指定数据库
use books;
显示数据表
show tables;
查看数据表books 的column
show columns form books;
[2015-08-25]
《PHP和MySQL Web开发》一书第 11 章,通过web访问MySQL数据库。
总结一下web访问的内容。
0. 删除匿名用户
> mysql -u root -p
mysql> use mysql
mysql> delete from user where user =''; `
mysql> quit
> mysqladmin -u root -p reload
1. 连接数据库
@ $db = new mysqli('localhost', "bookoroma", "book123", "books");
if (mysqli_connect_errno())
{
echo "Error: could not connet to database. Please try again later.";
exit;
}
// 这里用bookoroma用户登录 本机上的 mysql数据库服务器,密码是book123, 访问books数据库
//用@抑制 new mysqli 的异常输出,因为会在mysqli_connect_no() 的if语句里面进行处理。
2. 插入数据
$query = "insert into books values
('".$isbn."', '".$author."', '".$title."', '".$price."')";
echo "the command is:".$query."<br/>";
$result = $db->query($query);
if ($result)
{
echo $db->affected_rows." books inserted into data base";
}
else
{
echo "an error has occured. The item not added";
}
// 将整条命令通过db-> query 提交给数据库,返回一个结果,也就是改变的数据内容集合给$result
3. 关闭mysql的链接
$db->close();
4. 向mysql提交查询
$query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
$result = $db->query($query);
$num_results = $result->num_rows;
for ($i =0; $i < $num_results; $i ++)
{
$row = $result->fetch_assoc();
}
// $row 现在得到了单条数据
5. 注意
如果提交的命令的内容是用户输入的,必须要对用户的输入进行验证,确保安全
$searchterm = $_POST['searchterm'];
if (! get_magic_guotes_gpc())
$searchterm = addslashes($searchterm);
[2015-08-26]
原文同时也放在了
http://blog.sina.com.cn/s/blog_6d6fbbd50102vuhm.html
《PHP和MySQL Web开发》一书第 12 章,MySQL 高级管理
总结一下MySQL的高级管理的内容
除了最基本的select insert drop update,我们还应该对MySQL 了解更多
除了你自己创建的叫做books的数据库,MySQL还自带一个mysql的内部数据库,他包含所有的用户和权限相关的系统信息。
先看看有多少个数据库:
> show databases;
其中books, testbook,testbook2,testbook3是我们建立的,其他事系统自带的
> use mysql
> show tables;
可以看到里面的那些tables,包含
随便打开一个来看看下,比如db表:
查看一个表的结构的命令是
> show columns from db;
或者
> describe db;
查看下有哪些用户,以及相关的信息。由于user表的column太多了,我们选择一些来看看
> select Host, User, password, Select_priv from user;
可以看到密码都是用了加密保存
权限表:
我们可以创建一个账户ally然后给赋予某个表的select 权限,在再看下tables_priv 表
> grant select on books.books to ally;
> describe tables_priv;
>select * from tables_priv;
可以看到里面有了我们刚刚加入的一行数据,由root GRANT 给ally的对books db的books表的select 权限
我们在调用GRANT 和 REVOKE命令的时候,这些权限表会被改变。
这里的Host 主机是%, 是一个通配符,类似于*, 表示任何ip都可以访问。
设置为任何ip都可以访问后就可以远程登录了。
但是,其实这些表也是普通的表,我们可以直接访问他,用SELECT,INSERT,UPDATE,DROP。
当直接改动权限表的时候,我们必须告诉服务器这种改变,使得这种改变生效。
需要root下登陆后,
mysql> flush privileges;
或者在外面输入
> mysqladmin flush-privileges
或者
> mysqladmin reload
查看数据库或者表
查看某个数据库的含有的表
mysql > show tables from books;
查看books数据库下面 orders 表的所有column
mysql > show columns from orders from books;
查看用户具有的权限
mysql > show grants for bookorama;
用EXPLAIN 来查看背后的具体操作
explain
select customers.name, books.title
from customers, orders, order_items, books
where customers.customerid = orders.customerid
and orders.orderid = order_items.orderid
and order_items.isbn = books.isbn
and books.title like '%Java%' \G;
数据库的备份
> mysqldump --opt --all-databases > all.sql
将整个数据库保存到 all.sql 文件中去
[2015-8-27]
学习【PHP和MySQL Web开发】一书 第13章,MySQL高级编程
1. 从外部文本文件导入到MySQL数据表
LOAD DATA INFILE "newbooks.txt" INTO TABLE books;
数据字段用tab分隔,所有的char 字符串需要用单引号包起来,数字不用。不同行用换行符分隔,特殊符号用\ 转义
2 . 索引引擎
创建表的时候,可以指定表格类型
CREATE TABLE tablename TYPE= type ...
type 可以为:
MyISAM
Indexed Sequential Access Method, 默认和标准的存储类型,可以被压缩,可以全文检索,但是不是事务安全,也不能支持外键。
MEMORY,(HEAP),存储于内存,哈希分部。
速度快,但是发生崩溃的话会丢数据(因为存于内存中,coredump时就没有了) 需要在CREATE TABLE时指定 MAX_ROW, 否则会占据大量内存,不能有BLOB或者text或者autoincrement 的列
MERGE
能够为了查询的目的,将多个MyISAM表的集合合并为一个表。
ARCHIVE
能够保存大量数据,但是只支持少量注脚,支持INSERT SELECT, 不支持delete update replace和索引。
CSV
一个CSV文件,逗号分隔。方便查看而已。
InnoDB
事务安全,也就是提供commit和rollback的功能。在需要一个事务安全的引擎的时候使用,要比MyISAM慢一点。
一般用的是MyISAM或者InnoDB。
更改数据表的类型
在创建后使用
mysql > alter table orders type = innodb
ACID四原则
atomicity 原子性
consistency 一致性
isolation 孤立性
durablity 持续性
innoDB使用事务
set autocommit = 0;
create table testtable
(id int not null primary key,
name char(30) not null,
value int not null) engine = InnoDB;
// 注意教材上用的是老版本的type =innodb // mySQL5.5 之后要用 engine= innodb
mysql > start transaction;
mysql >insert into testtable values
(1, 'lucy', 23);
mysql> commit;
在提交了commit之后 一条数据才完成了写入 如果用了rollback; 那么就会撤销写入
外键
外键就是 某个数据表的一列,是另外一个数据表的真实存在的一列.
比如 orderitems 的orderid,是orders表的orderid外键,如果 orderitems的orderid 写了一个不存在于 orders 表的orderid的值,就报错啦。(很奇怪我在创建的时候并没有报错)
建立一个包含外键的table
mysql > create table order_item2 (
orderid int unsigned not null references orders(orderid),
isbn char(13) not null,
quantity tinyint unsigned,
primary key (orderid, isbn)
) engine= innodb;
看一下orders 里面的order
存储过程
MySQL 支持把一个过程当做函数一样存储下来
比如我们可以 统计 orders这个表所有的行的amount 字段的综合,用sum 函数
mysql> select sum(amount) from orders into @aa;
sum 是内部函数名字,表示取总,amount 是表orders 的字段名字,@aa 是自己定义的 参数 查看@aa 的大小
mysql > select @aa;
mysql > select amount from orders;
会发现@aa 变成了amount的总和。
这一个过程可以用一个文件保存下来:
# basic stored procedure example
delimiter //
create procedure total_orders (out total float)
BEGIN
select sum(amount) into total from orders;
END
//
delimiter ;
另外一个创建函数的例子:
#basic syntax to create a function
delimiter //
create function add_tax(price float) return float
return price*1.1;
//
delimiter ;
我们中间可以通过delimiter 改变分隔符,本来是用;分割,然后到;就去run这个命令。先改成了//,这样可以保存多条MySQL语句(用;分割开)
调用 add_tax function:
select add_tax(100);
查看创立的某条过程或者函数:
show create procedure total_orders;
show create function add_tax;
删除之
drop procedure total_orders;
drop function add_tax;
procedure 和 funtion 有一些差别,比如procedure可以有多个输出,而function有且只有一个输出
MySQL的游标
这里不详细讲了,参考代码
https://github.com/easyfly007/practicephp/blob/master/chap13/controlstructures_cursors.sql
可以调用这个过程
mysql > call largest_order(@l);
mysql > select @l;
[2015-08-28]
今天看了【PHP和MySQL web开发】第14、15章,web安全等,没写什么PHP代码。
中午的时候听了公司Python兴趣小组关于Django的初步学习的总结,
下午的时候又听了关于bootstrap的介绍,要马上用起来,做出漂亮的界面。
[2015-08-31]
《PHP和MySQL Web开发》第19章,如何上传文件到服务器
一个最简单的上传表单:
<form action ='upload.php' method ='post' enctype ='multipart/form-data'>
<div>
<input type='hidden' name='MAX_FILE_SIZE' value ='1000000' />
<label for='userfile'>Upload a file: </label>
<input type='file' name='userfile' id='userfile' />
<input type='submit' value = 'upload file' />
</div>
</form>