Android&PHP

This commit is contained in:
yinkanglong_lab
2021-03-09 19:48:29 +08:00
parent 2e52618a61
commit 07485a7f54
26 changed files with 4680 additions and 0 deletions

28
Android/Activity.md Normal file
View File

@@ -0,0 +1,28 @@
**Activity** 是用户可以执行的单一任务。Activity
负责创建新的窗口供应用绘制和从系统中接收事件。Activity 是用 Java 编写的,扩展自
[Activity](https://classroom.udacity.com/courses/ud851/lessons/93affc67-3f0b-4f9b-b3a4-a7a26f241a86/concepts/developer.android.com/reference/android/app/Activity.html)
Activity 会创建**视图**来向用户显示信息,并使用户与 Activity 互动。视图是
Android UI 框架中的类。它们占据了屏幕上的方形区域负责绘制并处理事件。Activity
通过读取 XML 布局文件确定要创建哪些视图(并放在何处)。正如 Dan 提到的,这些 XML
文件存储在标记为 **layouts** 的 **res 文件夹**内。
Activity
提供视图上的操作UI类提供视图的展示格式包括什么样的按钮什么样的容器什么样的文本框。
视图类型UI组件具有互动性、容器视图容纳其他的UI组件或者视图。
视图的XML属性
id,layout\_width,layout_height,layout_gravity,layout_margin,padding,
R 类
当你的应用被编译时,系统会生成
[R](http://developer.android.youdaxue.com/reference/android/R.html)
类。它会创建常量,使你能够动态地确定 res
文件夹的各种内容,包括布局。要了解详情,请参阅关于[资源](http://developer.android.youdaxue.com/guide/topics/resources/accessing-resources.html)的文档。
本质上是 Android 会读取你的 XML 文件并为你的布局文件中的每个标记生成 Java
对象。然后,你可以在 Java 代码中通过对 Java 对象调用方法修改这些对象。

View File

@@ -0,0 +1,497 @@
第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing
如果对应的兄弟元素找不到的话就以父元素做参照物
第二类属性值必须为id的引用名”
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
第三类属性值为具体的像素值如30dip40px
android:layout_marginBottom 离某元素底边缘的距离
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离
EditText的android:hint 设置EditText为空时输入框内的提示信息。
android:gravity
android:gravity属性是对该view 内容的限定比如一个button 上面的text.
你可以设置该text
在view的靠左靠右等位置以button为例android:gravity="right"则button上面的文字靠右
android:layout\_gravity
android:layout_gravity是用来设置该view相对与起父view 的位置比如一个button
在linearlayout里你想把该button放在靠左、靠右等位置就可以通过该属性设置以button为例android:layout_gravity="right"则button靠右
android:scaleType
android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType
/ android:scaleType值的意义区别
CENTER /center
按图片的原来size居中显示当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop
按比例扩大图片的size居中显示使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside
将图片的内容完整居中显示通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度居中显示
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度显示在View的下部分位置
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度显示在View的上部分位置
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
\*\* 要注意一点Drawable文件夹里面的图片命名是不能大写的。
\-------------------------------------------------------------------------------------------------------------------------------------------------------------
android:id
为控件指定相应的ID
android:text
指定控件当中显示的文字需要注意的是这里尽量使用strings.xml文件当中的字符串
android:gravity
指定View组件的对齐方式比如说居中居右等位置
这里指的是控件中的文本位置并不是控件本身
android:layout\_gravity
指定Container组件的对齐方式比如一个button
在linearlayout里你想把该button放在靠左、靠右等位置就可以通过该属性设置以button为例android:layout_gravity="right"则button靠右
android:textSize
指定控件当中字体的大小
android:background
指定该控件所使用的背景色RGB命名法
android:width
指定控件的宽度
android:height
指定控件的高度
android:layout\_width
指定Container组件的宽度
android:layout\_height
指定Container组件的高度
android:layout\_weight
View中很重要的属性按比例划分空间
android:padding\*
指定控件的内边距,也就是说控件当中的内容
android:sigleLine
如果设置为真的话,则控件的内容在同一行中进行显示
android:scaleType
是控制图片如何resized/moved来匹对ImageView的siz
android:layout\_centerHrizontal
水平居中
android:layout\_centerVertical
垂直居中
android:layout\_centerInparent
相对于父元素完全居中
android:layout\_alignParentBottom
贴紧父元素的下边缘
android:layout\_alignParentLeft
贴紧父元素的左边缘
android:layout\_alignParentRight
贴紧父元素的右边缘
android:layout\_alignParentTop
贴紧父元素的上边缘
android:layout\_alignWithParentIfMissing
如果对应的兄弟元素找不到的话就以父元素做参照物
android:layout\_below
在某元素的下方
android:layout\_above
在某元素的的上方
android:layout\_toLeftOf
在某元素的左边
android:layout\_toRightOf
在某元素的右边
android:layout\_alignTop
本元素的上边缘和某元素的的上边缘对齐
android:layout\_alignLeft
本元素的左边缘和某元素的的左边缘对齐
android:layout\_alignBottom
本元素的下边缘和某元素的的下边缘对齐
android:layout\_alignRight
本元素的右边缘和某元素的的右边缘对齐
android:layout\_marginBottom
离某元素底边缘的距离
android:layout\_marginLeft
离某元素左边缘的距离
android:layout\_marginRight
离某元素右边缘的距离
android:layout\_marginTop
离某元素上边缘的距离
android:paddingLeft
本元素内容离本元素右边缘的距离
android:paddingRight
本元素内容离本元素上边缘的距离
android:hint
设置EditText为空时输入框内的提示信息
android:LinearLayout
它确定了LinearLayout的方向其值可以为vertical
表示垂直布局horizontal表示水平布局
\-----------------------------------------------------------------------------------------------------------------------------------------------------
android:interpolator
可能有很多人不理解它的用法文档里说的也不太清楚其实很简单看下面interpolator定义一个动画的变化率the
rate of change。这使得基本的动画效果(alpha, scale, translate,
rotate得以加速减速重复等。用通俗的一点的话理解就是动画的进度使用
Interpolator 控制。interpolator
定义了动画的变化速度可以实现匀速、正加速、负加速、无规则变加速等。Interpolator
是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation
(float input),该方法 maps a point on the timeline to a multiplier to be applied
to the transformations of an animation。Android 提供了几个 Interpolator
子类,实现了不同的速度曲线,如下:
AccelerateDecelerateInterpolator
在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator 在动画的以均匀的速率改变
对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}
Interpolator其他的几个子类也都是按照特定的算法实现了对变化率。还可以定义自己的
Interpolator 子类,实现抛物线、自由落体等物理效果。
Xml代码
\<!--
FrameLayout ——
里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角
LinearLayout —— 里面可以放多个控件,但是一行只能放一个控件
TableLayout —— 这个要和TableRow配合使用很像html里面的table
AbsoluteLayout —— 里面可以放多个控件并且可以自己定义控件的x,y的位置
RelativeLayout —— 里面可以放多个控件,不过控件的位置都是相对位置
(界面的布局好像还可以直接引用一些view如ScrollView等)
Xml代码
android:orientation ——
它确定了LinearLayout的方向其值可以为\*vertical表示垂直布局 \*horizontal
表示水平布局
Xml代码
android:layout_width ——
指在父控件中当前控件的宽,可以设定其确定的值,但一般使用下面两个值\*fill_parent填满父控件的空白\*wrap_content表示大小刚好足够显示当前控件里的内容
Xml代码
android:layout_height ——
指明了在父控件中当前控件的高,可以设定其确定的值,但一般使用下面两个值\*fill_parent填满父控件的空白\*wrap_content表示大小刚好足够显示当前控件里的内容
Xml代码
android:id —— 为控件指定相应的ID
Xml代码
android:text ——
指定控件当中显示的文字需要注意的是这里尽量使用strings.xml文件当中的字符串
Xml代码
android:grivity ——
指定控件的基本位置比如说居中居右等位置。如果是没有子控件的view设置此属性表示内容的对齐方式如果是有子控件的view设置此属性则表示子控件的对齐方式重力倾向其值需要多个时用“\|”分开)
Xml代码
android:textSize —— 指定控件当中字体的大小
Xml代码
android:background ——
指定该控件所使用的背景色,RGB命名法。如果设置一个透明的背景图片按钮android:background="@android:color/transparent"
Xml代码
android:width —— 指定控件的宽度
Xml代码
android:height —— 指定控件的高度
Xml代码
android:padding\* —— 指定控件的内边距,也就是说控件当中的内容
Xml代码
android:sigleLine —— 如果设置为真的话,则将控件的内容在同一行当中进行显示
Xml代码
android:src ——
引用资源例如应用另一个XMLandroid:src="@drawable/imageselector"
Xml代码
android:layout_alignBottom ——
属性是用来与某控件的底部对齐。例如:android:layout\_alignBottom="@id/TVfilepath"
Xml代码
android:layout_marginRight ——
属性设置边缘空白,有上下左右之分。例如:android:layout\_marginRight="3dip"
Xml代码
android:layout_gravity属性设置该控件位于父控件的位置。例如:android:layout\_gravity="center_vertical"
Xml代码
第一类:属性值为true或false
android:layout_centerHorizontal ——
如果值为真,该控件将被至于水平方向的中央(水平居中)
android:layout_centerVertical ——
如果值为真,该控件将被至于垂直方向的中央(垂直居中)
android:layout_centerInParent ——
如果值为真,该控件将被至于父控件水平方向和垂直方向的中央(相对于父元素完全居中 )
android:layout_alignParentBottom ——
如果该值为true则将该控件的底部和父控件的底部对齐(贴紧父元素的下边缘)
android:layout_alignParentLeft ——
如果该值为true则将该控件的左边与父控件的左边对齐(贴紧父元素的左边缘)
android:layout_alignParentRight ——
如果该值为true则将该控件的右边与父控件的右边对齐(贴紧父元素的右边缘)
android:layout_alignParentTop ——
如果该值为true则将空间的顶部与父控件的顶部对齐(贴紧父元素的上边缘)
android:layout_alignWithParentIfMissing ——
如果对应的兄弟元素找不到的话就以父元素做参照物
Xml代码
第二类属性值必须为id的引用名“@id/id-name”
android:layout_above —— 将该控件的底部至于给定ID的控件之上(在某元素的的上方)
android:layout_below —— 将该控件的顶部至于给定ID的控件之下(在某元素的下方 )
android:layout_toLeftOf ——
将该控件的右边缘和给定ID的控件的左边缘对齐(在某元素的左边 )
android:layout_toRightOf ——
将该控件的左边缘和给定ID的控件的右边缘对齐(在某元素的左边 )
android:layout_alignTop ——
将给定控件的顶部边缘与给定ID控件的顶部对齐(本元素的上边缘和某元素的的上边缘对齐)
android:layout_alignBottom ——
将该控件的底部边缘与给定ID控件的底部边缘(本元素的下边缘和某元素的的下边缘对齐 )
android:layout_alignLeft ——
将该控件的左边缘与给定ID控件的左边缘对齐(本元素的左边缘和某元素的的左边缘对齐)
android:layout_alignRight ——
将该控件的右边缘与给定ID控件的右边缘对齐(本元素的右边缘和某元素的的右边缘对齐)
android:layout_alignBaseline —— 该控件的baseline和给定ID的控件的baseline对齐
Xml代码
EditText的android:hint
设置EditText为空时输入框内的提示信息。
android:gravity
android:gravity属性是对该view 内容的限定比如一个button 上面的text.
你可以设置该text
在view的靠左靠右等位置以button为例android:gravity="right"则button上面的文字靠右
android:layout\_gravity
android:layout_gravity是用来 设置该view相对与起父view 的位置比如一个button
在linearlayout里你想把该button放在靠左、靠右等位置就可以通过该属性设置以button为例android:layout_gravity="right"则button靠右
android:layout\_alignParentRight
使 当前控件的右端和父控件的右端对齐。这里属性值只能为true或false默认false。
android:scaleType
android:scaleType是控制图片如何
resized/moved来匹对ImageView的size。ImageView.ScaleType /
android:scaleType值的意义区别
CENTER /center
按图片的原来size居中显示当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop
按比例扩大图片的size居中显示使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside
将图片的内容完整居中显示通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度居中显示
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度显示在View的下部分位置
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度显示在View的上部分位置
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
\*\* 要注意一点Drawable文件夹里面的图片命名是不能大写的
\--\>
http://panshengneng.iteye.com/blog/1187928
Layout_margn与padding的区别:
**layout_margn**是指组件距离父窗体的距离而padding是指组件中的内容距离组件边缘的距离
与子对应的**Layout_grivaty**与**grivaty**这两者有点相似,**layout_grivaty**是指组件相对父窗体显示的位置,而**grivaty**是用来控制组件中的内容显示位置:比如
**layout_grivaty="center_vertical\|center_horizontal"**;表示组件显示是水平居中且垂直居中也就是组件位于屏幕的正中央
Android**:gravity="center_vertical\|center_horizontal"**表示组件中的内容显示位置是正中央。
我们也可以这样来理解layout_margn与layout_grivaty都与布局有关控制组件在屏幕中的显示位置
padding与grivaty都是用来控制内容在组件中的显示位置
那么layout_margn与layout_grivaty有什么区别呢grivaty与padding又有什么区别呢
区别layout_grivaty与grivaty的值都是给定的我们只能在这些给定的属性中选择
layout_margn与padding的值我们可以任意给相对于layout_grivaty和grivaty更灵活我们根据需要选择合适的属性。

View File

@@ -0,0 +1,493 @@
Android 内置了sqlife数据库
**使用sharePreferences**
- 使用方法SharedPreferences负责读取数据SharedPreferences.Editor负责写入数据。
- contains()是否包含指定key的数据
- getAll()获取sharedPreferences数据里全部的keyValue对
- getXX()得到指定键的值
- clear()清空用户配置
- putXxx()存入键值对
- remove()删除键值对
- commit()提交修改
- 只能通过Context.getSharedPreferences(Stringint)方式来获取Preferences的一个实例。
**File存储**
- FileInputStream openFileInput(String
name)打开应用程序数据文件夹下的那么文件对应的输入流
- FileOutputStream openFileOutput(String name , int
mode)打开应用程序数据文件夹下的name文件对应的输出流。模式分别有MODE_PRIVATE(只能被当前程序读写MODE_APPEND(追加方式,应用程序读写)MODE_WORLD_READABLE(被其他程序读取)MODE_WORLD+WRITEABLE(由其他程序读写)
- 相关方法
- getDir()创建name对应的子目录
- getFilesDir()获取应用程序的数据文件夹的绝对路径
- fileList()返回应用程序的数据文件夹下的全部文件
- deleteFile()删除数据文件夹下的制定文件
- 读取SD卡上的文件
- Environment.getExternalStorageState()判断是否插入了SD卡
- Environment.getExternalStorageDirectory()获取外部存储器
- FileInputStream、FileOutputStream、FileReader、FileWriter读写sd卡内容
- 权限配置创建删除文件的权限和向sd卡中写入数据的权限
\<user-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/\>\<USER-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/\>
- 1
- 2
**SQLife数据库**
- sqlife数据的格式
一般数据采用的固定的静态数据类型而SQLite采用的是动态数据类型会根据存入值自动判断。SQLite具有以下五种常用的数据类型
NULL: 这个值为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串n不能超过 4000。
CHAR(n)长度固定为n的字串n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA :包含了 年份、月份、日期。
TIME 包含了 小时、分钟、秒。
- SQLife提供的数据库访问方式
| 方法名称 | 方法表示含义 |
|--------------------------------------------------------------------------------------------------------------------------|------------------|
| openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) | 打开或创建数据库 |
| insert(String table,String nullColumnHack,ContentValues values) | 插入一条记录 |
| delete(String table,String whereClause,String[] whereArgs) | 删除一条记录 |
| query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) | 查询一条记录 |
| update(String table,ContentValues values,String whereClause,String[] whereArgs) | 修改记录 |
| execSQL(String sql) | 执行一条SQL语句 |
| close() | 关闭数据库 |
Google公司命名这些方法的名称都是非常形象的。例如openOrCreateDatabase,我们从字面英文含义就能看出这是个打开或创建数据库的方法。
- SQLife进行数据库操作的具体步骤
1. 获取SQLife对象它代表了与数据库的链接
2. 调用SQLife的方法来执行SQL语句
3. 操作SQL语句的执行结果用SimpleCursorAdaptor封装Cursor
4. 关闭SQLifeDatabase回收资源。
- SQLite3工具
- 只支持五中基本数据类型。null,integer,real,text,blob.
- 使用slite3工具执行相应的命令能够通过命令行管理数据库
- 弱类型的数据库,能够将任何数据类型保存到任何数据类型当中,在创建数据库的时候不必声明具体的数据类型。(主键除外)例如:
create table mytest{ id integer primary key, name , gender, pass , }
- 1
- 2
- 3
- 4
- 5
- 6
**SQLife具体的操作方式说明**
1. 打开或者创建数据库
在Android 中使用SQLiteDatabase的静态方法openOrCreateDatabase(String
path,SQLiteDatabae.CursorFactory
factory)打开或者创建一个数据库。它会自动去检测是否存在这个数据库如果存在则打开不存在则创建一个数据库创建成功则返回一个SQLiteDatabase对象否则抛出异常FileNotFoundException。
下面是创建名为“stu.db”数据库的代码
openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)
参数1 数据库创建的路径
参数2 一般设置为null就可以了
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
db=SQLiteDatabase.openOrCreateDatabase(“/data/data/com.lingdududu.db/databases/stu.db”,null);
1. 创建表
创建一张表的步骤很简单:
编写创建表的SQL语句
调用SQLiteDatabase的execSQL()方法来执行SQL语句
下面的代码创建了一张用户表属性列为id主键并且自动增加、sname学生姓名、snumber学号
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void createTable(SQLiteDatabase db){
//创建表SQL语句
String stu_table=”create table usertable(_id integer primary key
autoincrement,sname text,snumber text)”;
//执行SQL语句
db.execSQL(stu_table);
}
1. 插入数据
插入数据有两种方法:
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues
values)方法,
参数1 表名称,
参数2 空列的默认值
参数3 ContentValues类型的一个封装了列名称和列值的Map
②编写插入数据的SQL语句直接调用SQLiteDatabase的execSQL()方法来执行
第一种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void insert(SQLiteDatabase db){
//实例化常量值
ContentValues cValue = new ContentValues();
//添加用户名
cValue.put(“sname”,”xiaoming”);
//添加密码
cValue.put(“snumber”,”01005”);
//调用insert()方法插入数据
db.insert(“stu_table”,null,cValue);
}
第二种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void insert(SQLiteDatabase db){
//插入数据SQL语句
String stu\_sql=”insert into stu_table(sname,snumber)
values(xiaoming,01005)”;
//执行SQL语句
db.execSQL(sql);
}
1. 删除数据
删除数据也有两种方法:
①调用SQLiteDatabase的delete(String table,String whereClause,String[]
whereArgs)方法
参数1 表名称
参数2 删除条件
参数3 删除条件值数组
②编写删除SQL语句调用SQLiteDatabase的execSQL()方法来执行删除。
第一种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void delete(SQLiteDatabase db) {
//删除条件
String whereClause = “id=?”;
//删除条件参数
String[] whereArgs = {String.valueOf(2)};
//执行删除
db.delete(“stu_table”,whereClause,whereArgs);
}
第二种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void delete(SQLiteDatabase db) {
//删除SQL语句
String sql = “delete from stu_table where \_id = 6”;
//执行SQL语句
db.execSQL(sql);
}
1. 修改数据
修改数据有两种方法:
①调用SQLiteDatabase的update(String table,ContentValues values,String
whereClause, String[] whereArgs)方法
参数1 表名称
参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件where字句
参数4 更新条件数组
②编写更新的SQL语句调用SQLiteDatabase的execSQL执行更新。
第一种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void update(SQLiteDatabase db) {
//实例化内容值 ContentValues values = new ContentValues();
//在values中添加内容
values.put(“snumber”,”101003”);
//修改条件
String whereClause = “id=?”;
//修改添加参数
String[] whereArgs={String.valuesOf(1)};
//修改
db.update(“usertable”,values,whereClause,whereArgs);
}
第二种方法的代码:
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void update(SQLiteDatabase db){
//修改SQL语句
String sql = “update stu_table set snumber = 654321 where id = 1”;
//执行SQL
db.execSQL(sql);
}
1. 查询数据
在Android中查询数据是通过Cursor类来实现的当我们使用SQLiteDatabase.query()方法时会得到一个Cursor对象Cursor指向的就是每一条数据。它提供了很多有关查询的方法具体方法如下
public Cursor query(String table,String[] columns,String selection,String[]
selectionArgs,String groupBy,String having,String orderBy,String limit);
各个参数的意义说明:
参数table:表名称
参数columns:列名称数组
参数selection:条件字句相当于where
参数selectionArgs:条件字句,参数数组
参数groupBy:分组列
参数having:分组条件
参数orderBy:排序列
参数limit:分页查询限制
参数Cursor:返回值相当于结果集ResultSet
Cursor是一个游标接口提供了遍历查询结果的方法如移动指针方法move()获得列值方法getString()等.
Cursor游标常用方法
方法名称
方法描述
getCount()
获得总的数据项数
isFirst()
判断是否第一条记录
isLast()
判断是否最后一条记录
moveToFirst()
移动到第一条记录
moveToLast()
移动到最后一条记录
move(int offset)
移动到指定记录
moveToNext()
移动到下一条记录
moveToPrevious()
移动到上一条记录
getColumnIndexOrThrow(String columnName)
根据列名称获得列索引
getInt(int columnIndex)
获得指定列索引的int类型值
getString(int columnIndex)
获得指定列缩影的String类型值
下面就是用Cursor来查询数据库中的数据具体代码如下
[sql] view plain copy print?在CODE上查看代码片派生到我的代码片
private void query(SQLiteDatabase db) {
//查询获得游标
Cursor cursor = db.query (“usertable”,null,null,null,null,null,null);
//判断游标是否为空 if(cursor.moveToFirst() { //遍历游标 for(int
i=0;i\<cursor.getCount();i++){ cursor.move(i); //获得ID int id =
cursor.getInt(0); //获得用户名 String username=cursor.getString(1); //获得密码
String password=cursor.getString(2); //输出用户信息
System.out.println(id+":"+sname+":"+snumber); } }
}
1. 删除指定表
编写插入数据的SQL语句直接调用SQLiteDatabase的execSQL()方法来执行
1. onCreateSQLiteDatabase
在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。
1. onUpgradeSQLiteDatabaseintint
当数据库需要升级的时候Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表并建立新的数据表当然是否还需要做其他的操作完全取决于应用的需求。
1. onOpenSQLiteDatabase
这是当打开数据库时的回调函数,一般在程序中不是很常使用。
1. synchonized SQLiteDatabase getReadableDatabase()
以读写的方式打开数据库对应的SQLliteDatebase对象
1. synchonized SQLiteDatabase getWritableDatabase()
以写的方式打开对应的对象
1. close
关闭所有打开的SQLiteDatabase对象
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
private void drop(SQLiteDatabase db){
//删除表的SQL语句
String sql =”DROP TABLE stu_table”;
//执行SQL
db.execSQL(sql);
}
1. 事务处理
beginTransction()开始事务
endTransaction()结束事务
inTrasaction()判断是否处于事务当中。
setTransactionSuccessful()判断事务是提交还是回滚的函数。具体提交回滚是在endTransaction()部分实现。
1. SQLiteOpenHelper
该类是SQLiteDatabase一个辅助类。这个类主要生成一个数据库并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者
getReadableDatabase()方法的时候如果当时没有数据那么Android系统就会自动生成一个数据库。
SQLiteOpenHelper 是一个抽象类我们通常需要继承它并且实现里面的3个函数

