Web学习记录<二>PHP语法和MySQL小结

来源:互联网 发布:windows程序设计下载 编辑:程序博客网 时间:2024/05/16 11:07

离职有一个好,就是有大把的时间自己支配。从昨天夜里开始啃《php和mysql web开发》这本书,将不熟悉的地方都敲了一遍,并记录了一些笔记。如下是章节的笔记汇总。

第一篇(1~8涨) PHP基础部分

这一篇主要介绍了PHP中,非常常用的用知识点。这一章中,关于面向对象的概念介绍没有花很多时间去看,同C++有很多类似的地方,正则的用法,同Python中的正则也是类似,具体的用法做除了区分。总的来说,语言上的东西不算多,可以很快入门。

1. 第一二章笔记

1.语法
php的语法不多少什么了,和C太像了。。面向对象的思想又有点C++的味道,但没有C++那么强大。
第一章很快的过了一遍,直接写了一遍他的代码。
2. 代码中要学习的地方
如下几点是需要积累到的:
A. $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; //获取文档的根目录
除此之外,还有另外两种方法可以获取到根目录:
$_DOCUMENT_ROOT
$HTTP_SERVER_VARS['DOCUMENT_ROOT']
B. $date = date('H:i, jS F Y'); //获取php处理请求的具体时间
C. @ $fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab');
源码中的fopen()函数前,有一个@ 符号,是告诉PHP阻止所有该函数调用所产生的错误,最好是使用异常处理机制。另外,fopen()函数支持在一个远程位置打开文件,所以文件的名称甚至可以是一个http地址,不过在使用http地址作为打开参数时,必须在目录名的最后加上结束线,比如:
http://www.example.com/
下面是错误的方法:
http://www.example.com
D. 以只读方式打开order.txt 
@$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'rb');

判断何时读完文件:
while(!feof($fp))
E. 每次读取一行数据
fgets(),fgetss(),fgetcsv 三者具体的用法,查找php的用户手册
F. 读取整个文件
readfile(),fpassthru(),file()
更多关于文件的操作,有:
查看文件是否存在,file_exists()
确定文件大小:filesize()
删除一个文件:unlink()
php中的这些关于文件的操作大部分都沿袭了C语言的风格,更复杂的用法,应该会配合正则表达来进行。
G. 锁 flock()  ----->当多个用户试图同时访问某一文件时,会出现竞争资源的情况。这里类似于操作系统 中的互斥锁。
解决上述问题,使用数据库的话,就非常方便了。

2. 3-4章笔记

1.之前在网上下了一个模板,thinkPHP的,那个人是这样声明数组的:
  $Goverment = [];
结果报错。这好像是Python的声明方法才对,php数组声明应该是
  $Goverment = array();
不管怎么讲,第一种声明是最好的。。。

2.
使用不同索引的数组
如题,就是数组的索引不再只是数字了,还可以是字符或字符串,例如:
$price = array('Apple'=>100,'Pork'=>200);
此时,price['Apple'] 的值是等于100的。
A. foreach
可用来遍历使用不是数字作为索引值的数组。例如:
 foreach($price as $key =>$value)
 echo $key.'=>'.$value.'</br>';
这里需要学习的是,$变量之后的 . 表示的是加法,如上是表示字符串相加,下面列子:
$a = 'hello';
$b = 'world';
echo $a.'++++++'.$b;
出来的结果是 hello++++++world

B. each()
list()搭配使用来遍历
each
函数会返回当前数组的元素,并将下一个数组元素作为当前元素。list()函数可以用来将一个数组分解为一系列的值,下列代码实现的结果同上述A中的一样:
while(list($product,$price)=each($price))
echo “$product - $price</br>”;
如果需要脚本两次使用上列的数组,使用reset($price)each()所指向的数组元素又回到了最初的位置。

3.
多维数组
$product = array( arry('Tri','Tires',100),
                arry('Apple','APPLE',200),
                arry('Juice','JUICE',400)  
            );
上述的多维数组可以使用数字索引来对数组成员进行访问:
   
for($row = 0;$row<3;$row++)
{
    for($col = 0;$col <3;$col++)
    {
        echo '|  '.$product[$row[col]];
    }
}

但上述代码不直观和优雅,使用非数字下标数组来表示,会更有趣一点:

$product = array(   arry('code'=>'Tri',
                    'description'=>'Tries'
                    'price'=>100;
                    )
                    arry('code'=>'Apple',
                    'description'=>'APPLE'
                    'price'=>200;
                    )
                    arry('code'=>'Juice',
                    'description'=>'JUICE'
                    'price'=>400;
                    )
                );
