跟着PHP100第一季学写一个CMS(1-10)
笔记:
这次用的方法是先跟着视频做一遍,隔一天或半天后独立再做一遍,能发现真正不会的地方记录下来。
CMS0.1界面布局
1、问题:分两个css来实现时basic.css+index.php出现定位不正确问题。
解决:@CHARSET "UTF-8"; 第一行说明漏了一个封号“;”导致奇怪问题,花了半个多小时和原文件对比。
ps.经常会犯这种错误少个结尾符号,浪费大量时间。
2、小知识:body{margin:0 auto;}让页面居中 。
3、小知识:border宽度会计算到页面宽度里。
4、小知识:body width如果已经设定,占一整行的div可以width:auto;
5、小知识:ul li 取消列表前面符号list-style-type: none;
列表右对齐ul{text-align:right;}
横向排序li{display:inline;}(其实用float:right也能实现横向对齐)
CMS0.2分离调用
1、小知识:index加载header、footer
require 'includes/header.inc.php';
require 'includes/footer.inc.php';
2、小知识:防止恶意调用,被调用文件内添加一个常量来判断。在调用文件中增加该常量IN_TG
if(!defined('IN_TG')){
exit('access defined');
}
3、小知识:转换为硬路径,速度更快
//substr函数是用来截取需要的目录长度,-8是从后截取8位
//dirname是获得目录路径
//__FILE__是获得文件路径
//在common.inc.php定义硬路径常量
define('ROOT_PATH', substr(dirname(__FILE__),0,-8)); //使用硬路径来调取文件
//index.php使用硬路径调用其他页面
require dirname(__FILE__).'/includes/common.inc.php';
require ROOT_PATH.'includes/header.inc.php';
require ROOT_PATH.'includes/footer.inc.php';
4、小知识:PHP_VERSION php版本的全局常量
CMS0.3执行耗时
1、小知识:通过microtime()可以获取时间戳和微秒数
$_mtime = explode(' ', microtime());//将时间戳和微秒数分开放到数组中
$_mtime[1] + $_mtime[0]; //时间戳+微秒数 用来将后面的时间-开始时间,得到执行消耗的时间
2、第一个函数,需要养成良好的写备注文档的习惯
/**
*_runtime()是用来获取执行耗时
*@access public 表示函数对外公开
*@return float 表示返回出来的是一个浮点型数字
*/
function _runtime(){
$_mtime=explode(' ',microtime());
return $_mtime[1]+$_mtime[0];
}
3、小知识:round()函数,对浮点数进行四舍五入
同时可以指定精度round($value,3)//保留小数点后3位
4、小知识:
//判断PHP版本是否过低
if(PHP_VERSION<'4.1.0'){
exit("THE PHP VERSION IS TOO LOW!");
}
出现的问题:'4.1.0'漏了加单引号,经常不知道什么时候加引号
cms0.4注册界面
1、小知识:<dl>列表的用法以及dl、ul、ol的区别
<dl></dl>
<dt>
<dd></dd>
</dt>
2、小知识:样式class="text yzm",引用时使用.yzm
3、小知识:让dl列表居中,必须先设定它的宽度
#register dl{
width: 400px;
margin: 0 auto;
}
4、小知识:鼠标移动上去指针变成手型。
cursor:pointer;
5、小知识:JavaScript实现点击打开新窗口
//第一个参数打开url,第二个标题,第三个打开网页的大小和位置
onclick="javascript:window.open('index.php','face','width=400,height=400,top=0,left=0')"
cms0.5选择头像
1、小知识:range()函数。range(1,9)取1-9数字放入数组中
2、小知识:两种循环:for()和foreach()
//用for循环9次读取m01-m09,9张图片
<?php for($i=1;$i<10;$i++) {?>
<dd><img src="data:images/face/m0<?php echo $i?>.gif" alt="头像<?php echo $i?>"></dd>
<?php }?>
//用foreach循环读取m10-m64的图片
<?php foreach(range(10,64) as $i) {?>
<dd><img src="data:images/face/m<?php echo $i?>.gif" alt="头像<?php echo $i?>"></dd>
<?php }?>
3、不理解:1、div块face包含了h3和dl,为什么#face加一条外边框,dl却不显示在里面?
2、dl加外边框后,同样dd显示的内容也不在外边框内。不知道为什么?
回答:等我明白了再来写
<div id="face">
<h3>更换头像</h3>
<dl>
<dt></dt>
<?php for($i=1;$i<10;$i++) {?>
<dd><img src="data:images/face/m0<?php echo $i?>.gif" alt="头像<?php echo $i?>"></dd>
<?php }?>
<?php foreach(range(10,64) as $i) {?>
<dd><img src="data:images/face/m<?php echo $i?>.gif" alt="头像<?php echo $i?>"></dd>
<?php }?> </dl>
</div>
4、js一点不会,先做点记录。陆续学起来。
作用:等待网页加载完毕,获得id=faceimg对象,对它的onclike增加动作打开一个网页。
//等在网页加载完毕再执行
window.onload = function () {
var faceimg = document.getElementById('faceimg');
faceimg.onclick = function () {
window.open('face.php','face','width=400,height=400,top=0,left=0,scrollbars=1');
}
};
cms0.6头像取值
//通过getElementsByTagName获得每张图片的src
//增加图片的onclick事件触发_opener()函数
//由于img.src为长地址,所以face.php的img增加了alt,将alt调用函数,为之后表单调取value使用
window.onload = function(){
var img = document.getElementsByTagName('img');
for (i=0;i<img.length;i++){
img[i].onclick = function(){
_opener(this.alt);
}
} }
//通过前端页面直接插入onclick事件调用_opener();
function _opener(src){
//opener是父窗口的意思
var img = opener.document.getElementById('faceimg');
img.src = src;
opener.document.register.face.value = src;
}
另一种方法是在<img>添加onclick="_opener(this.src)"来调用函数。不过并不推荐
cms0.7验证码上
1、小知识:画图函数
//创建图片
$_img = imagecreatetruecolor($_width,$_height);
//填充背景
imagefill($_img,0,0,$_white);
//创建一个黑色的边框
$_black = imagecolorallocate($_img,100,100,100);
imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);
//随机划线条
for ($i=0;$i<6;$i++) {
$_rnd_color= imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
imageline($_img,mt_rand(0,75),mt_rand(0,75),mt_rand(0,75),mt_rand(0,75),$_rnd_color);
}
//随机打雪花(其实打印一个字符*)
for ($i=1;$i<100;$i++) {
imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),"*",imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
}
//输出验证码(也是输出字符)
for ($i=0;$i<strlen($_SESSION['code']);$i++){
imagestring($_img,mt_rand(3,5),$i*$_width/4+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],imagecolorallocate($_img,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
}
//输出销毁
ob_clean();
header("Content-Type: image/png");
imagepng($_img);
imagedestroy($_img);
2、问题:跟着教程做,但始终显示不了图片
解决:百度:
使用PHP中的GD库绘制图像,之后浏览器无法显示,GD库安装,配置也没什么错误,提示图像因本身有错无法显示,于是就在header() 前面使用ob_clean();然后使用浏览器就能正常的浏览了
<?php
$height = 300;
$width = 300;
$im = imagecreatetruecolor($width, $height);
$white = imagecolorallocate ($im, 255, 255, 255);
$blue = imagecolorallocate ($im, 0, 0, 64);
imagefill($im, 0, 0, $blue);
imagestring($im, 10, 100, 120, 'Hello,PHP', $white);
ob_clean();
header ('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
ob_get_contents() - 返回输出缓冲区的内容
ob_flush() - 冲刷出(送出)输出缓冲区中的内容
ob_clean() - 清空(擦掉)输出缓冲区
ob_end_flush() - 冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_end_clean() - 清空(擦除)缓冲区并关闭输出缓冲
flush() - 刷新输出缓冲
cms0.8验证码下
1、小知识:验证码点击刷新
放入图片区域,可以自动刷新局部
onclick="javascript:this.src='code.php?tm='+Math.random()"
然后采用分离JS的原则分离出去
cms0.9提交数据
1、小知识:
1)将数据提交到本页,必须做一个名值对,用来判断是否提交了数据。
action=register.php?action=register
2)也可以设计一个隐藏字段来做名值对
<input type="hidden" name="action" value="register" />
cms1.0过滤用户名
1、小知识:
$_string = trim($_string); //去掉两边空格
mb_strlen($_string,'utf-8') //以utf-8格式判断字符串长度
preg_match($_char_pattern,$_string) //正则比对
in_array($_string,$_mg) //判断$_mg数组中是否含有$_string
mysql_real_escape_string($_string) //mysql自带转义输入函数,防止SQL注入
跟着PHP100第一季学写一个CMS(1-10)的更多相关文章
- 跟着PHP100第一季学写一个CMS(11-20)
PS.刚发现IE并不兼容,有点悲剧 cms1.1密码处理 1.小知识:sha1($_answer) //加密为40位,不知道能不能破解 2.小知识:mysql_real_escape_string( ...
- android注解入门 并来自己写一个框架
介绍 这里我带大家来学习一下注解 并且用来写下一个模仿xUtils3 中View框架 此框架 可以省略activity或者fragment的 findViewById 或者设置点击事件的烦恼 我正参加 ...
- 冰血暴第一季/全集Fargo迅雷下载
冰血暴 第一季 Fargo 1 (2014)本季看点: 该剧改编自科恩兄弟获得1996年奥斯卡提名的同名经典影片,计划总共拍摄10集,第一季将讲述一个完整的故事.由<识骨寻踪第一季>编剧诺 ...
- JS入门学习,写一个时钟~
<!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <t ...
- 通过游戏学python 3.6 第一季 第二章 实例项目 猜数字游戏--核心代码--猜测次数 可复制直接使用 娱乐 可封装 函数
猜数字游戏--核心代码--猜测次数 #猜数字--核心代码--猜测次数 number=33 amount=3 count=0 while count<=amount: conversion ...
- 通过用jQuery写一个页面,我学到了什么
概述 前几天面试,hr发来一个测试文件,让我做做看.我一看,其实就是根据PSD需求写一个页面,再加上一些互动效果即可. 刚好我之前学了切图,jquery等知识还没练手过,于是高兴的答应了. 最后花了3 ...
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- 学了C语言,如何利用cURL写一个程序验证某个网址的有效性?
在<C程序设计伴侣>以及这几篇关于cURL的文章中,我们介绍了如何利用cURL写一个下载程序,从网络下载文件.可是当我们在用这个程序下载文件时,又遇到了新问题:如果这个网址是无效的,那么我 ...
- 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装
在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...
随机推荐
- HBase Error: connection object not serializable
HBase Error: connection object not serializable 想在spark driver程序中连接HBase数据库,并将数据插入到HBase,但是在spark集群提 ...
- CollatingOfData 之 JsonHelper
1 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System. ...
- 几个常用myeclipse快捷键
Ctrl + D:直接删除光标所在行 Alt + ↑:向上移动光标所在行 Alt + ↓:向下移动光标所在行 Ctrl + Alt + ↑:直接向上复制光标所在行内容 Ctrl + Alt + ↓:直 ...
- AJAX XMLHttpRequest
<html> <head> <title>XMLHTTPRequest对象的说明DEMO</title> <script language=&qu ...
- JS 控制文本框只能输入中文、英文、数字与指定特殊符号
想做姓名输入的js判断是否是中文,但是网上找的很多是源于一篇文章的,判断中文的正则式不对,后来找到一个可以准确判断了,但是是监测里面有中文的就行,跟我想要的只能输入中文的意思相左,所以又找了下面的 J ...
- mongoDB操作命令及mongoDB的helper
此项目已开源,开源地址是: http://mongodbhelper-csharp.googlecode.com/svn/trunk/ mongodb的helper using System; usi ...
- [设计模式]<<设计模式之禅>>抽象工厂模式
1 女娲的失误 上一篇讲了女娲造人的故事.人是造出来了,世界也热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍 脑袋,忘记给人类定义性别了 ...
- wince 位图的使用
操作位图的基本步骤: *创建位图句柄 *加载位图对象 *创建内存设备描述对象,将位图选入内存设备描述对象 *使用绘图函数进行图形绘制 *删除位图句柄 创建位图句柄并且加载位图对象: *位图句柄 HBI ...
- #if...#endif的用法总结
在写到 pwm音阶程序的时候,在代码中有#if...#endif的用法问题,相关音阶的代码如下: /************************************************* ...
- MSP430常见问题之指令系统类
Q1. IAR中怎样描述P2OUT.3脚,#define LCD_cs1 P2OUT.3; 对吗?A1:430 不能位寻址,所以一般的位操作,都通过“与”来作用.#define LCD_cs1 (P2 ...