我的web学习日记 -- easyfly

easyfly 发布于 2015年08月22日
tinyfool 尼克徐 等2人欣赏。

打算开始系统的长久的学习web开发(偏后端)。

为了克服自己做一件事情不容易坚持的坏毛病,计划在 OurCoders上面记录学习日记,接受大家监督。

目标:

在年底前做出一个还算过的去的web产品并上线开始服务。(具体正在构思中)

方法:

因为本身有C++背景,同时学过点Python和Django,所以打算系统学习下php语言(毕竟php做东西更快,应用更广,而且未来工作机会也更多),以项目为驱动。

在每天工作之余坚持学习,每天打卡记录学习内容和学习感悟,至少每周有5天或者5天以上的记录,允许在两天内补交学习记录。

不贪大求全,每天有所进步就好。

以到今年年底2015年12月31号为期,到时再来撰写总结。

祝自己好运 :)

共12条回复
easyfly 回复于 2015年08月22日

[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月22日

搭个博客写学习笔记吧

easyfly 回复于 2015年08月23日

2楼 @罗西南迪 可以考虑啊

easyfly 回复于 2015年08月23日

[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 的一个别名。

easyfly 回复于 2015年08月24日

[2015-08-24]

学习内容

《PHP和MySQL Web开发》一书第9、10 两章,MySQL的基本操作

学习体会

总结一下,

在安装完毕Wampserver之后,就可以运行你的MySQL操作了

最基本的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;

  • 创建数据库表 TABLE 具体的可以见github代码

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;

xphy2321 回复于 2015年08月25日

楼主要学习drupal吗

easyfly 回复于 2015年08月25日

6楼 @xphy2321 是这个? http://drupalchina.cn/

等把手头的这本《PHP和MySQL Web开发》学完了可以考虑学习下。谢谢推荐。

easyfly 回复于 2015年08月25日

[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);​
easyfly 回复于 2015年08月26日

[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;

01

其中books, testbook,testbook2,testbook3是我们建立的,其他事系统自带的

> use mysql

> show tables;

可以看到里面的那些tables,包含

alt text

alt text

随便打开一个来看看下,比如db表:

查看一个表的结构的命令是

> show columns from db;

或者

> describe db;

查看下有哪些用户,以及相关的信息。由于user表的column太多了,我们选择一些来看看

alt text

> select Host, User, password, Select_priv from user;

可以看到密码都是用了加密保存

权限表:

我们可以创建一个账户ally然后给赋予某个表的select 权限,在再看下tables_priv 表

alt text

alt text

alt text

> 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;

alt text

用EXPLAIN 来查看背后的具体操作

alt text

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;

alt text

数据库的备份

> mysqldump --opt --all-databases > all.sql

将整个数据库保存到 all.sql 文件中去

easyfly 回复于 2015年08月27日

[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;
easyfly 回复于 2015年08月28日

[2015-08-28]

学习内容

今天看了【PHP和MySQL web开发】第14、15章,web安全等,没写什么PHP代码。

中午的时候听了公司Python兴趣小组关于Django的初步学习的总结,

下午的时候又听了关于bootstrap的介绍,要马上用起来,做出漂亮的界面。

easyfly 回复于 2015年08月31日

[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>

标记中,必须设置属性enctype =" multipart/form-data" ,这样服务器就知道上传的文件带有常规的表单信息 需要有一个设置上传文件最大长度的表单域,我们把它隐藏起来,可以不用设置名字,但是设置名字的话,必须是 MAXFILESIZE.1 000 000B差不多是1MB。

PHP对上传文件的处理

文件上传时,会被保存在一个临时目录,这个可以在php.ini文件的uploadtmpdir设置。

在脚本执行完毕之后,临时目录里面的临时文件会被删除,所以我们需要永久保存的话需要移出去。

需要处理的数据保存在超技数组 $_FILES 中,同时也保存 中的标记名称。

我们可以获得:

$FILES['username']['tmpname'] , 是文件的临时存储位置

$_FILES['username']['name'] 用户系统中的文件名称。

$_FILES['username']['size'] 文件字节大小

$_FILES['username']['type'] 文件的MIME类型,比如是text/plain 或者img/gif 类型

$_FILES['username']['error'] 表示文件上传的错误代码,无错误为0

0:OK

1:文件太大,超过php设置的大小

2:文件太大,超过表单设置的大小

3:只有部分文件上传

4:文件没有上传

6:找不到临时目录

7: 文件写入磁盘失败

代码大概是这样的

<html>
<head>
  <title> Uploading ...</title>
</head>
<body>
  <h1> Uploading file ...</h1>
 <?php
   if ($_FILES['userfile']['error']>0)
   {
     echo 'Problem:';
     switch ($_FILES['userfile']['error'])
     {
       case 1:
         echo "File exceed upload_max_filesize";
         break;
       case 2:
         echo "File exceed max_file_size";
         break;
       case 3:
         echo "File only partially uploaded";
         break;
      case 4:
         echo "No file uploaded";
         break;
      case 6:
        echo "cannot upload file: no temp directory specified";
        break;
      case 7:
        echo "Upload failed, cannot write to disk";
        break;
    }
   exit;


}
// DOES the file have the right MIME type?
if ($_FILES['userfile']['type'] != 'text/plain')
{
   echo "Problem: files is not plain text";
   exit;
 }
 echo $_FILES['userfile']['name'];
 // put the file where we'd like it
 $upfile ='C:\\wamp\www\\chap19\\upload\\'.$_FILES['userfile']['name'];
 if (is_uploaded_file($_FILES['userfile']['tmp_name']))
 {
    if (!move_uploaded_file($_FILES['userfile']['tmp_name'], $upfile))
    {
      echo "Problem: cound not move file to destination directory";
      exit;
    }
  }
  else
  {
     echo "Problem: possible file upload attack. Filename:";
     echo $_FILES['userfile']['name'];
     exit;
   }

   echo 'FILE uploaded successfully <br><br>';

   // move possible HTM and PHP tags from the file's contents
   $contents = file_get_contents($upfile);
   $contents = strip_tags($contents);
   file_put_contents($_FILES['userfile']['name'], $contents);

   // show what was uploaded
   echo "<p> Preview of uploaded file contents: <br /> <hr /></p>";
   echo nl2br($contents);
   echo '<br/> <hr />';

?>
</body>
</html>

本帖有12个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]