这里可以结合eachlist来对这个二维的数组进行访问:
for($row = 0;$row <3;$row++)
{
    while(list($key,$value)=each($product[$row]))
    {
        echo “| $value”;
    }
    echo '|  </br> ';
}
4.
数组排序
asort()
函数会根据数组的每个元素值进行排序。
ksort()
函数会根据数组的关键字来进行排序。

asort()
ksort()函数都是按照升序来排的,他们每个函数还对应了一个降序的函数:
arsort()
krsort()

5.
将文件载入数组
<?php

  //读取整个文件到一个数组中.

  //

文件中的每行作为一个数组元素
  $orders=file("$DOCUMENT_ROOT/../orders/orders.txt");

 

  // count thenumber of orders in the array

 $number_of_orders = count($orders);

 

  if($number_of_orders == 0) {

    echo"<p><strong>No orders pending.

          Pleasetry again later.</strong></p>";

  }

 

  for ($i=0;$i<$number_of_orders; $i++) {

    //split upeach line

    $line =explode("\t", $orders[$i]);     //用制表副来分割每个数组元素

    // keep onlythe number of items ordered

    $line[1] =intval($line[1]);

          //使用intcal函数从字符串中提取数字
    $line[2] = intval($line[2]);

    $line[3] =intval($line[3]);

    // outputeach order

    echo"<tr>

            <td>".$line[0]."</td>

            <td align=\"right\">".$line[1]."</td>

            <td align=\"right\">".$line[2]."</td>

            <td align=\"right\">".$line[3]."</td>

            <td align=\"right\">".$line[4]."</td>

            <td>".$line[5]."</td>

         </tr>";

  } 

  echo"</table>";

?>
6.
对数组每一个元素执行任意函数——array_walk()
7.
统计数组元素个数: count(),sizeof(),array_count_values()

3. 4-8章笔记
本章的主要内容是使用正则表达式。关于操作字符串的函数,这里列出清单,知道其用途即可,在具体使用时再查找相关手册。
1.
字符串的格式化
A.
去除开始位置和结束位置的空格 trim(),参数是字符串变量
B. nl2br()
XHTML中的</br>来代替字符串中的换行符
C.
改变字符串中字符的大小写Strtoupper()将字符串改为大写
    Strtoplower()----->
小写
    Ucfirst()------------>
首字符大写
D.
专用于转义字符串的函数,在将字符串写入到数据库之前,使用addslashes()
   
在用户要显示数据库中的内容之前,使用stripslashes()函数
2.
字符串连接和分割
A. explode()
使用举例:
    $email = “peng@198.com”;
    $email_array=explode('@',$email);
   
得到的数组{'peng','198.com'}
   
   
使用implode()函数实现上述中相反的效果:
  $email_array=array('peng','198.com');
   $email = implode('@',email_array);
B. strtok()
从字符串主哦功能取出一些片段来进行处理
3.
查找和替换
A.
在字符串中查找字符串:strstr(),strchr().stristr()
B.
查找字符串的位置:strop()
C.
替换子字符串: str_replace(),substr_replace()

4.
正则表达式
A.
重复:
        + ------->1
次或更多
        *  -------> 0
次或更多
B.
子表达式
        ()*  ------->
至少这些字符串中的一个需要精确匹配,例如:
        (very)* large =====> vreylarge,very very large,very very very large
       
        (very ){1,3} ======> very ,veryvery ,very very very
C.
其余基础查找手册

5.
使用正则来匹配
  
ereg(string pattern,string search,array[match])
eregi(...),后者不区分大小写

6.
使用正则来替换字符串

ereg_replace(string pattern,string replacement,string search);

7.
使用正则分割字符串

split(string pattern,string search[])

第五章 代码重用与函数编写

1.include
require等的使用
类似与C/C++...

2.
怎么写函数
...


3.
函数参数
形参和实参...
作用域...

第六章 面向对象的PHP

参考C++的实现,概念一样

注意以下几点:
1.
继承类 使用extends关键字
2.
多重继承 目前没用过。。。
3.
关键字 new clone
4.
迭代器和迭代
使用forech()方法通过循环方式来取出一个对象的所有属性,就像数组方式一样(私有成员变量能访问么?)

如果要实现更加复杂的迭代,需要实现一个迭代器,也就是在类里面实现一个IteratorAggreate接口,并且定义一个能够返回迭代类实例的getIterator()方法。
如下为一个实现迭代器的例子:

class objectIterator implements Iterator()
{
    private $obj;
    private $count;
    private $currentIndex;

    function __construct($obj)
    {
        $this->obj = $obj;
        $this->count =count($this->obj->data);
    }
    //rewind
将内部数据指针复位到开始的地方
    //valid
判断当前位置是否还存在更多的数据
    //key
返回数据指针的值
    //value
返回当前值
    //next
移动数据指针
    function rewind()
    {
        $this->currentIndex = 0;
    }
    function valid()
    {
        return $this->currentIndex <$this->count;
    }
    function key()
    {
        return$this->currentIndex;
    }
    function current()
    {
        return$this->obj->data[$this->currentIndex];
    }
    function next()
    {
        $this->currentIndex++;
    }
}
 

class Object implements IteratorAggregate

{

  public $data =array();

 

  function__construct($in)

  {

   $this->data = $in;

  }

 

  functiongetIterator()

  {

    return newObjectIterator($this);

  }

}

 

$myObject = new Object(array(2, 4, 6, 8, 10));

 

$myIterator = $myObject->getIterator();

   //获取迭代函数
for($myIterator->rewind(); $myIterator->valid(); $myIterator->next())

{

  $key =$myIterator->key();

  $value =$myIterator->current();

  echo$key." => ".$value."<br />";

}

 

5. 注意PHP中几个双下划线的魔术函数
6.
使用反射Reflection (反射)API
通过访问已有的类和对象来找到类和对象的结构和内容。这里,要结合一个魔术函数__toString()来将一个完整的类实现内容打印出来。(__toString()函数可以打印一个类)

第七章 异常处理
1.
try
{

//
要执行的函数
//
执行的函数中,需要手动抛出异常,用如下方法来抛出:
// throw new Exception('message',code)
}
catch()
{
//
处理异常,
}

2.Exception

这个类需要两个参数,一个错误消息和一个错误代码,除此之外,该类还需要实现如下内置函数:
getCode() 
返回传递给构造函数的代码
getMessage()
返回传递给构造函数的消息
getFile()
返回产生异常的代码文件的完整路径
getLine()
返回代码中产生异常的代码的行号
getTrace()
返回一个包含了产生异常的代码回退路径的数组
getTraceAsString() 
返回与getTrace一样的消息,被格式化为字符串
_toString()
允许简单的显示一个Exception对象
可以继承的Exception,但是上述的基本方法的实现是不能被重载的,_toString()函数可以被重载,因此我们可以自定义异常的显示方式:
class myException extends Exception
{
    function _toString()
    {
        return“.....fuuucccckkkk....”
    }
}

try
{
    throw new myException('A terribleerror has occurred',42);
}
catch(myException $m)
{
    echo $m;
}

第二篇 MySQL基础

这一篇主要是介绍MySQL的基础知识,有了这些基础知识,后面阅读源代码时,看着才不会那么陌生。由于之前在Qt中经常要用到Sqlite,对SQL的基本语句不算完全陌生,但是深入的东西不多,这方面的知识在后面的项目实践中回过头来补充。总的来说,这一篇的内容让我熟悉了使用php来操作数据库。

1. 设计Web数据库

1.
关系数据库的专业术语和概念
表格




主键和外键的区别

2.
模式与关系(确定主键与外键)
3.
设计web数据库的几个要素
考虑建模的实际对象
避免保存冗余数据
使用原子列值,也就是对每一行的每个属性只存储一个数据
选择有意义的键,确保键值的唯一性

2. 创建Web数据库

1.
使用Mysql
A.
这里记录下遇到的问题,新手。。。
Mysql
的的每个命令之间都需要用;来进行分离,如果漏掉了分号,那么将会出现一个持续箭头:

mysql> grant select
     ->
这个符号表示期待更多输入,直到有一个分号被检测到为止。
B.
登录mysql
mysql -h
主机地址 -u 数据库用户名 -p密码
注意,-p和密码之间不许要空格

C.
创建数据库
mysql> create database book;

D.
设置用户权限
为用户设置密码不是必须的,但是要建立一个Web数据库,最好为每一个网络应用程序建立一个用户。
最少权限原则
E.
创建用户 GRANT 命令
GRANT
REVOKE命令分别用来授予和取消Mysql用户的权限,这些权限分为如下四个等级:
全局
数据库


Mysql
中存在3个基本类型的权限:使用与一般用户的权限,适用于管理员的权限和几个特定的权限。对于用户而言,应该只赋予他们访问数据库和表的权限。
具体语法如下:[]内的字句为可选的
GRANT privileges [columns]
ON item
TO user_name[IDENTIFIED BY 'password']
[REQUEST ssl_options]
[WITH [GRANT | limit_options]]

要创建一个管理员,需要执行如下的命令
mysql>grant all
     -> on *
     -> to peng identified by '123'
     -> with grant option;
以上命令授予了用户名为peng,密码为123的用户使用数据库所有权限,并允许他向其他人授予权限。
如果不希望用户在系统中存在,可以执行下列方式进行撤销:
mysql> revoke all privileges,grant
     -> from peng;

如果要进一步创建一个没有任何权限的常规用户:
mysql> grant usage
     -> on books .*
     -> to sally identified by “1234”;

通过如下语句,可对sally进行进一步的权限分配:
mysql> grant select ,insert,update,delete,index,alter,creat,drop
     -> on books.*
     -> to sally;

下面是对sally的权限进行缩减:
mysql> revoke alter,creat,drop
     -> on books.*
     -> to sally;

mysql> use dbname;
mysql> show dbname;
mysql> describe dbname;


其他创建表格相关的指令都需要在端口上自己实现,此处不做记录,只是实践一遍,加深理解。 


2.
为数据库创建索引
CREATE  INDEX index_name
ON table_name

3.
选择列数据类型
A.
数字类型
B.
日期和时间类型
C.
字符串类型

小结:这一章主要是学习数据可如何创建用户,数据库以及表。下面是学习如何与数据库进行交互
 

3.使用MySql数据库

1.
插入
INSERT [INTO] table [(column1,column2,...)] VALUS (value1,value2,...)

使用举例:
在上一章中建立的books table中的customers表中添加一条记录,可以输入如下命令:
mysql> insert into customers values(NULL,'Julice Smith','25 Oakstreet','Airport Weet');

如果只是针对一些指定的列添加内容,可以使用如下语句:
mysql> insert into customers (name,city) values('Melissa Jones','Nar NarGoon North');

2.
获取数据
A.SELECT
语句
举例:
select name,city
from customers;

在多表关联时使用别名:
select c.name
from customers as c,orders as o,order_item as oi,books as b
where c.coustomerid = o.customerid
and o.orderid = oi.orderid
and oi.isbn = b.isbn
and b.title like '%Java';

以特定的顺序来获得数据
select name,city
from customers
order by name (name
后面可以加asc表示升序,desc表示降序);

选组要返回的行
select name
from customers
limit 2,3;
B.
使用子查询

select customerid,amount
from orders
where amount = (select max(amount) from orders);

子查询操作副:
ANY         select c1 from t1 where c1> any(select c1 from t2);
IN          select c1 from t1 where in(select c1 from t2);
SOME        select c1 from t1 where c1> some(select c1 from t2);
ALL         select c1 from t1 where c1> all(select c1 from t2);

4.
更新数据库
update books
set price = price*1.1

update books
set address ='250 Olsens Road'
where customerid = 4;

5.
创建后修改数据表
A.
更改列的数据类型
alter table customers
modify name char(70) not null;

B.
添加一列
alter table orders
add tax float(6,2) after amount;

C.
删除一列
alter table orders
drop tax;

6.
删除数据库中的记录
delete from customers
where customerid = 5;

7.
表的删除
drop table tablename;

8.
删除整个数据库
drop database databasename;
 


第十章 使用MySql数据库

 

这章主要是填删查改操作。

 

1. 插入

INSERT [INTO] table[(column1,column2,...)] VALUS (value1,value2,...)

 

使用举例:

在上一章中建立的bookstable中的customers表中添加一条记录,可以输入如下命令:

mysql> insert into customersvalues(NULL,'Julice Smith','25 Oak street','Airport Weet');

 

如果只是针对一些指定的列添加内容,可以使用如下语句:

mysql> insert into customers(name,city) values('Melissa Jones','Nar Nar Goon North');

 

2.获取数据

A.SELECT 语句

举例:

select name,city

from customers;

在多表关联时使用别名:

select c.name

from customers as c,orders aso,order_item as oi,books as b

where c.coustomerid = o.customerid

and o.orderid = oi.orderid

and oi.isbn = b.isbn

and b.title like '%Java';

 

以特定的顺序来获得数据

select name,city

from customers

order by name (name后面可以加asc表示升序,desc表示降序);

 

选组要返回的行

select name

from customers

limit 2,3;

B. 使用子查询

 

select customerid,amount

from orders

where amount = (select max(amount)from orders);

 

子查询操作副:

·        ANY          select c1 from t1 where c1 > any(select c1 from t2);

·        IN           select c1 from t1 where in (select c1 from t2);

·        SOME     select c1 from t1 where c1 > some(select c1 from t2);

·        ALL          select c1 from t1 where c1 > all(select c1 from t2);

 

4. 更新数据库

update books

set price = price*1.1

 

update books

set address ='250 Olsens Road'

where customerid = 4;

 

5.创建后修改数据表

A.更改列的数据类型

alter table customers

modify name char(70) not null;

 

B.添加一列

alter table orders

add tax float(6,2) after amount;

 

C.删除一列

alter table orders

drop tax;

 

6. 删除数据库中的记录

delete from customers

where customerid = 5;

 

7. 表的删除

drop table tablename;

 

8. 删除整个数据库

drop database databasename;


 


0 0
原创粉丝点击