16
Android/Dialog.md Normal file
View File

@@ -0,0 +1,16 @@
**\>对话框**
- AlertDialog
1. 组成:包括图标区、标题区、内容区、按钮区
2. 使用步骤:定义对象-\>设定标题-\>设定图标-\>设定对话框的内容-\>设置按钮-\>创建对象
3. 相关方法setTitle();setCustomTitle();setIcon();setPositiveButton();setNegativeButton;setNeutralButton();setMessage();setItems();setSingelChoiceItems();setAdapter();setView()
遇到的问题:
android:theme=”@android:style/Theme.Material.Dialog.Alert在manifest.xml中修改视图的主题失败导致软件不能启动
View root =
this.getLayoutInflater().inflate(R.layout.popup,null);这句话的具体意图没有搞明白,似乎是把某个视图声明为子视图。

View File

@@ -0,0 +1,105 @@
**\>intent对象的描述**
- intent的理解
intent用来表示自己的意图需要启动哪个Activity。两个Activity可以吧需要交换的数据封装成Bundle对象然后使用Intent来携带Bundle对象这样就实现了两个Activity对象之间的数据交换
- 组件的启动方法
1. Activity
- startActivity(intent)
- startActivity(intent,int)
2. Service
- StartService(Intent)
- bindService(inten,seviceConnection,int)
3. BroadcastReceiver
- sendBroadcast(intent)
- sendBroadcast(intetn,String)
- sendOrderedBroadcast(intent,String,BraodcastReceiver,Handler,int,String,Bundle)
- sendOrderedBroadcast(intet,String)
- sendStickyBroadcast(intent)
- sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,String,Bundle)
- 包含的属性
Component,Action,Category,Data,Type,Extra,Flag
**\>intent的属性及intent-filter配置**
- Component属性
- intent设定component属性的方法
setClass(Context packageContext,Class
Intent intetn = new
Intent();intetn.setAction(MainActivity.CRAZYIT\_ACTION);startActivity(intent)
- 1
- 2
- 3
- Category属性的配置
可以通过add
是一个字符串为Action增加额外的附加信息。可以指定多个Category要求
- intent-filter的配置这是被启动的Activity的配置文件配置的事目标activity的intent属性这个是activity的唯一标识。
开始有点理解这些东西了可能就是一个用来交互的实体类对于每一个对象的唯一身份标识只需要创建一个这个实体就能通过相同的方式启动类并且通过Bundle传递相应的参数。
\<intent-filter\> \<action android:name="android.intent.action.MAIN" /\>
\<category android:name="android.intent.category.LAUNCHER" /\>\</intent-filter\>
- 1
- 2
- 3
- 4
- 指定Action、Category调用系统的Activity
1. ACTION_MAIN
2. ACTION_VIEW
3. ACTON_ATTACH_DATA
4. ACTION_ATTACH_DATA
5. ACTION_EDIT。。。。。。。
6. CATAGORY_DEFAULT
7. CATEGORY_BROWSABLE
8. CATEGORY_TAB
- 在intent-filter中设置用户访问手机的权限
**\>PendingIntent介绍**
- 有条件的intent
pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行立刻的而pendingIntent的执行不是立刻的。pendingIntent执行的操作实质上是参数传进来的Intent的操作但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。
- 调用作用域
PendingIntent可以看作是对Intent的包装。PendingIntent主要持有的信息是它所包装的Intent和当前Application的Context。正由于PendingIntent中保存有当前Application的Context使它赋予其他程序一种执行的Intent的能力就算在执行时当前Application已经不存在了也能通过存在PendingIntent里的Context照样执行Intent

View File

@@ -0,0 +1,339 @@
**\>建立配置和使用Activity**
- activity能够提供许多不同的操作页面它们做成Activity栈当前活动的应用位于栈顶。
- **LauncherActivity&&ArrayAdapter**
每一个列表项对应一个intent用于保存启动不同的activity的相关信息。
intentForPostion提供了位置和不同activity对应的信息将列表项链接到制定的intent。
- **ExpandableListActivity&&ExpandableListAdapter**
设置界面显示过程中,使用了适配器的相关函数,其中复写的函数能够自动调用生成相应的界面。
- getChild()获得子字表的内容
- getChildID()获得子表的id
- getChildrenCount()获得子表的项目数量
- TextView()获得每个子表的textView配置
- getChildView()获得每个子表的textView内容
- getGroup()获得主表
- getGroupCount()获得主表的数量
- getGroupId()获得主表的id
- getGroupView()决定主表的外观
- isChildSelectable()返回被选中的子表像
- hasStableIds()返回id
当在ExpandableListActivity中定义Adapter时这些函数必须都被复写保证能够生成一个新的列表就相当于XML对应的配置属性一样这样才能完整的显示整个表格。
- **PreferenceActivity&&PreferenceFragment**
1. 实现了参数设置界面让Fragment集成了PreferenceFragment
2. 在onCreate中调用addPreferencFromResource()方法,加载制定的界面布局文件。
- **在manifest.xml中配置多个Activity资源**
1. 配置多个Activity
\<activity android:name=".MainActivity" android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"\> \<intent-filter\> \<action
android:name="android.intent.action.MAIN" /\> \<category
android:name="android.intent.category.LAUNCHER" /\> \</intent-filter\>
\</activity\>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
**\>启动和关闭Activity**
- **启动activity的两种方法**
- context.startActivity(intent)
- context.startActivity(intent,int)
- **关闭Activity的两种方法**
- context.finish()
- context.finishActivity(int)
- **代码示例**
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
**\>使用Bundle向指定的activity传递数据**
- **intent携带额外数据的方法**
- putExtras(Bundle)
- getExtras()
- putExtra()
- getXxxExtra()
- putXXX(String,XXX)
- putSeriaLizable(String,Srializagle)
- getXXX(String)
- getSerializable(String,Serializable)
- **使用bundle和intent机制向指定的activity传递数据的方法**
- 定义方法向介质添加批数据并且将介质传递给目标activity
Person p = new
Person(name.getText(),toString(),passwd.getText().toString(),gender); Bundle
data = new Bundle(); data.putSerializable("person),p); Intent intent = new
Intent(MainActivity.this,ResultActivity.class); intent.putExtras(data);
startActivity(intent);
- 1
- 2
- 3
- 4
- 5
- 6
- 使用方法,从传递过来的intent中提取数据
Intent intent = getIntent();Person p = (Person)
intent.getSerializableExtra("person");
- 1
- 2
**\>启动Activity并且获取返回结果**
- 当前的Activity启动另一个Activity获取它的结果并且返回到当前的Activity。
- **实现方法**
重写onActivityResult(int requestCode,int resultCode,intent
intent)方法相当于一种回调方法当被启动的Activity生命周期结束并且返回结果时该方法将会被触发。
- **实现过程**
1. 用特殊函数启动另外的activity
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
intent.putExtras(data);
startActivityForResult(intent,0);
1. 当activity结束时触发onActivity函数需要重写它。
1. 在另外的activity中仍旧需要bundle和intent进行配合传递数据
对类的补充:
**Intent类交互介质**
- **Intent类作用**
每个应用程序都有若干个Activity组成每一个Activity都是一个应用程序与用户进行交互的窗口呈现不同的交互界面。因为每一个Acticity的任务不一样所以经常互在各个Activity之间进行跳转在Android中这个动作是靠Intent来完成的。你通过startActivity()方法发送一个Intent给系统系统会根据这个Intent帮助你找到对应的Activity即使这个Activity在其他的应用中也可以用这种方法启动它。
- **Intent的定义**
Intent是Android系统用来抽象描述要执行的一个操作也可以在不同组件之间进行沟通和消息传递。
Intent意图可以是明确的指定组件的名称这样你可以精确的启动某个系统组件比如启动一个Activity。它也可以是模糊的没有指定组件名称只要是能够匹配到这个Intent的应用都可以接收到比如发送一个拍照Intent所有的拍照应用都会响应。
- **Intent有以下几个属性**
动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。
**Bundle类(批数据,是一个键值对)**
- **Bundle类的作用**
Bundle主要用于传递数据它保存的数据是以key-value(键值对)的形式存在的。我们经常使用Bundle在Activity之间传递数据传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组也可以是对象或对象数组。当Bundle传递的是对象或对象数组时必须实现Serializable
或Parcelable接口。下面分别介绍Activity之间如何传递基本类型、传递对象。
- **Bundle的定义和使用**
- 新建一个bundle类
view plain copy
Bundle mBundle = new Bundle();
- bundle类中加入数据key
\-value的形式另一个activity里面取数据的时候就要用到key找出对应的value
view plain copy
mBundle.putString(“Data”, “data from TestBundle”);
- 新建一个intent对象并将该bundle加入这个intent对象
view plain copy
Intent intent = new Intent();
intent.setClass(TestBundle.this, Target.class);
intent.putExtras(mBundle);
- Bundle提供了各种常用类型的putxxx()/getxxx()方法,用于读写基本类型的数据。
**Context类的主体上下文**
- **Context类的定义**
Interface to global information about an application environment. This is an
abstract class whose implementationis provided by the Android system. It allows
access to application-specific resources and classes, as well as up-calls for
application-level operations such as launching activities, broadcasting and
receiving intents, etc
- **Context使用场景**
1. 它描述的是一个应用程序环境的信息,即上下文。
2. 该类是一个抽象(abstract
class)类Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类)。
3. 通过它我们可以获取应用程序的资源和类也包括一些应用级别操作例如启动一个Activity发送广播接受Intent信息
- **Context类图集成关系**
![30607569Vj4c.gif](media/a0889d3344d2955e66de11c0646a0a10.gif)
context类图继承关系
- **Context相关的方法**
- getSystemService(String)获得系统级服务
- startActivity(Intent)启动一个Activity
- startService(Intent)启动一个service
- getSharedPreferences(String, int)
- **Context什自己的理解**
Context类相当于一个上下文环境能够很好的统筹一个Activity、service或者app的资源和调度方式他是负责指挥这些资源的类的接口他能启动关闭一个app等。
**Serializable类**
> 序列化的内容补充
> 当两个进程在进行远程通信时彼此可以发送各种类型的数据。无论是何种类型的数据都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列才能在网络上传送接收方则需要把字节序列再恢复为Java对象。
> 把Java对象转换为字节序列的过程称为对象的序列化把字节序列恢复为Java对象的过程称为对象的反序列化。
- **Serializable接口的定义**
为了保存在内存中的各种对象的状态也就是实例变量不是方法并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object
states但是Java给你提供一种应该比你自己好的保存对象状态的机制那就是序列化。
- **使用情况**
- 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
- 当你想用套接字在网络上传送对象的时候;
- 当你想通过RMI传输对象的时候
- **Parcelable和Serializable的区别**
内存间数据传输时推荐使用Parcelable,activity间传输数据使用Parcelable是Android特有功能效率比实现Serializable接口高效可用于Intent数据传递也可以用于进程间通信IPC
保存到本地或者网络传输时推荐使用Serializable
**Parcelable类**
- **Parcelable类的作用**
想要在两个activity之间传递对象那么这个对象必须序列化Android中序列化一个对象有两种方式一种是实现Serializable接口这个非常简单只需要声明一下就可以了不痛不痒。但是android中还有一种特有的序列化方法那就是实现Parcelable接口使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了因此在某些情况下实现这个接口还是非常不错的选择。
- **Parcelable类的使用情况**
- 永久性保存对象,保存对象的字节序列到本地文件中;
- 通过序列化对象在网络中传递对象;
- 通过序列化在进程间传递对象。
- **Parcelable接口定义**
public interface Parcelable
{
//内容描述接口,基本不用管
public int describeContents();
//写入接口函数,打包
public void writeToParcel(Parcel dest, int flags);
//读取接口目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的所以需要用到模板的方式继承类名通过模板参数传入
//为了能够实现模板参数的传入这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
public interface Creator\<T\>
{
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
}
- **实现序列化的步骤**
1. implements Parcelable
2. 重写writeToParcel方法将你的对象序列化为一个Parcel对象将类的数据写入外部提供的Parcel中打包需要传递的数据到Parcel容器保存以便从
Parcel容器获取数据
3. 重写describeContents方法内容接口描述默认返回0就可以
4. 实例化静态内部对象CREATOR实现接口Parcelable.Creator

View File

@@ -0,0 +1,136 @@
**\>Activity的回调机制**
- **回调机制的解释**
通用程序框架在完成整个应用个通用功能和流程时在特定点上需要相应的业务逻辑实现。java
swing中的init()方法java Thread中的run方法都是一种回调机制
- **回调机制的存在形式**
1. 以接口的形式存在
2. 以抽象方法的形式存在通过oncreate、onActivityResult()函数能够直接创建一个Activity例如当有一个Activity被调用时生成相应的实例时就会通过onCreate方法创建一个Activity。
**\>Activity的生命周期**
- 四个状态
1. 运行状态当前Activity位于前台用户可见可以获得焦点。
2. 暂停状态其他Activity位于前台该activity依然可见但不能获得焦点
3. 停止状态该activity不可见失去焦点
4. 销毁状态activity结束。
- 生命周期示例图
![14838777He6C.gif](media/64237df36a973c99a027cf9e6471c7e2.gif)
Activity的生命周期
- Activity的四种加载模式
1. standard:标准模式
每次启动Activityandroid都会启动一个新的实例并通过Activity添加到当前的task栈顶就相当于同一个类会有多个对象同时在运行。
1. sigleTop:Task栈顶单例模式
与standard模式基本相同但是当要启动的类本身就位于栈顶事那么将不会重新创建Activity实例而是复用之前的Activity。
1. sigleTask:Task内单例模式
在同一个task中只允许有一种实例。不存在创建存在移动到栈顶显示。
1. sigleInstace:全局单利模式
无论从哪个任务中启动Activity都会只创建一个单一的实例。
> android 采用task栈对Activity进行管理先启动的放在
> task栈底后启动的Activity被放在了task栈顶。
**\>Fragment详解**
- **Fragment的简介**
Fragment代表了Activity的子模块因此可以吧Fragment理解成Activity片段。Fragment拥有自己的生命周期能够接受自己的输入事件。
- Fragment总作为Activity的界面组成部分。Fragment可调用getActivity()方法返回ActivityActivity可以使用FragmentManager来管理相应的Fragment
- Fragment的add(),remove(),replace()方法可以动态地添加、删除或者替换Fragment。
- 一个Activity可以痛死组合多个Fragment一个Fragment
也可以被多个Activity复用。
- Fragment可以响应自己的输入输出事件有自己的生命周期。但是收到Activity的控制。
Fragment主要是为了简化大屏手机的UI的设计。
**创建Fragment**
onCreate()系统创建Fragment回调的方法
onCreateView()当Fragment绘制界面时回调这个方法
onPause()用户离开Fragment后回调的方法
**\>Fragment与Activity通信**
- 在布局文件中使用
**\>Fragment管理与Fragment事物**
- FragmentManager可以完成的功能
- FragmentManager.findFragmentById()/…ByTag()获取指定的Fragment
- popBackStack()将Fragment从后台栈中弹出
- 调用addOnBackStackChangeListener()注册监听器
- add()
- remove()
- commit()
- replace()
**\>Fragment 的生命周期**
- 四种不同的状态
- 运行状态,fragment位于前台获取焦点
- 暂停状态,activity位于前台Fragment可见
- 停止状态Fragment不可见失去焦点
- 销毁状态fragment被删除。
- 生命周期的控制函数。
以下的函数都是回调函数,在不同的时间被触发调用
- onAttach()当Fragment被添加到Activity中时
- onCreate()创建Fragment时
- onActivityCreated()当所在Fragment所在的Activity被启动时
- onCreateView()每次创建绘制该Fragment的View组件时
- onStart()启动Fragment时
- onResume()恢复Fragment时
- onPause()暂停Fragment时
- onStop()停止Fragment时
- onDestroyView()销毁Fragment包含的组件时
- onDestroy()销毁Fragment时
- onDetach()将该Fragment从Activity中删除时

View File

@@ -0,0 +1,42 @@
**\>androidStudio的开发步骤**
1. 创建android项目和文件结构
2. 在XML布局文件中定义应用程序的用户界面
3. 在.java文件中编写业务的实现。
android
的文件结构中只有三个有用:.java实现应用程序的业务res中的.xml实现工程的视图的资源文件manifest.xml实现相关资源的协调配置。
4大组件activityservicebroadcastreceivercontentProviderintent不同组件之间通讯的载体
**\>android studio 中的文件结构**
- src文件夹保存java文件
- res文件夹保存资源文件和xml文件
- bin文件夹存放生成的目标文件
- gen文件夹自动生成的R.java文件
**\>相关文件的理解**
- R.java是一个资源统筹文件每个资源对应一个内部类的int值和field相当于为为每个其他的资源文件添加了一个变量或者说定义了一个相对于软件的全局变量。在.java文件中相当于添加了一个字段public
static final int app_name =
00123031;在xml文件中的引用方法@string/app_name另外标识符不需要R资源文件的定义就可以直接使用@+id/ok
- value/string.xml,定义了全局的字符串常量。
- androidManifest.xml全局描述文件。统筹了很多东西。通过标签声明需要的权限声明被调用用的权限。
**\>antivity中包含的方法的总结**
getWindow()获得当前窗口的对话框
setContentView()设置当前activity的主要视图xml文件
setTheme()设置xml文件显示的主题风格
签名防止同名的包中的程序被覆盖。

View File

@@ -0,0 +1,257 @@
**\>应用资源概述**
- 访问方式分类
1. 无法通过R资源清单类访问的原生资源保存在assets目录下
2. 可通过R资源清单访问的资源保存在res目录下
- 源代码按照物理存储形式分类
1. 界面布局文件
2. java资源文件
3. 资源文件android应用资源
- 资源的类型和存储方式
1. /res/animator/ 定义属性动画
2. /res/anim/ 定义补间动画
3. /res/color/ 定义颜色列表
4. /res/draWble/ 存放各种位图
5. /res/layout/ 存放布局界面
6. /res/menu/ 存放菜单资源
7. /res/raw/ 存放原生资源(音乐视频)
8. /res/value/ 存放简单值,字符串值、整型值、颜色值、数组等
9. /res/xml/ 原生的XML内容
- 使用资源
1. 在java文件中访问Pacage_name.R.resource_type.resource_name;
在这里使用的是资源清单,而不是实际资源,所储存到的东西不过是指向资源的一个整型数组。
- getResources().getText(R.String.main_title)通过引用返回实际资源,用来建立资源副本
Drawable logo = res.getDrawavle(R.drawable.logo);
- 在XML文件中访问@pacage_name:resource_type/resource_name
**\>字符串、颜色、尺寸资源**
- 颜色值的定义\#ARGB都是十六进制书。
\<String name="CSD"\>这是一个字符串\</String\>
\<color name="c1"\>\#FOO\</color\>
\<dimen name="spacing"\>8dp\</dimen\>
\<bool name="is_male"\> true \</bool\>
- 字符串颜色尺寸资源的使用
\<TextView android:text="@string/app_name"
android:textsize="@dimen/title_font"/\> \<GridView
android:horizontalSpacing=dimen/spacing/GridView\>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 在java代码中访问如下
R.color.c1 R.string.c1 R.dimen.cell\_width R.bool.bool\_name
- 1
- 2
- 3
- 4
- 5
**\>数组资源**
- 定义普通数组
\<array name="plain_arr"\> \<item\>@color/c1\</item\> \<item\>@color/c2\</itme\>
\</array\>
- 1
- 2
- 3
- 4
- 定义字符串数组
\<string-array name="plain_arr"\> \<item\>@string/c1\</item\>
\<item\>@string/c2\</itme\> \</string-array\>
- 1
- 2
- 3
- 4
- 定义整型数组
**\>使用Drawable资源**
- 使用方式
@package\_name:drawable/file_namepackage_name.R.drawable.file_name
- 1
- 2
- StateListDrawable资源
能够根据目标组件的状态切换不同的分辨率图片。
支持的属性
android:stata\_active
android:state\_checkable
android:state\_cheked
android:state\_enable
android:state\_first
android:state\_focused
android:state\_last… …
- 具体使用说明
1. 在res\\drawnable\\my_image.xml中建立如下内容。本质上是在原来直接显示图片的基础上进行一次封装是的显示的图片具有动态变化的效果。
\<sector xmlns:android="http:\\\\"\>\<item android:state_focused="true"
android:color="\#f44"/\>\<item android:state_focused="false"
android:color="\#ccf"/\>
- 1
- 2
- 3
- 4
- 5
**\>使用LayerDrawable资源**
- 能够支持的属性
anroid:drawble制定图片对象
android:id指定对象的id
android:buttonm tom left button指定显示的位置。
- 使用的语法格式
**\>使用ShapeDrawable资源**
- 作用:
用来定义一个基本的图形(矩形、线条、圆形)
- 使用:(下一级标签)
定义了四个角的弧度
定义了渐变色填充
定义了几何形状内边距
定义几何形状的大小
定义使用单种颜色填充
定义为集合形状绘制边框
**\>ClipDrawable资源**
- 作用
从其他位图上截取一个图片片段
- 使用:(这个标签的属性)
android:drawable指定截取的资源
android:clipOrientation指定截取的方向
android:gravity指定截取时的对其方式
**\>AnimationDrable资源**
- 作用:
代表一个动画,相当于逐帧动画,也可以通过平移、变换计算出来的补间动画。
:设置透明度
:图片进行缩放变换
:图片进行位移变换
:图片进行旋转
android:interpolator属性指定变化速度linear_interpolator/accelerate_interploator/decelerate_interpolator:匀速变化/加速变化/减速变化。
- 使用方法:
- 在XML文件中访问
@package\_name:anim/file_name
- 在java代码中访问
package.R.anim.file_name
**\>属性动画资源**
- 子类
AnimatorSet、ValueAnimator、ObjectAnimator、TimeAnimator
- 定义属性动画的根元素
- \<set\> \</set\>
- \<objectAnimator\> \</objectAnimator\>
- \<animator\> \</animator\>

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

152
Android/事件处理.md Normal file
View File

@@ -0,0 +1,152 @@
**\>事件处理的概述**
- 两种事件处理机制
1. 基于监听的事件处理
2. 基于回调的事件处理
**\>基于监听的事件处理机制**
- 涉及到的三类对象
1. Event Source事件源指各个组件。
2. Event 界面组件上发生的特定的事情,。
3. Event Listener监听事件源发生的事情。并对各种事情作出相应的响应。
4. Event
Handler事件处理器当事件监听器捕获事件后由响应的事件处理器识别特定的事件并做出响应的动作。
- 事件监听机制的工作流程
普通组件(事件源对象) 发生很多事件,生成多种事件对象 被同一个监听器对象捕获
监听器通过不同的事件处理器处理这个事件。
> 每个组件可以根据不同的事件类别指定多个监听器,每一个监听器可以监听多个事件源。
**\>实现事件监听器的方法**
1. 内部类作为时间的监听器
使用内部类作为事件监听器能够在这个类内复用该监听器。该监听器类能够自由访问外部类的所有界面组件
1. 外部类作为时间监听器
事件监听器通常属于特定的GUI界面定义成外部类不利于提高程序的内聚性。外部类形式的时间监听器不能够自由访问GUI界面的类中的组件。同时也适用于监听器于GUI界面没有任何耦合情况。
> 监听器还是主要来写显示逻辑,具体的业务逻辑放到外部的其他函数或者类中进行处理。
> Activity类本身作为事件监听器
> 不推荐activity类本身用来界面初始化工作包含事件监听器容易造成程序的逻辑结构混乱。
> 匿名类作为时间监听器类
> 大部分时候事件监听器类的代码没有什么复用价值,所以只要使用匿名类来实现事件监听器想要达到的页面逻辑就好。
> android可以直接在界面布局中制定标签绑定事件的处理方式。
> androidonClick=”clickHandler”
**\>基于回调的事件处理方法**
- 回调机制
事件的处理直接绑定到与组件相关的时间处理函数上,而非通过监听器的监听和事件处理器的匹配处理。有点像事件监听器和事件源融合在一起,不需要单独的时间监听器类,事件源本身能够监听自身发生的各种事件。
- 基于回调的事件传播
当返回为true时表明该方法已经能够处理发生的事件事件不会向外传播给外层的时间监听器。当返回为false时如果有外围的监听器处理同一个事件则事件会向外传播同时被其他监听器坚挺到。如果存在各种监听器其监听顺序为绑定的事件监听器\>基于回调的内部事件监听器–\>基于回调的外部事件监听器。
**\>相应系统设置的事件**
- 用来获取系统的配置
Configuration cfg = getResources().getConfiguration();
- onConfigurationChanged能够监听相关的配置改变的事件。
**\>Handler消息传递机制**
- 工作原理
android第一次启动主线程负责activityUI界面的线程而且只允许UI线程对主界面进行修改其他新启动的线程无法对主界面进行直接修改需要使用Handler进行消息传递。
- Handler简介
1. 在新启动的线程中发送消息
2. 在主线程中获取和处理消息
好像是原来的事件处理机制变成了消息处理机制,通过监听消息,处理消息完成一系列动作,同事件处理一样。
- Handler涉及的方法
1. HandlerMessage()
2. hasMessage()
3. hasMessages()
4. obtainMessage()
5. sendEmptyMessage()
6. sendEmptyMessageDelayed()
7. sendMessage()
8. sendMessageDelayed()
- Handler、Loop、MessageQueue的工作原理
1. Message是Handler接受和处理的对象
2. Looper每个线程只能有一个Looperloop方法负责读取MessageQueue中的消息
3. MessageQueen消息队列采用了先进先出的方式管理队列。
private Looper() { mQueue = new MessageQueue(); mRun = true; mThread =
Thread.currentThread(); }
- 1
- 2
- 3
- 4
- 5
- 6
- Looper类的使用方法
1. 调用Looper的prepare方法创建Looper对象生成对应的MessageQueue来管理事件
2. 创建Handler子类用于发送本线程的消息。重写HandlerMessage方法负责处理来自其他线程的消息。
3. 调用Looper的loop方法启动Looper类
UI线程一般专门用来相应用户的界面操作而其他的逻辑运算和处理都交给其他线程处理主要目的是防止UI线程被阻塞而让用户以为界面卡顿。
此时如果UI线程与其他线程的交互方式就是Handler消息传递机制同事件监听机制的逻辑十分相似。
**\>异步任务**
- 解决新线程不能更新UI主界面的问题的方法
- 使用Handler消息处理机制
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable,long)
- 异步处理机制
- AsyncTask

View File

@@ -0,0 +1,98 @@
**逐帧动画**
- AnimationDrawable与逐帧动画。在元素中定义子元素表示动画的全部帧并制定持续时间即可。
\<animation-list xmlns:android=""android:onshot=true/false\> \<item
android:drawable="@package_name:drawable/resource_name"android:duration="integer"/\>
\</animation-list\>
**补间动画**
- android使用Animation代表抽象的动画类
- AlphaAnimation:透明度改变的动画,指定开始透明度、结束透明度、动画持续时间
- ScaleAnimation:大小缩放的动画,指定缩放中心、开始缩放比、结束缩放比、动画持续时间
- TranslateAnimation:位移变化的动画,指定开始位置、结束位置、动画持续时间
- RotateAnimation:旋转动画,旋转轴心、开始旋转角度、结束旋转角度
- 通过interpolator指定动画运行期间动态补入多少帧在哪些时刻补入。能够指定动画的变化速度。
- interpolator的实现类
- LinearInterpolator:均匀速度改变
- AccelerateInterpolator:加速
- AccelerateDecelerateinterpolator:中间加速
- CycleInterpolator:循环播放n次变化速度正玄曲线
- DecelerateInterpolator:减速
- 自定义补间动画
- 继承Animation重写抽象基类的interpolatedTime时间进行比方法和Transformation补间动画变形程度。
- Transformation代表了对图片或者视图的变形程度封装了一个Matrix对象用来对图形进行位移、倾斜、旋转等变换。封装了一个Camera对象进行三维空间变换。getMatrix():将Camera所有变换应用到matrix上
- getMatrix():Camera对应变换应用到matrix上
- rotateX:X轴旋转
- rotateY():Y轴旋转
- rotateZ():Z轴旋转
- translate():目标组件在三维空间内变换
- applyToCanvas():应用到场景当中
**属性动画**
- 属性变化可以定义任意性质的变化。可以针对任何对象执行的动画,需要制定动画持续时间、动画的插值方式、动画的重复次数、重复行为、动画集、帧刷新率
- 属性动画的API
- Animator:提供了创建属性动画的基类。
- ValueAnimator:属性动画主要的时间引擎,负责计算各个帧的属性值,定义了属性动画的绝大部分核心功能。
- ObjectAnimator:对指定对象的属性执行动画是ValueAnimator的子类
- AnimatorSet:组合多个Animator并制定多个Animator的播放次序。
- IntEvaluator:计算int属性值的计算器。
- FloatEvaluator:计算float类型的计算器
- ArgbEvaluator:计算十六进制颜色值的计算器
- TypeEvaluator:计算器接口。自定义计算器。
- ValueAnimator创建属性动画的步骤
1. 调用ofInt() ofFloat() ofObject()静态方法创建ValueAnimator实例
2. 调用setXxx() 方法设置动画持续时间,差值方式、重复次数
3. 调用start()方法启动动画
4. 为ValueAnimator注册AnimatorUpdateListener监听器监听ValueAnimator计算出来的值并将这些值应用到制定对象上。通过getAnimatorValue()方法来计算值,并应用到任何对象上。
- ObjectAnimator创建属性动画的步骤
- 继承了ValueAnimator已经绑定了指定的对象直接将ValueAnimator计算的值应用到制定对象的指定属性上。
- 必须为绑定的制定对象提供特定的setter方法才行。如果没有开始值必须提供getter方法提供开始值。
- 如果对象是View需要调用onAnimationUpdate()中调用View.invalidate()方法来刷新屏幕显示。
**使用SurfaceView实现动画**
- SurfaceView与SurfaceHolder相互关联使用后者提供了方法
- lockCanvas()锁定surfaceView对象或者对指定区域更新。

View File

@@ -0,0 +1,171 @@
**使用简单的图片**
- 通过Drawable对象进行访问。
R.drawable.file_name
@drawable/file_name
- 通过BitmapDrawable对Bitmap对象进行封装以下皆为静态方法来自BitmapFactory。
- BitmapDrawagle drawable - new
BitmapDrawable(bitmap);通过Bitmap对象的到另外的图像
- createBitmap(Bitmap source,int x,int y,int width, int
height):从源位图source的制定位置开始截取一个图像。
- createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean
filter):对原来的位图进行缩放
- createBitmap(int width,int height,Bitmap.Config
config):创建一个宽width、height的新位图
- createBitmap(Bitmap source,int x,int y,int width,int height,Matris
m,boolean filter);截取一段图像
- decodeByteArray(byte[],int offset, int
length);从指定字节数组的offset位置开始将长度length的字节解析成Bitmap对象。
- decodeFile(String pathName):从pathName指定文件中解析、创建Bitmap对象
- 用来判断是否被回收: isRecycled()
用来强制回收recycle()
- 使用静态方法导入一张图片:
- AssetManager assets=getAssets();
- InputStream assetsFile = assets.open(images[currentImg++]);
- BitmapDrawable bitmapDrawable=(BitmapDrawable) image.getDrawable();
- image.setImageBitmap(BitmapFactory.decodeStream(assetFile));
**\>绘图**
- 绘图基础
- 集成View组件重写onDraw()回调方法。
\*使用Canvas画布进行画图
- drawArc()
- drawBitmap()
- drawCircle()
- drawLine()
- drawLines(),drawOvl()
- drawPath(),drawPoint()
- drawPoints(),drawRect()
- drawRoundRect()
- drawText()
- drawTextOnPath()
- clipRect()
- clipRegion();
\* Canvas坐标变换rotate()旋转,scale()缩放,skew()倾斜,translate()移动;
- 使用Paint进行绘图
- setARGB()设置颜色。
- setAlpha()设置透明度
- setColor()设置颜色
- setPathEffect()设置路径
- setShader()设置画笔的填充效果
- setShadowLayer()设置阴影
- setStrokeWidth()设置笔触宽度
- setStrokeJoin()设置笔转风格
- setStyle()设置paint的填充风格
- setTextAlign()设置文字对齐方式
- setTextSize()设置文本的文字大小。
- 使用Path类
- 预先将N个点连成一条路径然后在路径上绘制
- 子类ComposePathEffect/CornerPathEffect/DashPathEffect/DiscretePathEffect/SumPathEffect
- 绘图应用-绘制有用游戏
重复调用onDraw()方法每次在View组件上绘制不同的东西形成逐帧动画。
- 双缓冲画图板
- 弹球游戏
**\>图形特效处理**
- 使用Matrix控制变换步骤
1. 获取Matrix对象
2. 调用Matrix的方法进行变换矩阵方法
3. 将程序Matrix所做的变换应用到指定图形或组件。
- Matrix提供的方法
- setTranslage
- setSkew()
- setTotate()
- setScale()
- Matrix 应用举例
- 键盘操作图片移动
- 移动游戏背景
- 使用drawBitmapMesh扭曲图像
- bitmap:扭曲的源位图
- meshWidth/meshHeight划分格子数
- verts扭曲后个顶点的位置
- vertOffset:控制verts数组中扭曲的开始。
- 通过drawBitmapMesh()方法对源位图扭曲绘制。
- drawBitmapMesh 应用举例
- 可揉的图片
**\>使用Shader填充图形**
- 使用Shader对象指定渲染效果来填充图像。子类
- BitmapShader位图平铺
- LinerGradient线性渐变
- RadialGradient圆形渐变
- SweepGradient角度渐变
- ComposeShader组合渲染效果

