PHP Day 8

EXPLAIN

id
select_type
table
type
possible_keys
key
key_len
ref
rows
Extra

关联优化器
$myisamchk –analyze pathtomysqldatabase/table
$myisamchk –analyze pathtomysqldatabase/*.MYI
$myisamchk –analyze pathtomysqldatabase/*/*.MYI
mysql>analyze table tablename1, tablename2, …;

将列创建为索引
ALTER TABLE table ADD INDEX (column);

表的优化
mysql>OPTIMIZE TABLE tablename;
$myisamchk -r table
$myisamchk –sort-index –sort-records=1 pathtomysqldatabase/*/*.MYI

备份数据库
1. LOCK TABLES table lock_type [, table lock_type ...]
锁定类型 READE / WRITE,备份之前必须执行 FLUSH TABLES。
*******没明白*******
以文件方式备份

2. $mysqldump –opt –all-databases > backup-file.sql
再,停止 mysqld 进程,通过 –log-bin[=logfile] 重新启动进程。日志将记录备份后数据库发生的变化。
*******还是没明白*******

3. $mysqlhotcopy database /path/for/backup
再,停止 mysqld 进程,通过 –log-bin[=logfile] 重新启动进程。日志将记录备份后数据库发生的变化。
*******模模糊糊*******

恢复 MySQL 数据库
使用了方法 1,可将数据文件重新复制到安装 MySQL 的相同位置。
使用了方法 2,首先在导出文件中运行查询(???)从而将数据库重新构建至导出时的状态,接着将数据库更新至保存在二进制日志文件中的状态 —— $mysqlbinlog hostname-bin.[0-9]* | mysql
*******没明白*******
先 $mysql db_name < backup-file.sql 将转储文件读回到服务器,然后再更新。

设置主服务器和从服务器,略过

--eof--

p.s. 这一章基本没怎么看懂 :sad:
p.s.2 貌似小站被墙了 :shock:
意外发现 WordPress 彩蛋,已经有人发现了 http://www.youtube.com/watch?v=gkF4WLSkz-U

PHP Day 7

抽象类(abstract class): 不能被实例化.
抽象方法(abstract operation): 只提供了一个方法的声明, 但是不提供方法的具体实现.
包含抽象方法的任何类自身必须是抽象的.

使用 PEAR::DB 抽象类与数据库进行交互

安装: $sudo apt-get install php-pear
检查最新版本: $pear list-upgrades
升级 DB: $sudo pear upgrade DB

require_once(’DB.php’); # set for using PEAR DB
$dsn = “mysqli://$user:$pass@$host/$db_name”; # set up DSN
$db = $DB::connect($dsn); # connect to database

与实例化 mysqli 类连接数据库相比其实都差不多.

Prepared 语句向 MySQL 发送需要执行的查询模板, 再单独发送数据.
$query = “insert into table values(?, ?, …)”;
$stmt = $db->prepare($query);
$stmt->bind_param(”sssd”, $value1, $value2, …);
$stmt->execute();
$stmt->affected_rows;

除了 bind_param()[insert?] 还有 bind_result() [select?] 函数.

注意! 一定要细心! 下面使用上面的变量, 拼写要正确, 不要想当然 :mrgreen:

PHP Day 6

设计 Web 数据库

列(Column), 又称域或属性.

行(row), 也称为记录.

表中的标志列称为键(key), 一个键可以由不止一列组成. 主键(primary key)和外键(foreign key). 考虑要建模的实际对象, 避免保存冗余数据(避免 3 种更新不规则: 修改, 插入, 删除). 使用原子列值, 每行的每个属性只储存一个数据. 确认所选择的键是唯一的, 要有意义, 事先考虑需要询问数据库的问题. 避免空属性的设计.

Web 数据库架构, 暂不讨论.

—————————————————————

创建 Web 数据库(仅学习 MySQL 数据库)

登录 MySQL Monitor: $mysql -h hostname -u username -p

-h 希望连接的主机, 默认为本机(localhost)
-u 登录时的用户名(可以不是 root)
-p 提示需要密码

创建 root:
$mysql -u root
mysql> SET PASSWORD FOR ”@’localhost’ = PASSWORD(’newpwd’);
mysql> SET PASSWORD FOR ”@’host_name’ = PASSWORD(’newpwd’);

删除匿名用户:
mysql> DELETE FROM mysql.user WHERE Host=’localhost’ AND User=”;

创建数据库: mysql> create database dbname;
(注意, 不能忘记分号!)

创建用户(最少权限原则):
GRANT privileges [columns]
ON item
TO user_name [IDENTIFIED BY 'password']
[REQUIRE ssl_options]
[WITH [GRANT OPTION | limit_options] ]

用户权限(PMWD3rd P164), 管理员权限(PMWD3rd P164), 特别权限(ALL, USAGE).

收回权限:
REVOKE privileges [columns]
ON item
FROM user_name

使用指定数据库:
mysql> use dbname;
或者
$mysql -D dbname -h hostname -u username -p

—————————————————————

创建数据库表, 略过. :mrgreen:

—————————————————————

插入数据(INSERT):
INSERT LOW_PRIORITY DELAYED IGNORE [INTO] table [(column1, ...)] VALUES (value1, …);

注意: 会按顺序插入数据.
向指定列插入数据:
insert into tablename (column1, column2, …) values (’value1′, ‘value2′, …);
或者
insert into tablename set column1=’value1′, column2=’value2′, …;

将脚本插入数据库:
$mysql -h host -u username -p < name_insert.sql

—————————————————————

获取数据(SELECT):
略过. :mrgreen:

—————————————————————

更新数据库记录:
UPDATE

创建后修改表:
ALTER TABLE

删除:
DELETE
DROP

–eof–

Dict in Ubuntu

最近经常上英文网站,本来一直使用 Baidu 内嵌的 Dr.eye,后来发现不太方便于是安装了 dict.cn 的网页划词。但这两天 dict.cn 的服务器似乎有问题,老是查不到词汇(而且使用在线划词会把 firefox 搞死……)。于是乎上网查了一下,发现在 Linux 上可以用 terminal 查单词,除了没发音该有的都有。

实际上用的是 dict 开放协议。

$sudo apt-get install dict #客户端 (在 /etc/dictd/dict.conf 注释掉服务器,让其只使用本地读字典)
$sudo apt-get install dictd #服务器端
$sudo apt-get dict-xdict dict-stardic dict-gcide #三个字典文件

最后使用 $dict word 就可以查单词了,退出按 Q 键。

参考:http://blog.cathayan.org/item/1715

p.s. 今早遇到件特不愉快的事

PHP Day 5

就着教程和 PHP Manual 磕磕绊绊把 PHP 的基础知识了解了一遍(只能算是了解)。

没想到在最后又被卡了一下——Object Iteration。我始终没明白 Iterator 的处理机制,也没理解 IteratorAggregate 和 Iterator 的区别。在 Google 上大概查了下,貌似都是 Manual 的拷贝,所以只能先把这块儿放下。

教程和 Manual 相比各有千秋吧,Manual 的实效性当然是最棒的,上面的例子也比教程的简单一些。不过 Manual 说到底还是有些干巴。另外语言也是一道不宽不窄的障碍,如果英语再好一些也许就可以放下教程,User Contributed Notes 更有人情味 :mrgreen:

接下来还是打算跟着教程走(PHP Manual 上不会有 MySQL 手册吧 :grin: ),学习有关数据库的知识。

就先这么计划了,也不知道这个速度快不快,我是觉得自己有点心急,嗯欲速则不达,心态平和。

update:迭代器好像是把 foreach 的实现方法一步一步展示出来,只是不知道迭代器的流程怎么这么怪。

PHP Day 4

从下篇起不再使用首字下沉(first-letter 伪类应该不被 IE6 支持吧 :mrgreen: )。

$c = new myClass;

在以前的 PHP 版本中可以这样创建一个新类并将该类的实例复制给 $c?这样做的坏处是“假设对象是按引用传递对象的,尤其是在向函数传递对象时,这种行为可能会导致问题”,会导致什么问题?这句话貌似在逻辑上有问题,例子明明是按值传递对象的么。

select_object()->display();

“select_object()方法返回了一个具有display()方法的对象”——“属性可以与成员变量和特性这些词交替使用,操作也可以与方法交替使用”——我恨交替使用

类的设计——看代码能明白,自己写又忘了 :sad:

PHP Day 3

我知道困难就在不远处,只是没想到来的这么快。

遇到的第一个难点是“递归函数”,所谓递归函数就是函数自己调用自己,概念很简单,但要理解却是另外一回事儿了。十分感谢 fcicq 的指导,同时也感谢他告诉我一个新的天地 :mrgreen:

第二个难点是刚刚碰到的,面向对象。这玩意儿比递归函数抽象多了,而且我之前也没有接触过面向功能、面向过程,也就无从知晓这个“面向对象”的好处。由面向对象又引出了很多新鲜概念(于我而言),到了“类”又卡壳半天,然后是如何访问属性。不明白为什么从类的外部直接访问类的属性不好,也就不明白什么是“封装”。

好吧,睡觉,明见 :!:

update:
嗯,重看一遍果然有所收获,虽然还是不太明白面向对象的好处,但感觉对数据的使用确实方便不少。
原来很简单就可以实现对属性和操作的调用,昨天晚上咋就没明白捏。

看来需要找一些基础理论来看看了 :grin: