从开始接触php至现在大概有一年时间了,但真正有进步,或者说稍微了解php一点,也只不过是这两个月而已(真不知道以前自己在做些什么)。最近又在学习java web,但总觉得没有跟php来一个彻底的了断,原来是少了一个系统的总结过程。
以下总结均为个人学习感受。知识点的总结也以开发项目TODOlist为例。
- php是什么。Php是一种脚本语言(那什么是脚本语言呢?),一种用来开发动态网站的语言。何为动态网站,即用户与页面(或者说后台数据库)进行交互,在交互过程中,页面中有些内容可以发生改变。Php与其他技术相结合,可以开发出更加完美的动态网站,如数据库mysql等。就像java web,也是一种与其他技术相结合开发动态网站的语言。
- 标志与位置
1) 标志<?php ?>
2) 位置
(1)嵌入到html语言中,且可以在任何位置
(2)独立以一个文件形式出现
3.数据类型
1)常量:用define()函数
Define(’name’,value)
如在链接数据库的时候,我是这样写的
<?php
DEFINE('DB_USER','root');
DEFINE('DB_PASSWORD','123456');
DEFINE('DB_HOST','127.0.0.1');
DEFINE('DB_NAME','cars');
$dbc = @mysqli_connect(DB_HOST,DB_USER, DB_PASSWORD,DB_NAME) ;//返回对应于打开的资源链接
if(!$dbc){
trigger_error('could not connect to MYSQL: ' . mysqli_connect_error());
}else{
mysqli_set_charset($dbc,'utf8');
}
打印常量不能用引号包含,包括单引号和双引号。
2)变量
命名规则
(1)整型
(2)浮点型
(3)字符串
(4)数组
3)超全局变量:这些变量总是存在的,并且它们的值对所有脚本也都是可用的。每一个超全局变量其实都是其他变量的一个数组。
$_GET包含了通过get方法提供给一个脚本的任何变量
$_POST包含了通过post方法提供给一个脚本的任何变量
$_POST['username']
$_SESSION包含了在一个会话中当前注册的任何变量
$_SESSION['user_id']
$_REQUSET 包含了通过get,post或session输入机制提供给一个脚本的任何变量
$_SERVER['REQUEST_METHOD']
字符串和数组包含内容非常多,我会在以后分开介绍。
4.包含外部文件函数:inclue(),include_once(),require(),require_once()
括号内是包含的文件的路径,可以使绝对路径,也可以是相对路径
我目前使用过include(),require()
require('D:\Dev Apps\xampp\htdocs\sunyan2015\mysqli_connecttodolist.php');
目前我还未感受到这四个函数之间的差异。以下内容摘自参考书籍,留待以后感受
Include()和require()在正确工作时完全一样,只是在失败时表现的完全不同。前者失败时,就像浏览器打印一个警告,但余下脚本会继续进行。后者在失败时,会打印一个错误,且脚本会终止进行
二两者的_once 版本,他们保证吃力的文件只会被包含一次,而不管脚本试图包含几次。
5验证表单数据函数
1)isset(),测试一个变量是否具有值,包括0,false,或者一个空字符串,但不能是null。
由此可见,isset不适合验证表单中的文本输入和文本框。
2)empty(),用于检验表单中的文本输入和文本框的内容,即变量是否具有空值,包括0,false,null和空字符串。
6.cookie和会话
原本觉得这两个概念特别难。后来总算懂了一点,但其实也只限在最基础的用法上,难度大的还没有深入了解。
Cookie和会话(session),是一种追踪和记录用户行为的方法,他可以把若干个页面在用户信息方面统一联系起来。举个例子,当你在逛天猫的时候,如果已经登录,你就可以查看你的收藏夹和购买记录,而且每次你新打开一个页面,这个页面上呈现的某些用户信息仍然是关于你的。
Cookie和会话之间的区别主要在信息存储位置上,cookie将信息数据存储在浏览器上,而会话将信息数据存储在服务器上(突然不明白服务器到底是什么),会话一般比cookie安全
我用的是会话:
1)调用session_start()函数,设置会话变量,
如在Login.php中,我是这样设置的
<?php
session_start();
$dbc=@mysqli_connect('127.0.0.1', 'root','123456','todolist')
or die('could not connect to mysql');
mysqli_set_charset($dbc,'utf8');
$error=array();
if($_SERVER['REQUEST_METHOD']=='POST'){
if(!empty($_POST['username'])){
$username=$_POST['username'];
}else{
$error[]="请输入用户名";
}
if(!empty($_POST['password'])){
$password=$_POST['password'];
}else{
$error[]="请输入密码";
}
if(empty($error)){
$q="select user_id from usermessage where name='$username' ";
$r=mysqli_query($dbc,$q);
$q1="select user_id from usermessage where password='$password' ";
$r1=mysqli_query($dbc,$q1);
if(mysqli_num_rows($r)==0){
echo'对不起,此用户名并未注册。请先<a href="register.php">注册</a>';
}else{
while($row=mysqli_fetch_array($r,MYSQLI_ASSOC)){
$user_id=$row['user_id'];
}
if(mysqli_num_rows($r1)==0){
echo"密码错误,请重新输入";
}else{
$_SESSION['username']=$username;
$_SESSION['user_id']=$user_id;
}
2访问会话变量
<?php
session_start();
$dbc=@mysqli_connect('127.0.0.1', 'root','123456','todolist')
or die('could not connect to mysql');
mysqli_set_charset($dbc,'utf8');
if(!isset($_SESSION['username'])){
echo"请登录后在更改密码";
}
if($_SERVER['REQUEST_METHOD']=='POST'){
$newpassword=$_POST['newpassword'];//{$_POST['newpassword']}
$q="update usermessage set password='$newpassword' where user_id={$_SESSION['user_id']}";
$r=mysqli_query($dbc,$q);
if($r){
echo"您的密码已更改成功";
}else{
echo"请重新更改密码";
echo mysqli_error($dbc);
}
}
?>
3删除会话变量
<?php
session_start();
if(empty($_SESSION['username'])){
header("http://127.0.0.1/sunyan2015/013/login.php");
}else{
$_SESSION=array();把$_SESSION变量重置为一个新数组,从而清除现有值
session_destroy();从服务器中删除数据
setcookie('phpsessid','',time()-3600);
}
echo'你已经注销成功';
?>
7.使用mysql 数据库
1)链接数据库
$dbc=@mysqli_connect('127.0.0.1', 'root','123456','todolist')
or die('could not connect to mysql');
四个参数分别为主机名,用户名,密码,数据库名称。@是错误控制符,可以防止在浏览器中显示php错误,代替显示的是 or die()中的内容。如果成功连接到数据库,mysqli_connect()函数将返回对应于打开链接的资源链接。
- mysqli_query():执行select ,insert,update,delete四种查询语句的函数,通常把查询结果赋给另外一个变量
result=mysqli_query($dbc,查询语句)如
$q="select user_id from usermessage where name='$username' ";
$r=mysqli_query($dbc,$q);
$q="insert into usermessage(name,password)values(\"$username\",\"$password\")";
$r=mysqli_query($dbc,$q);
$q="update usermessage set password='$newpassword' where user_id={$_SESSION['user_id']}";
$r=mysqli_query($dbc,$q);
- 查询结果
(1) 对于insert,update,delete,这样的操作相对简单,返回结果不是具体的数据库内容。若操作成功,则返回true,否则返回false
Mysqli_affected_rows(),可以返回受insert,update,delete操作影响的行数,
$num= Mysqli_affected_rows($dbc)
(2)对于select,若操作成功,则返回一个指向查询结果的资源链接,若操作失败,则返回false。
Mysqli_num_rows,(),返回受select操作影响的行数。
$num= Mysqli_num_rows($r)
Mysqli_fetch_array(),将结果以数组形式呈现,一次返回一行结果。
$r=mysqli_fetch_array($r,数组类型)
数组类型及返回结果的数组类型,有MYSQLI_ASSOC,MYSQLI_NUM,MYSQLI_BOTH,
我用到了第一种,如
while($row=mysqli_fetch_array($r,MYSQLI_ASSOC)){
$user_id=$row['user_id'];
8.正则表达式
通过我的初步学习,正则表达式内容是比较枯燥的,而且知识点也都比较小。
正则表达式是一种规则,用来验证一些信息是否符合设计者想要的形式。以下内容摘自以往总结。
http://www.jianshu.com/p/48822af43b35
9.预防sql注入攻击。
所谓sql注入攻击,是指将一些不怀好意的代码插入到站点的SQL查询中,旨在报错的信息当中获取关于脚本或者数据库的某些信息。使用预处理语句即可预防。
以下内容摘自以往总结。
http://www.jianshu.com/p/621a35615d22
10.pdo数据库抽象层
http://www.jianshu.com/p/d4c511ad7c86
11.smarty模板引擎
http://www.jianshu.com/p/49ca58a27dcc
http://www.jianshu.com/p/664cb2957f51
http://www.jianshu.com/p/454435a608e8
http://www.jianshu.com/p/57542a8729fb
12.Thinkphp框架
http://www.jianshu.com/p/bd46ff75f709