View File

@@ -0,0 +1,72 @@
**\>Android系统简介**
- **android 分层**
1. 应用程序层
2. 应用程序框架层
3. 系统运行库
4. linux核心层。
- **设计规则**
1. 每个程序都运行在了自己的进程空间中,需要时启动,不需要时终止。
2. 每个程序都有自己的运行库ART各应用程序之间的代码是相互隔离的。
3. 每个程序被分配唯一的ID任何应用程序的代码与其他应用程序的代码是相互隔离的。
- **Android应用程序的四大组件**
1. activity活动用于与用户进行交互的可视化界面凡是在应用程序中看到的东西都是放在activity中。每一个activity子类集成父类Activity。
2. Service服务无需可视化界面需要在后台长期运行的应用程序背景音乐播放器和后台数据处理任务等继承自父类Service。
3. Broadcast
Receiver广播接收器接受和处理广播消息的组件。没有影虎界面在相应其接收到的信息时可以启动一个activity继承自父类BroadcastReceiver。
4. Content
Provider内容提供者可以将指定的一组数据让其他程序使用。数据可能存储在文件系统或者SQLlife中。继承自父类ContentProvider。
5. 补充Intent负责对应一次操作中的动作、动作涉及的数据、附加数据进行描述。Android根据此描述找到对应的组件将intent传递给调用的组件。
- **Android应用程序框架层**
1. 使用java语言编写。
2. 使用java native interface调用core lib层的本地方法
3. 实现了一系列服务活动管理器窗口管理器、内容提供器、视图系统、通告管理器、包管理器、电话管理器、资源管理器、位置管理器、xmpp服务。
- **系统运行库**
1. 系统C库 从BSD集成的标准C系统函数库
2. 媒体库基于OpenMax库支持多种音频视频图像文件
3. Serface Manager显示子系统管理提供了2D&3D图层的无缝融合
4. LibWebCore最新的web浏览器引擎。
5. SGL底层的2D图形引擎
6. 3Dlibraries基于OpenGL3D软件加速
7. FreeType文图和矢量图字体显示
8. SQLLite数据库引擎。
9. Dalvik虚拟机在程序执行时编译成dex的字节码后交给dalvik虚拟机执行
10. ART虚拟机Dalvik的替代品。在应用成许安装时吧程序代码转换成及其语言避让程序成为真正的本地应用。
- 采用了AOT预编译技术。函数调用去虚拟化调用接口和虚函数时需要寻找真正的函数浪费大量的时间。去虚拟化后可以迅速调用。消除异常检查。
- 更高效的垃圾回收机制GC。GC调用有三种情况GC_EXPLICIT应用程序通过system.gc主动调用GC_FOR_ALLOC内存分配不足时
GC_CONCURRENT给java层分配内存后计算一份陪的大小达到阈值时对象大小超过384KBGC_MALLOC(内存分配失败)GC_EXTERANL_ALLOC(外部内存分配失败)
- **Linux内核**
安全性、内存管理、进程管理、网络协议栈、驱动模型。

View File

@@ -0,0 +1,182 @@
**\>使用原始XML资源**
- 文件路径:
在/res/xml/路径下创建xml内容。
- 访问方式:
- java中package_name.R.xml.file_name
- @package_name:xml/file_name
- 获得实际的XML文件的方法
- XmlResourceParser getXml(int
id),使用XMLPullParser来解析该XML文档该方法返回一个解析器对象XMLResourceParser是XmlPullParser的子类
- InputStream openRawResource(int id)获取xml文档对应的输入流。
- 使用XML文件
XmlResourceParser xrp = getResources().getXml(R.xml.books)
xrp.getName()获取标签名
xrp.getAttributedValue(null,”price”);根据属性名获取属性值
xrp.getAttributeVale(1);根据属性的索引来获取属性的值
xrp.nextText()获取文本内容
xrp.next()下一个事件
**\>使用布局文件**
> 参照第二章内容
**\>使用菜单资源**
> 参照第二章内容
**\>样式和主题**
> 感觉样式和主题就有点像html中css的作用负责通过xml定义一系列完整的格式而普通的java代码就像网页前端中js脚本负责完成前端的简单页面逻辑普通的xml代码就像html代码负责整体的布局。
- 样式的含义相当于多个格式的集合其他UI组件通过style属性来指定样式。
- 样式的定义:
- name:指定样式的名称
- parent:指定继承的父样式,获得父样式中的所有格式,同时可以覆盖父样式
\<resources\> \<style name="style1"\> \<item
name="android:textSize"\>20sp\</item\> \<item
name="android:textColor"\>\#00d\</item\> \</style\> \</resources\>
- 1
- 2
- 3
- 4
- 5
- 6
- 样式的使用style = “@package\_name:style/file_name”
- 主题资源不能作用于单个View组件主体应该对整个应用中所有的Activity起作用或对指定的Activity起作用。主要是定义窗口外观的格式。
- 主题资源的定义方法
\<style name="CrazyTheme"\> \<item name="android:windowNoTitle"\>true\</item\>
\<item name="android:windowFullscreen"\>true\</item\> \<item
name="android:windowFrame"\>@drawable/star\</item\> \</style\>
- 1
- 2
- 3
- 4
- 5
- 主题资源的使用方法:
- java:setTheme(R.style.CrazyTheme);指定单一的Activity应用主题
- manifest.xml对整个工程使用某个主题。
- xml在单个Activity中使用某个主题
android内置了大量的主题资源
**\>属性资源**
- 属性资源的定义:
- attr子元素定义了一个属性
- declare-styleable子元素定义了一个styleable对象包含了一组attr属性值。
- 属性资源的使用:
TypedArray
typedArray=content.obtaintStyledattributes(attrs,R.styleable.alphaImageView);
int duration= typedArray.getInt(R.styleable.AlphaImageView\_duration,0)
alphaDelta = 255 \* SPEED / duration;
- 1
- 2
- 3
**\>使用原始资源**
- 存放位置:/res/raw/或者/assets/目录下前者会在R资源清单中生成一个索引项。后者是更彻底的原始资源android需要通过AssetManager来管理该目录下的原始资源。
- R清单中的访问方式@package_name:raw/file_name;或者package_name.R.raw.file_name;
- asset中访问方式
- InputStream open(String fileName):根据文件名来获取原始资源对应的输入流
- AssetFileDescriptor openFd(String
fileName):根据文件名来获取原始资源对应的AssetFileDescriptor。AssetFileDescriptor代表了一项原始资源的描述应用程序可以通过AssetFileDescriptor来获取原始资源。
**\>国际化和资源自适应**
- java实现国际化的方法
将标签和提示等信息放在资源文件中资源文件是键值对对每个资源文件中的key是不变的但value随着不同的国家和语言改变。
- java程序国际化的实现方法
- java.util.ResourceBundle:加载一个国家的语言包
- java.util.Locale:用于封装一个特定的国家区域、语言环境。
- java.text.MessageFormat:用于格式化带占位符的字符串。
- baseName_language\_country.properties
- baseName\_laguage.properties
- baseName.properties
- java支持的国家和语言
- 程序国际化的具体实现方法:
- 在不同国家的properties文件中定义大量的键值对并将两个字节的值进行转换(native2ascii)。
- 获得当前系统的国家语言环境Locale = Locale.getDefault();
- 加载制定国家地区的properties文件,将得到的键值对放在bundle中
ResourceBundle bundle = ResourceBundle.getBundle(“mess”,myLocale);
- 取出键值对中的值
System.out.println(bundle.getString(“hello”));
> 其他程序国际化的方法也一样,能够通过(资源-国家-r语言的方式来定义不同的国家。
**\>自适应不同屏幕的资源**
- 屏幕资源:屏幕尺寸,屏幕分辨率、屏幕方向
对dp和dpi的理解
dp出现的原因是android手机屏幕分辨率各不相同同如果用px像素点来描述会导致在不同的手机屏幕上效果差异较大。dp的目的是为了封装屏幕的分辨率。对于任何屏幕他的dp都是480dp\*320dp如果分辨率更高那么1dp就等于更多的px如果分辨率更低1dp就等于更少的px。其中dp和平乡的换算公式被称为dpi就是单位dp中含有像素的个数或者说单位inch中含有像素点的个数。
事实上dp的工作机制跟上述内容不同但是为什么采取一种错误的理解方式因为他们的机制一样但是结果不一样。
那就应该用学习html中的方法机制理解起来可能比较简单重要的是对标签的记忆组合与对审美的要求。而js和android中的java代码则对逻辑要求比较严谨。

View File

@@ -0,0 +1,154 @@
\>cookie
\>\>定义:
cookie是服务器留在用户计算机中的小文件每当相同的计算机通过浏览器请求页面时他会同时发送cookie。通过php能够创建并取回cookie的值
\>\>setcookie(name, value, expire, path, domain);
expire参数是过期时间
\>\>\$_COOKIE["user"] //这些全局变量都是数组
用于取回cookie的值
print_r(\$_COOKIE); //能显示所有的数组
isset(\$_COOKIE["user"]);//用于确定是否设置了cookie
setcokkie("name", "",
time()-3600);//当删除cookie是应当以国企日期变更为过去的时间点不明白
\>\>如果浏览器不支持cookie可以使用表单将信息存在php中
\>sessions
\>\>作用session变量用于存储有关用户会话的信息更改用户会话的设置。保存信息属于单一用户并且可供提供应用程序中的所有应用程序中的所有页面使用。
\>\>作用地点:服务器上,作用时间:用户离开网站时,这一部分会被删除。
\>\>session_start() //启动session变量在html标签之前
\>\>存取session变量使用\$_SESSION
使用isset\$_SESSION判定是否设定变量
使用unset(\$_SESSION)函数释放单个session变量
使用session_destoy()终止所有\$_SESSION变量(无参数)
\>mail
\>\>maili(to, subject, message, headers, parameters)
分别是(接受者, 主题, 消息内容, 副标题, 额外的参数)
\>\>简易E-mail的实现从脚本直接发送电子邮件虚拟服务器实现失败
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51941611)
[copy](http://blog.csdn.net/estom_yin/article/details/51941611)
1. \<span style="font-size:14px;"\>\<html\>
2. \<body\>
3.
4. \<?php
5. **if** (isset(\$_REQUEST['email']))
6. //if "email" is filled out, send email
7. {
8. //send email
9. \$email = \$_REQUEST['email'] ;
10. \$subject = \$_REQUEST['subject'] ;
11. \$message = \$_REQUEST['message'] ;
12. mail( "someone@example.com", "Subject: \$subject",
13. \$message, "From: \$email" );
14. echo "Thank you for using our mail form";
15. }
16. **else**
17. //if "email" is not filled out, display the form
18. {
19. echo "\<form method='post' action='mailform.php'\>
20. Email: \<input name='email' type='text' /\>\<br /\>
21. Subject: \<input name='subject' type='text' /\>\<br /\>
22. Message:\<br /\>
23. \<textarea name='message' rows='15' cols='40'\>
24. \</textarea\>\<br /\>
25. \<input type='submit' /\>
26. \</form\>";
27. }
28. ?\>
29.
30. \</body\>
31. \</html\>\</span\>
\>安全的电子邮件
电子邮件表单的风险:可能用户在输入框中注入代码
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51941611)
[copy](http://blog.csdn.net/estom_yin/article/details/51941611)
1. \<span style="font-size:14px;"\>**function** spamcheck(\$field)
2. {
3. //filter_var() sanitizes the e-mail 净化email
4. //address using FILTER_SANITIZE_EMAIL,从验证邮件中删除电子邮件的非法字符
5. \$field=filter\_var(\$field, FILTER_SANITIZE_EMAIL);
6.
7. //filter_var() validates the e-mail确定email的合法性
8. //address using FILTER_VALIDATE_EMAIL验证电子邮件地址
9. **if**(filter_var(\$field, FILTER_VALIDATE_EMAIL))
10. {
11. **return** TRUE;
12. }
13. **else**
14. {
15. **return** FALSE;
16. }
17. }\</span\>
在上一段代码之前加上这一段代码

View File

@@ -0,0 +1,526 @@
\>error错误处理
\>\>基本错误处理die("错误反馈字符串"),能终止当前脚本的执行
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. **if**(!file\_exists("welcome.txt"))
3. {
4. **die**("File not found");
5. }
6. **else**
7. {
8. \$file=fopen("welcome.txt","r");
9. }
10. ?\>\</span\>
\>\>自定义函数处理错误
\>\>错误记录
\>exception异常处理
\>\>可能的处理方式:
保存代码退出脚本执行
切换到预先定义好的异常处理函
重新执行代码或者从代码另外的位置继续执行脚本
\>\>异常的基本使用
步骤:抛出异常 - 捕获异常(对异常进行匹配) - 处理异常
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. //create function with an exception
3. **function** checkNum(\$number)
4. {
5. **if**(\$number\>1)
6. {
7. **throw** **new** Exception("Value must be 1 or below");
8. }
9. **return** true;
10. }
11.
12. //trigger exception
13. checkNum(2);
14. ?\>\</span\>
//其中使用throw new Exception("Value must be 1 or
below")抛出了异常,但没有查找到匹配模块,出现致命错误。
\>\>异常抛出的完整过程及其解释
try 异常函数位于try代码块内进行检测
throw 每一个throw对应一个catch
catch 捕获异常,创建一个包含异常信息的对象
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. //创建可抛出一个异常的函数
3. **function** checkNum(\$number)
4. {
5. **if**(\$number\>1)
6. {
7. \<span style="color:\#ff0000;"\>**throw** **new** Exception("Value must be 1
or below");//想当于创建了一个新的对象,其中“”是构造函数的参数。\</span\>
8. }
9. **return** true;
10. }
11.
12. //在 "try" 代码块中触发异常
13. try
14. {
15. checkNum(2);
16. //If the exception is thrown, this text will not be shown
17. echo 'If you see this, the number is 1 or below';
18. }
19.
20. //捕获异常
21. \<span style="color:\#ff0000;"\>catch(Exception \$e)\</span\>
22. {
23. echo 'Message: ' .\$e-\>getMessage();
24. }
25. ?\>\</span\>
26. 创建 checkNum() 函数。它检测数字是否大于 1。如果是则抛出一个异常。
27. 在 "try" 代码块中调用 checkNum() 函数。
28. checkNum() 函数中的异常被抛出
29. "catch" 代码块接收到该异常,并创建一个包含异常信息的对象 (\$e)。
30. 通过从这个 exception 对象调用 \$e-\>getMessage(),输出来自该异常的错误消息
//这里exception就是一个类的定义可以定义相应的对象然后内部有函数如gerMessage()可以返回异常信息。
\>\>自定义的exception类同样存在继承关系
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<span style="color:\#ff0000;"\>**class**
customException **extends** Exception//注意继承类的定义\</span\>
2. {
3. **public** **function** errorMessage()
4. {
5. //error message
6. \$errorMsg = 'Error on line '.\$this-\>getLine().' in '.\$this-\>getFile()
7. .': \<b\>'.\$this-\>getMessage().'\</b\> is not a valid E-Mail address';
8. **return** \$errorMsg;
9. }
10. }
11.
12. \$email = "someone@example...com";
13.
14. try
15. {
16. //check if
17. **if**(filter_var(\$email, FILTER_VALIDATE_EMAIL) === FALSE)
18. {
19. //throw exception if email is not valid
20. **throw** **new** customException(\$email);
21. }
22. }
23.
24. catch (customException \$e)
25. {
26. //display custom message
27. echo \$e-\>errorMessage();
28. }\</span\>
系统中exception类的内部函数有getLine() 、 getFile()、 getMessage
\>\>多个异常的处理
用不同的异常处理类来捕获不同的异常。
\>\>重新抛出异常
用不同的异常处理类,一个类执行时,向另一个类抛出异常。
\>\>设置顶层异常处理器
set_exception_handler()设置处理所有未捕获异常的用户定义函数
//当没有异常抛出时硬要抛出一个异常,来显示我定义了某个函数。
\>\>异常处理规则
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
- 使用多个 catch
代码块可以捕获不同种类的异常。不同的异常,就是属于不同的异常类,有多少种异常,就应该定义多少种类。
- 可以在 try 代码块内的 catch 代码块中再次抛出re-thrown异常。
**\>filter过滤器错误处理部分的过滤器没看懂**
用于过滤非安全来源的数据
验证和过滤用户输入或自定义数据是任何web应用程序的重要组成部分
设计PHP的过滤器扩展的目的是是数据过滤更轻松快捷
目的:数据类型匹配(来自外部数据和内部要求)
\>\>过滤函数
- filter_var() - 通过一个指定的过滤器来过滤单一的变量
- filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
- filter_input - 获取一个输入变量,并对它进行过滤
- filter_input_array -
获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
- filter_has_var() - 判断变量是否存在
- filter\_id()
- filter\_list()
\>\>过滤器
FILTER_CALLBACK //调用用户自定义的函数过滤数据
sanitize净化表示对检测的数据进行处理
FILTER_SANITIZE_ENCODED //去除编码的特殊符号
FILTER_SANITIZE_SPECIAL_CHARS //html转义字符ascII小于32的字符
FILTER_SANITIZE_STRING //去除标签和编码的特殊字符
FILTER_SANITIZE_EMAIL //去除非email字符
FILTER_SANITIZE_URL //去除非URL字符
FILTER_SANITIZE_NUMBER_INT //保留数字和加减号
FILTER_SANITIZE_NUMBER_FLOAT //保留浮点字符
FILTER_SANITIZE_MAGIC_QUOTERS //应用addslash不是很明白
balidate确定验证用户输入严格的格式规则
FILTER_VALIDATE_INT //确定整型
FILTER_VALIDATE_VOOLEAN//确定布尔型
FILTER_VALIDATE_FLOAT//确定浮点型
FILTER_VALIDATE\_URL//确定合法URL
FILTER_VALIDATE_EMAIL//确定邮件
FILTER_VALIDATE_IP//确定ip地址
\>\>不同的过滤器有不同的选项和标志
//所以说每次在使用前,去找本参考手册好好看看。网站上的并不全面。
//FILTER_VALIDATE_INT的参数就是一个嵌套数组
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. \$var=300;
3.
4. \$int_options = **array**(
5. "options"=\>**array**
6. (
7. "min_range"=\>0,
8. "max_range"=\>256
9. )
10. );
11.
12. **if**(!filter_var(\$var, FILTER_VALIDATE_INT, \$int_options))
13. {
14. echo("Integer is not valid");
15. }
16. **else**
17. {
18. echo("Integer is valid");
19. }
20. ?\>\</span\>
\>\>验证输入filter_input(INPUT_GET, "email",FILTER_VALIDATE_EMAIL)
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. **if**(!filter_has_var(INPUT_GET, "email"))
3. {
4. echo("Input type does not exist");
5. }
6. **else**
7. {
8. \<span style="color:\#ff0000;"\> **if** (!filter_input(INPUT_GET, "email",
FILTER_VALIDATE_EMAIL))//不是很明白INPUT_GET的意思难道是超全局变量\</span\>
9. {
10. echo "E-Mail is not valid";
11. }
12. **else**
13. {
14. echo "E-Mail is valid";
15. }
16. }
17. ?\>\</span\>
\>\>净化输入filter_input(INPUT_POST, "URL", FILTER_SANITIZE_URL)
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. **if**(!filter_has_var(INPUT_POST, "url"))
3. {
4. echo("Input type does not exist");
5. }
6. **else**
7. {
8. \$url = filter\_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
9. }
10. ?\>\</span\>
\>\>过滤多个输入
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. \$filters = **array**
3. (
4. "name" =\> **array**
5. (
6. "filter"=\>FILTER_SANITIZE_STRING
7. ),
8. "age" =\> **array**
9. (
10. "filter"=\>FILTER_VALIDATE_INT,
11. "options"=\>**array**
12. (
13. "min_range"=\>1,
14. "max_range"=\>120
15. )
16. ),
17. "email"=\> FILTER_VALIDATE_EMAIL,
18. );
19.
20. \$result = filter_input\_array(INPUT_GET, \$filters);
21.
22. **if** (!\$result["age"])
23. {
24. echo("Age must be a number between 1 and 120.\<br /\>");
25. }
26. **elseif**(!\$result["email"])
27. {
28. echo("E-Mail is not valid.\<br /\>");
29. }
30. **else**
31. {
32. echo("User input is valid");
33. }
34. ?\>\</span\>
1. 设置一个数组,其中包含了输入变量的名称,以及用于指定的输入变量的过滤器
2. 调用 filter_input_array 函数,参数包括 GET 输入变量及刚才设置的数组
3. 检测 \$result 变量中的 "age" 和 "email"
变量是否有非法的输入。(如果存在非法输入,)
\>\>使用filter callback,自定义函数过滤器
将下划线装换为空格
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51942164)
[copy](http://blog.csdn.net/estom_yin/article/details/51942164)
1. \<span style="font-size:14px;"\>\<?php
2. **function** convertSpace(\$string)
3. {
4. **return** str\_replace("_", " ", \$string);
5. }
6.
7. \$string = "Peter_is_a_great_guy!";
8.
9. echo filter\_var(\$string, FILTER_CALLBACK,
**array**("options"=\>"convertSpace"));
10. ?\>\</span\>

View File

@@ -0,0 +1,122 @@
\>多维数组的建立
\>\>对于多维数组来说,同样需要多级索引来定位元素
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920304)
[copy](http://blog.csdn.net/estom_yin/article/details/51920304)
1. **\<body\>**
2.
3. **\<?php**
4. \$cars = array
5. (
6. array("Volvo",33,20),
7. array("BMW",17,15),
8. array("Saab",5,2),
9. array("Land Rover",15,11)
10. );
11.
12. for (\$row = 0; \$row **\<** **4**; \$row++) {
13. echo "**\<p\>\<b\>**行数 \$row**\</b\>\</p\>**";
14. echo "**\<ul\>**";
15. for (\$col = 0; \$col **\<** **3**; \$col++) {
16. echo "**\<li\>**".\$cars[\$row][\$col]."**\</li\>**";
17. }
18. echo "**\</ul\>**";
19. }
20. **?\>**
21.
22. **\</body\>**
//这些代码也说明了一个问题使用php可以直接输出html格式并显示
\>日期
PHP中Date(format, timestamp)
timestamp 规定时间戳,默认是当前时间
format 规定时间格式
d月中某天
m某月
y某年
l周里某天
h带有首位零的12小时格式
i带有首位零的分钟格式
s带有首位零的秒
a小写的五千后午后
date_default_timezone_set("Asia/Shanghai")//修改时区
mktime(hour, minute, second, month, day, year)//设定时间戳
strtotime(变化时间, now开始时间)//创建日期时间
//代码实现了输出周六的日期。
使用了date的时间戳使用了灵活设定strtotime的变化时间
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920304)
[copy](http://blog.csdn.net/estom_yin/article/details/51920304)
1. **\<?php**
2. \$startdate = strtotime("Saturday");
3. \$enddate = strtotime("+6 weeks",\$startdate);
4.
5. while (\$startdate **\<** \$enddate) {
6. echo date("M d", \$startdate),"**\<br\>**";
7. \$startdate = strtotime("+1 week", \$startdate);
8. }
9. **?\>**
//代码实现了距离12月31还剩下的时间
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920304)
[copy](http://blog.csdn.net/estom_yin/article/details/51920304)
1. \<?php
2. \$d1=strtotime("December 31");
3. \$d2=ceil((\$d1-time())/60/60/24);
4. echo "距离十二月三十一日还有:" . \$d2 ." 天。";
5. ?\>

232
PHP/文件操作.md Normal file
View File

@@ -0,0 +1,232 @@
\>include
\>\>inclulde 或require 语句可以将PHP文件的内容插入另一个PHP文件
include只会生成警告并且脚本会继续执行
require会生成致命错误并停止脚本
\>\>语法:
include 'filename';
require 'filename';
\>\>注意echo语句的分割符是句点JS用加号连接
echo "\<p\>Copyright © 2006-" . date("Y") . " W3School.com.cn\</p\>"
echo 可能就是让代码实现了动态化的输出,而不是静态的。
\>文件操做
\>\>readfile()
语法redafile("webdictionary.txt");
其他文件的操做的函数请参考http://www.w3school.com.cn/php/php_ref_filesystem.asp
\>文件的打开、读取、修改
\>\>fopen("filename", "openmode");
openmode =
> r (read)只读,文件指针在开头
> w(write)只写,文件指针在开头;清空原有文件内容,或新建一个文件
> a(append)只写,文件指针在末尾,如果文件不存在,创建文件
> x只写创建新文件指针在开头
> r+读写,文件指针在开头
> w+读写,删除文件内容或创建文件
> a+读写,数据保留,数据保留了
> x+创建文件
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
1. \<span style="font-size:14px;"\>\<?php
2. \$myfile = fopen("webdictionary.txt", "r") **or** **die**("Unable to open
file!");
3. echo fread(\$myfile,filesize("webdictionary.txt"));
4. fclose(\$myfile);
5. ?\>\</span\>
\>\>fclose("filename");
\>\>fread(\$文件变量); // 读取打开的文件
\>\>fgets(\$文件变量); //从文件中读取单行,取完单行后文件指针会自动跳转到下一行
\>\>feof(\$文件变量); //检查文件是否已经结束
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
1. \<span style="font-size:14px;"\>\<?php
2. \$myfile = fopen("webdictionary.txt", "r") **or** **die**("Unable to open
file!");
3. // 输出单行直到 end-of-file
4. **while**(!feof(\$myfile)) {
5. echo fgets(\$myfile) . "\<br\>";
6. }
7. fclose(\$myfile);
8. ?\>\</span\>
\>\>fgetc() //读取单个字符,调用函数后,文件指针会移动到下一个字符
\>文件的创建和写入
\>\>fwrite(\$文件变量,\$字符串变量)
//作用就是将字符串变量写入相应的文件,写完后,文件指针只想文章末尾
\>文件的上传
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
1. \<span style="font-size:14px;"\>\<html\>
2. \<body\>
3.
4. \<form action="upload_file.php" method="post"
5. enctype="multipart/form-data"\>
6. \<label **for**="file"\>Filename:\</label\>
7. \<input type="file" name="file" id="file" /\>
8. \<br /\>
9. \<input type="submit" name="submit" value="Submit" /\>
10. \</form\>
11.
12. \</body\>
13. \</html\>\</span\>
\>\>\<form\>的enctype属性规定了提交表单的类型。二进制数据类型的表达enctype =
“multipart/form-data”
action = 处理文件上传操作所用的PHP文件
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
1. \<span style="font-size:14px;"\>\<?php
2. **if** (\$_FILES["file"]["error"] \> 0)
3. {
4. echo "Error: " . \$_FILES["file"]["error"] . "\<br /\>";
5. }
6. **else**
7. {
8. echo "Upload: " . \$_FILES["file"]["name"] . "\<br /\>";
9. echo "Type: " . \$_FILES["file"]["type"] . "\<br /\>";
10. echo "Size: " . (\$_FILES["file"]["size"] / 1024) . " Kb\<br /\>";
11. echo "Stored in: " . \$_FILES["file"]["tmp_name"];
12. }
13. ?\>\</span\>
\$_FILES["file"]["属性名称"]从客户的计算机上获取信息。
- \$_FILES["file"]["name"] - 被上传文件的名称
- \$_FILES["file"]["type"] - 被上传文件的类型
- \$_FILES["file"]["size"] - 被上传文件的大小,以字节计
- \$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
- \$_FILES["file"]["error"] - 由文件上传导致的错误代码
\>\>上传限制
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51920555)
[copy](http://blog.csdn.net/estom_yin/article/details/51920555)
1. \<span style="font-size:14px;"\>\<?php
2.
3. **if** (((\$_FILES["file"]["type"] == "image/gif")
4. \|\| (\$_FILES["file"]["type"] == "image/jpeg")
5. \|\| (\$_FILES["file"]["type"] == "image/pjpeg"))
6. && (\$_FILES["file"]["size"] \< 20000))
7. {
8. **if** (\$_FILES["file"]["error"] \> 0)
9. {
10. echo "Error: " . \$_FILES["file"]["error"] . "\<br /\>";
11. }
12. **else**
13. {
14. echo "Upload: " . \$_FILES["file"]["name"] . "\<br /\>";
15. echo "Type: " . \$_FILES["file"]["type"] . "\<br /\>";
16. echo "Size: " . (\$_FILES["file"]["size"] / 1024) . " Kb\<br /\>";
17. echo "Stored in: " . \$_FILES["file"]["tmp_name"];
18. }
19. }
20. **else**
21. {
22. echo "Invalid file";
23. }
24.
25. ?\>\</span\>
规定了只能上传jpeg 和pjpeg的文件使用ifelse和全局变量。

View File

@@ -0,0 +1,359 @@
\>PHPHTML与表单
\>\>表单的实现
> \<form action = "welcom.php" method = "post"\>
> name:\<input type = "text" name = "name"\>\<br\>
> E-mail:\<input type = "text" name "email"\>\<br\>
> \</form\>
\>\>分析action指明了表单数据会发送到welcome.php进行处理。
method指明了发送方式为post
\>\>.php对表单的处理
> \<body\>
> welcome
> \<?php
> echo \$_POST["name"];?\>
> \<br\>
> Your email address is:
> \<?php
> echo \$_POST["email"];
> ?\>
> \</body\>
\>\>get和post的理解
> 二者都是创建了数组,包含键/值对,键是表单控件的名称,值来源于用户输入的数据
> 创建的数组被赋值给超全局变量\$_GET和\$_POST
> \$_GET通过URL参数传递到当前脚本的变量数组对任何人可见不超过2000个字符
> \$_POST通过http post传递到当脚本的变量数组对其他人不可见传输量没有要求
\>表单验证
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919136)
[copy](http://blog.csdn.net/estom_yin/article/details/51919136)
1. \<body\>
2.
3. \<?php
4. // define variables and set to empty values
5. \$name = \$email = \$gender = \$comment = \$website = "";
6.
7. **if** (\$_SERVER["REQUEST_METHOD"] == "POST") {
8. \$name = test_input(\$_POST["name"]);
9. \$email = test_input(\$_POST["email"]);
10. \$website = test_input(\$_POST["website"]);
11. \$comment = test_input(\$_POST["comment"]);
12. \$gender = test_input(\$_POST["gender"]);
13. }
14.
15. **function** test_input(\$data) {
16. \$data = trim(\$data);
17. \$data = stripslashes(\$data);
18. \$data = htmlspecialchars(\$data);
19. **return** \$data;
20. }
21. ?\>
22.
23. \<h2\>PHP 验证实例\</h2\>
24. \<form method="post" action="\<?php echo
htmlspecialchars(\$_SERVER["PHP_SELF"]);?\>"\>
25. 姓名:\<input type="text" name="name"\>
26. \<br\>\<br\>
27. 电邮:\<input type="text" name="email"\>
28. \<br\>\<br\>
29. 网址:\<input type="text" name="website"\>
30. \<br\>\<br\>
31. 评论:\<textarea name="comment" rows="5" cols="40"\>\</textarea\>
32. \<br\>\<br\>
33. 性别:
34. \<input type="radio" name="gender" value="female"\>女性
35. \<input type="radio" name="gender" value="male"\>男性
36. \<br\>\<br\>
37. \<input type="submit" name="submit" value="提交"\>
38. \</form\>
39.
40. \<?php
41. echo "\<h2\>您的输入:\</h2\>";
42. echo \$name;
43. echo "\<br\>";
44. echo \$email;
45. echo "\<br\>";
46. echo \$website;
47. echo "\<br\>";
48. echo \$comment;
49. echo "\<br\>";
50. echo \$gender;
51. ?\>
52.
53. \</body\>
\>\>总结:
> 有value属性的返回name和value属性没有的返回name和用户输入的字段
> action="\<?php echo htmlspecialchars(\$_SERVER["PHP_SELF"];?\>)\>"
> \$_SERVER["PHP_SELF"]返回当前执行脚本的文件名即本章php文件
> htmlspecialchars()这个函数将返回的文件名转换为html实体也就是只能在html作为文本出现将\<作为转义字符传给html
\>\>trim()函数,去除用户中输入数据中不必要的字符(空格、制表符、换行符)
> stripslashes()函数,删除用户输入的反斜杠
\>\>
\$_SERVER["REQUEST_METHOD"]变量可以检测表单是否提交,若提交,进行处理;若没有提交,则返回空表单。
\>表单必填
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919136)
[copy](http://blog.csdn.net/estom_yin/article/details/51919136)
1. \<body\>
2.
3. \<?php
4. // 定义变量并设置为空值
5. \$nameErr = \$emailErr = \$genderErr = \$websiteErr = "";
6. \$name = \$email = \$gender = \$comment = \$website = "";
7.
8. **if** (\$_SERVER["REQUEST_METHOD"] == "POST") {
9. **if** (empty(\$_POST["name"])) {
10. \$nameErr = "姓名是必填的";
11. } **else** {
12. \$name = test_input(\$_POST["name"]);
13. }
14.
15. **if** (empty(\$_POST["email"])) {
16. \$emailErr = "电邮是必填的";
17. } **else** {
18. \$email = test_input(\$_POST["email"]);
19. }
20.
21. **if** (empty(\$_POST["website"])) {
22. \$website = "";
23. } **else** {
24. \$website = test_input(\$_POST["website"]);
25. }
26.
27. **if** (empty(\$_POST["comment"])) {
28. \$comment = "";
29. } **else** {
30. \$comment = test_input(\$_POST["comment"]);
31. }
32.
33. **if** (empty(\$_POST["gender"])) {
34. \$genderErr = "性别是必选的";
35. } **else** {
36. \$gender = test_input(\$_POST["gender"]);
37. }
38. }
39.
40. **function** test_input(\$data) {
41. \$data = trim(\$data);
42. \$data = stripslashes(\$data);
43. \$data = htmlspecialchars(\$data);
44. **return** \$data;
45. }
46. ?\>
47.
48. \<h2\>PHP 验证实例\</h2\>
49. \<p\>\<span **class**="error"\>\* 必需的字段\</span\>\</p\>
50. \<form method="post" action="\<?php echo
htmlspecialchars(\$_SERVER["PHP_SELF"]);?\>"\>
51. 姓名:\<input type="text" name="name"\>
52. \<span **class**="error"\>\* \<?php echo \$nameErr;?\>\</span\>
53. \<br\>\<br\>
54. 电邮:\<input type="text" name="email"\>
55. \<span **class**="error"\>\* \<?php echo \$emailErr;?\>\</span\>
56. \<br\>\<br\>
57. 网址:\<input type="text" name="website"\>
58. \<span **class**="error"\>\<?php echo \$websiteErr;?\>\</span\>
59. \<br\>\<br\>
60. 评论:\<textarea name="comment" rows="5" cols="40"\>\</textarea\>
61. \<br\>\<br\>
62. 性别:
63. \<input type="radio" name="gender" value="female"\>女性
64. \<input type="radio" name="gender" value="male"\>男性
65. \<span **class**="error"\>\* \<?php echo \$genderErr;?\>\</span\>
66. \<br\>\<br\>
67. \<input type="submit" name="submit" value="提交"\>
68. \</form\>
69.
70. \<?php
71. echo "\<h2\>您的输入:\</h2\>";
72. echo \$name;
73. echo "\<br\>";
74. echo \$email;
75. echo "\<br\>";
76. echo \$website;
77. echo "\<br\>";
78. echo \$comment;
79. echo "\<br\>";
80. echo \$gender;
81. ?\>
82.
83. \</body\>
\>\>解释:
定义了新的变量储存错误信息\$nameErr = \$emailErr = \$genderErr = \$websiteErr =
""
当必选框输入的信息为空时,错误信息变量会被赋值为错误信息,否则为空
在表单中每个数据项后都添加了一个php脚本用于执行错误信息的输出从一开始就被执行了只是变量值为空。
最后,在表单最后输出用户已经输入的表单项

View File

@@ -0,0 +1,243 @@
\>PHP验证名字
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
1. \$name = test_input(\$_POST["name"]);
2. **if** (!preg\_match("/\^[a-zA-Z ]\*\$/",\$name)) {
3. \$nameErr = "只允许字母和空格!";
4. }
preg_match()检索匹配,正则表达式(有待详解)
\>PHP验证E-mail
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
1. \$email = test_input(\$_POST["email"]);
2. **if** (!preg\_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",\$email)) {
3. \$emailErr = "无效的 email 格式!";
4. }
\>验证URL
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
1. \$website = test_input(\$_POST["website"]);
2. **if**
(!preg\_match("/\\b(?:(?:https?\|ftp):\\/\\/\|www\\.)[-a-z0-9+&@\#\\/%?=\~_\|!:,.;]\*[-a-z0-9+&@\#\\/%
3. =\~_\|]/i",\$website)) {
4. \$websiteErr = "无效的 URL";
5. }
\>实例执行
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51919984)
[copy](http://blog.csdn.net/estom_yin/article/details/51919984)
1. \<body\>
2.
3. \<?php
4. // 定义变量并设置为空值
5. \$nameErr = \$emailErr = \$genderErr = \$websiteErr = "";
6. \$name = \$email = \$gender = \$comment = \$website = "";
7.
8. **if** (\$_SERVER["REQUEST_METHOD"] == "POST") {
9. **if** (empty(\$_POST["name"])) {
10. \$nameErr = "姓名是必填的";
11. } **else** {
12. \$name = test_input(\$_POST["name"]);
13. // 检查姓名是否包含字母和空白字符
14. **if** (!preg\_match("/\^[a-zA-Z ]\*\$/",\$name)) {
15. \$nameErr = "只允许字母和空格";
16. }
17. }
18.
19. **if** (empty(\$_POST["email"])) {
20. \$emailErr = "电邮是必填的";
21. } **else** {
22. \$email = test_input(\$_POST["email"]);
23. // 检查电子邮件地址语法是否有效
24. **if** (!preg\_match("/([\\w\\-]+\\@[\\w\\-]+\\.[\\w\\-]+)/",\$email)) {
25. \$emailErr = "无效的 email 格式";
26. }
27. }
28.
29. **if** (empty(\$_POST["website"])) {
30. \$website = "";
31. } **else** {
32. \$website = test_input(\$_POST["website"]);
33. // 检查 URL 地址语法是否有效(正则表达式也允许 URL 中的斜杠)
34. **if**
(!preg\_match("/\\b(?:(?:https?\|ftp):\\/\\/\|www\\.)[-a-z0-9+&@\#\\/%?=\~_\|!:,.;]\*[-a-z0-9+&@\#\\/%=\~_\|]/i",\$website))
{
35. \$websiteErr = "无效的 URL";
36. }
37. }
38.
39. **if** (empty(\$_POST["comment"])) {
40. \$comment = "";
41. } **else** {
42. \$comment = test_input(\$_POST["comment"]);
43. }
44.
45. **if** (empty(\$_POST["gender"])) {
46. \$genderErr = "性别是必选的";
47. } **else** {
48. \$gender = test_input(\$_POST["gender"]);
49. }
50. }
51.
52. **function** test_input(\$data) {
53. \$data = trim(\$data);
54. \$data = stripslashes(\$data);
55. \$data = htmlspecialchars(\$data);
56. **return** \$data;
57. }
58. ?\>
59.
60. \<h2\>PHP 验证实例\</h2\>
61. \<p\>\<span **class**="error"\>\* 必需的字段\</span\>\</p\>
62. \<form method="post" action="\<?php echo
htmlspecialchars(\$_SERVER["PHP_SELF"]);?\>"\>
63. 姓名:\<input type="text" name="name"\>
64. \<span **class**="error"\>\* \<?php echo \$nameErr;?\>\</span\>
65. \<br\>\<br\>
66. 电邮:\<input type="text" name="email"\>
67. \<span **class**="error"\>\* \<?php echo \$emailErr;?\>\</span\>
68. \<br\>\<br\>
69. 网址:\<input type="text" name="website"\>
70. \<span **class**="error"\>\<?php echo \$websiteErr;?\>\</span\>
71. \<br\>\<br\>
72. 评论:\<textarea name="comment" rows="5" cols="40"\>\</textarea\>
73. \<br\>\<br\>
74. 性别:
75. \<input type="radio" name="gender" value="female"\>女性
76. \<input type="radio" name="gender" value="male"\>男性
77. \<span **class**="error"\>\* \<?php echo \$genderErr;?\>\</span\>
78. \<br\>\<br\>
79. \<input type="submit" name="submit" value="提交"\>
80. \</form\>
81.
82. \<?php
83. echo "\<h2\>您的输入:\</h2\>";
84. echo \$name;
85. echo "\<br\>";
86. echo \$email;
87. echo "\<br\>";
88. echo \$website;
89. echo "\<br\>";
90. echo \$comment;
91. echo "\<br\>";
92. echo \$gender;
93. ?\>
94.
95. \</body\>
//摘自w3school

View File

@@ -0,0 +1,141 @@
\>基本语法
\>\>脚本格式:
> \<?php
> //this is coded by php
> ?\>
\>\>注意事项
- php文件的扩展名是“.php”
- php文件包括html标签和php脚本代码
- 表示php句尾
- //或\#或/\*.....\*/表示php的注释
- php中用户自定义的函数、类和关键词等都对大小写不敏感但是变量名对大小写敏感
\>\>php 能做到什么
- 生成动态页面
- 创建打开读取写入删除关闭服务器上的文件
- 接受表单数据
- 能够发送并取回cookies
- 添加、删除、修改数据库中的数据
- 限制用户访问某些页面
- 对数据进行加密
- 通过PHP输出HTML、图像、PDF、flash。
\>变量
\>\>作用:存储数据的容器
\>\>格式:以\$开头,变量名以字母或下划线开始,对大小写敏感,不必说明类型
\>\>实例:
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51909873)
[copy](http://blog.csdn.net/estom_yin/article/details/51909873)
1. **\<?php**
2. \$txt="Hello world!";
3. \$x=5;
4. \$y=10.5;
5. **?\>**
\>\>变量的作用域:
> local局部变量在函数内部的变量只能在函数内部进行访问。
> global全局变量在函数外部的变量只能在函数内部进行访问。
\>\>global关键词
> 用于访问函数内部的全局变量。是函数内部的局部变量在全局作用域中存在。
> 方法一将函数内部的全局变量声明为global
> 方法二使用global[ ]数组,其中存有所有的全局变量,下标就是全局变量的名字。
\>\>static 静态变量
> 作用当函数执行完成后会删除所有的变量。将变量声明为static时会保留某个局部静态变量在函数执行完成互殴
> 不被删除。
\>Echo/Print 输出
\>\>两个输出都是以字符串的形式然后输出到html界面中区属于html的语言会被识别属于PHP的变量也会被识别
echo - 只能输出\>= 1 的个数的字符串
print - 只能输出一个字符串并返回1
\>php的数据类型
\>\>字符串单引号和双引号效果相同“hello world!”
\>\>整数至少包括一个数字可以使用八进制o十六进制ox)输入输出
\>\>浮点数var_dump()会返回变量的数据类型(数据长度)和值
\>\>逻辑布尔型变量true或false
\>\>数组:\$car = array("Volvo", "BMW", "SAAB");
\>\>对象使用class声明对象的类类中包含属性和方法与C++中的class同
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51909873)
[copy](http://blog.csdn.net/estom_yin/article/details/51909873)
1. **\<?php**
2. class Car
3. {
4. var \$color;
5. function Car(\$color="green") {
6. \$this-**\>**color = \$color;
7. }
8. function what\_color() {
9. return \$this-**\>**color;
10. }
11. }
12. **?\>**
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51909873)
[copy](http://blog.csdn.net/estom_yin/article/details/51909873)
1. **\<pre** style="font-family: 'Courier New', monospace; font-size:
13px;"**\>\<code** class="phpcode" style="font-family: 'Courier New',
monospace; color: rgb(255, 0, 0);"**\>**\$x = new Car("white");**\</code\>**
//是新的对象Car是类white是构造函数的参数
\>\>NULL
是一种数据类型,也是一个数据的值

View File

@@ -0,0 +1,35 @@
\>字符串函数
\>\>strlen("字符串")//返回字符串的长度
\>\>strpos("hello world", "world");//检索字符串内指定的子串,返回位置。
更多的PHP字符串函数请点击这里
\>PHP常量
\>\>使用define“GREETING”, "Welcome to W3School.com.cn!",true/false函数;
> 第一个参数是常量的名称第二个参数敞亮的值第三个参数是否对大小写敏感false是敏感
\>运算符
\>\>基本运算:+ - \* / %
\>\>赋值运算:= += -= \*= /= %=
\>\>字符串运算:. 串接 .=串接后复制
\>\>递增递减运算符:++\$x \$x++ --\$x \$x--
\>\>比较运算符:
> == 等于 数值相等返回true
> ===全等 数值相等且类型相同返回true
> !=或\<\>不等于数值不等
> !==不全等 数值不等他们类型不同
> \> \>= \< \<=

View File

@@ -0,0 +1,41 @@
\>if-else
\>\>if 语句
> if (条件){条件为true执行代码}
\>\>if-else
> if (条件){条件为true执行代码}
> else{条件为false执行代码}
\>\>if-elseif-else
> if (条件){条件为true执行代码}
> elseif (条件){条件为true时执行代码}
> else{条件为false执行代码}
\>switch语句
\>\>switch(expression){
> case label1: execute code;break;
> case label2:execute code;break;
> default: execute code;break;
}
\>循环
\>\>while(condition){coding;} 指定条件为真,执行代码块;
\>\>do {coding} while{condition}执行到条件为假
\>\>for (init counter; test counter; increment counter){coding}同C++
\>\>foreach (\$array as \$value){遍历数组中的每一个键}同python

View File

@@ -0,0 +1,239 @@
\>函数定义
> function 函数名(参数列表){
> 函数体;
> }
//函数名对大小写不敏感
//参数列表函数体返回值原理同C++同样
\>数组的实现
\>\>定义:\$cars = array("volvo", "BMW", "SAAB");
//这里用array函数创建数组但是JS是用new创建array类的对象而python中对应的list本身就是一个类的对象。
\>\>数组分类
- 索引数组:带有数字索引的数组
\$cars=array("Volvo","BMW","SAAB");
- 关联数组:带有制定键的数组
\$age=array("Peter"=\>"35","Ben"=\>"37","Joe"=\>"43");
- 多维数组:包含一个或多个数组的数组
echo count(数组变量)返回数组长度
遍历关联数组
**[html]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
1. **\<?php**
2. \$age=array("Bill"=**\>**"35","Steve"=**\>**"37","Peter"=**\>**"43");
3.
4. foreach(\$age as \$x=**\>**\$x_value) {
5. echo "Key=" . \$x . ", Value=" . \$x_value;
6. echo "**\<br\>**";
7. }
8. **?\>**
\>数组排序
- sort() - 以升序对数组排序
- rsort() - 以降序对数组排序
- asort() - 根据值,以升序对关联数组进行排序
- ksort() - 根据键,以升序对关联数组进行排序
- arsort() - 根据值,以降序对关联数组进行排序
- krsort() - 根据键,以降序对关联数组进行排序
\>超全局
- \$GLOBALS——在\$globals[index]中存储了所有的全局变量,变量名字就是数组的键。
- \$_SERVER——保存了关于爆头路径和脚本位置的信息
- \$_REQUEST——收集input表单提交的信息值
- \$_POST
- \$_GET
- \$_FILES
- \$_ENV
- \$_COOKIE
- \$_SESSION
\>\>\$_SERVER的配置信息
| 元素/代码 | 描述 |
|----------------------------------|--------------------------------------------------------------------|
| \$_SERVER['PHP_SELF'] | 返回当前执行脚本的文件名。 |
| \$_SERVER['GATEWAY_INTERFACE'] | 返回服务器使用的 CGI 规范的版本。 |
| \$_SERVER['SERVER_ADDR'] | 返回当前运行脚本所在的服务器的 IP 地址。 |
| \$_SERVER['SERVER_NAME'] | 返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn。 |
| \$_SERVER['SERVER_SOFTWARE'] | 返回服务器标识字符串(比如 Apache/2.2.24)。 |
| \$_SERVER['SERVER_PROTOCOL'] | 返回请求页面时通信协议的名称和版本例如“HTTP/1.0”)。 |
| \$_SERVER['REQUEST_METHOD'] | 返回访问页面使用的请求方法(例如 POST。 |
| \$_SERVER['REQUEST_TIME'] | 返回请求开始时的时间戳(例如 1577687494。 |
| \$_SERVER['QUERY_STRING'] | 返回查询字符串,如果是通过查询字符串访问此页面。 |
| \$_SERVER['HTTP_ACCEPT'] | 返回来自当前请求的请求头。 |
| \$_SERVER['HTTP_ACCEPT_CHARSET'] | 返回来自当前请求的 Accept_Charset 头( 例如 utf-8,ISO-8859-1 |
| \$_SERVER['HTTP_HOST'] | 返回来自当前请求的 Host 头。 |
| \$_SERVER['HTTP_REFERER'] | 返回当前页面的完整 URL不可靠因为不是所有用户代理都支持。 |
| \$_SERVER['HTTPS'] | 是否通过安全 HTTP 协议查询脚本。 |
| \$_SERVER['REMOTE_ADDR'] | 返回浏览当前页面的用户的 IP 地址。 |
| \$_SERVER['REMOTE_HOST'] | 返回浏览当前页面的用户的主机名。 |
| \$_SERVER['REMOTE_PORT'] | 返回用户机器上连接到 Web 服务器所使用的端口号。 |
| \$_SERVER['SCRIPT_FILENAME'] | 返回当前执行脚本的绝对路径。 |
| \$_SERVER['SERVER_ADMIN'] | 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。 |
| \$_SERVER['SERVER_PORT'] | Web 服务器使用的端口。默认值为 “80”。 |
| \$_SERVER['SERVER_SIGNATURE'] | 返回服务器版本和虚拟主机名。 |
| \$_SERVER['PATH_TRANSLATED'] | 当前脚本所在文件系统(非文档根目录)的基本路径。 |
| \$_SERVER['SCRIPT_NAME'] | 返回当前脚本的路径。 |
| \$_SERVER['SCRIPT_URI'] | 返回当前页面的 URI。 |
转自[w3school.com](http://www.w3school.com.cn/php/php_superglobals.asp)
\>\>\$_REQUEST的访问
> 使用PHP表单完美的完成了接受数据并反馈信息。
> method 指定了传递方法action指定了传递的文件
> 接受的信息的名字作为键值KEY输入内容作为值形成关联数组然后可以通过\$_REQUEST['KEY']对输入的值进行访问。
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
1. \<!DOCTYPE html\>
2. \<html\>
3. \<body\>
4.
5. \<form method="post" action="\<?php echo \$_SERVER['PHP_SELF'];?\>"\>
6. Name: \<input type="text" name="fname"\>
7. \<input type="submit"\>
8. \</form\>
9.
10. \<?php
11. \$name = \$_REQUEST['fname'];
12. echo \$name;
13. ?\>
14.
15. \</body\>
16. \</html\>
\>\>\$_POST
> 使用post收集通过post方法构建的表单
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
1. \<html\>
2. \<body\>
3.
4. \<form method="post" action="\<?php echo \$_SERVER['PHP_SELF'];?\>"\>
5. Name: \<input type="text" name="fname"\>
6. \<input type="submit"\>
7. \</form\>
8.
9. \<?php
10. \$name = \$_POST['fname'];
11. echo \$name;
12. ?\>
13.
14. \</body\>
15. \</html\>
\>\>\$_GET
> 通过这个超全局变量可以收集URL中发送的数据
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
1. \<html\>
2. \<body\>
3.
4. \<a href="test_get.php?subject=PHP&web=W3school.com.cn"\>测试 \$GET\</a\>
5.
6. \</body\>
7. \</html\>
**[php]** [view plain](http://blog.csdn.net/estom_yin/article/details/51912161)
[copy](http://blog.csdn.net/estom_yin/article/details/51912161)
1. \<html\>
2. \<body\>
3.
4. \<?php
5. echo "Study " . \$_GET['subject'] . " at " . \$_GET['web'];
6. ?\>
7.
8. \</body\>
9. \</html\>