推荐:php mysql
此文记录自己学习PHP和mySQL的过程。之前在网上简单地学习了一下这两门语言,并且自己编写了PHP,可以正常连接mySQL,也可以插入数据。但是自己总觉得还是不太清晰。所以借了本O'REILLY的PHP,MySQL,JavaScript, & CSS。希望能够理清一下编程思路,学得更加通透些,对自己以后编写项目有所帮助。
首先,来了解一下,这几门语言主要负责些什么。PHP是负责主要的在服务器上的工作,MySQL是负责所有的数据,CSS和JavaScript则是管理网页的展现。然而JavaScript也能与PHP进行通信,无论什么时候需要更新一些服务器上的或是页面上的信息。
PHP是相对松散的语言。也就是它的变量类型不需要在使用前被声明。字符串内的数字可以被自动转换为数字类型。
PHP是用 ‘$' 来定义变量的。比如:$ my_counter = 1;
使用空格(whitespace)让代码变得更加整洁清晰,当自己回头再去查看的时候也比较容易理解。同时也帮助其他的开发人员去维护你的代码。如果需要声明一个数字变量,无论是Int类型还是Float类型都可以直接声明。
例如:$ count = 17;$ count = 17.5;
1. 以字母开始或 ‘_’(underscore);
2. 只能包含a-z, A-Z, 0-9 和 ‘_’ (underscore);
3. 不能包含空格,如果一定包含两个单词,一定用 ‘_’ (underscore)来分开;
4. 对大小写是sensitive的,$High_Score与$high_score是不同的变量。
1. 声明一个常量不需要用($),一般以字符或下划线开头
2. 只能用define方法来赋值给常量 define ( 'TIREPRICE' , 100 ) ;
3. 在脚本中无法改变该值。
4. 与变量不同,常量贯穿整个脚本是自动全局的。
5. 尽量不要前后都使用(_)来起变量名。
设置常量,使用 define() 函数 - 它使用三个参数:
首个参数定义常量的名称 第二个参数定义常量值 可选的第三个参数规定常量名是否对大小写不敏感。默认是 false。
简短风格 short style : $tireqty 非常方便,但是需要将register_globals配置选项置为on,由于安全性原因,该选项默认为off。
中等风格 Medium style: $_POST[ ' tireqty ' ] 推荐使用
冗长风格 Long style $HTTP_POST_VARS[ ' tireqty' ] 已经被弃用
我们通常建议使用中等风格来声明变量。如果你建立一个简短风格,然后把中等风格赋值给它没有安全问题,反而更容易被使用。$tireqty = $_POST [ 'tireqty' ] ;
单引号是不会把文字里中以$开头的字符串作为变量的。如果要把它当做变量来看待那就需要用双引号。如果字符串内要使用单引号的话,不能直接使用,这个和JavaScript一样。需要转义字符用“\”来解决单引号问题。此外,\t,\n,\r在双引号里才有效。
PHP还提供了多行数列的操作符“<<<”,优点是输出大段HTML方便,不需要转义,而且可以引用变量。“<<<”之后跟随任意你自己喜欢的名字(自定义分界符),并以此未结束。之间文字打回车不会被显示。里面的变量将可以使用,如果不需要出现变量可以用 “.”来连接。此时就不会被解读为变量了,而是正常输出。
在使用(<<<)时,还需注意的一点是,标识符结束符串(如:END)需要独占一行,前后都不许再有内容包括空格,否则这个PHP文件就相当于废了。
这两个命令是十分相似的。但是print是一个函数方法需要用到一个参数,然而echo是PHP语言的结构。在普通的文字输出上,echo要比print稍微快一点,因为它不是一个函数不需要设置一个返回值。同时,因为echo它不是一个函数,所以不能被用于大量复杂的表达式,但是print却可以。
Function是用来区分出为了实现不同特殊功能的代码。比如这个代码打印三行字,但是如果我要打印十几个的话,就需要不停复制黏贴这些代码,无疑是让代码变得更为复杂和庞大。但是用了function就只需要使用一次函数就可以打印十几次。它是代码变得更简洁并且可读性更高。声明function的方式与JavaScript一样。
比如:
function longdate($timestamp){
return date("l F jS Y",$timestamp);
}
PHP的变量作用域(Variable Scope)
在PHP语言中,你可以决定变量的作用域,比如,只在函数里面使用,或者是全域范围的,任何范围都能被使用。
Local Variables(本地变量)是指变量被建立只被允许在函数中调用。它是零时性的储存,一旦函数完成也就不存在了。
Global Variables(全局变量)有些时候我们也需要全局变量,因为你希望你所有的代码都能调用到它。当需要声明全局变量时,我们需要使用关键字global。不建议使用全局变量,实在没有其他方法时,可以使用。因为一般程序是被打碎成多个小零件,这样数据发生问题也是一些小问题容易被维护。但是如果上千行的代码程序被发现你的全局变量出现了问题。那么将需要花非常大的精力与时间去维护它。同时,建议在为全局变量起名时,最好使用大写字母。
Static Variables(静态变量)当你使用一个变量希望它只能在函数中被调用,但是你也希望它能再下一次使用这个函数时,值不会被恢复到原来的值。这时我们就需要用到静态变量。同时需要注意的是,静态变量不能给予一个计算公式或者函数,必须赋一个实际的值。
比如:
static $int = 0; //Allowed
static $int = 1+2; //Disallowed (will produce a Parse error)
static $int = sqrt(144); //Disallowed
Superglobal Variables(超级全局变量)PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。
这些超全局变量是:
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
这些超级全局变量名都是使用_下划线和大写字母,所以在起名时应该避免重复以造成程序混乱。
布尔表达式,值得注意的一点是,在PHP中,TRUE的值为“1”,而FALSE的值为NULL,或者是空值。因为在一些语言里FALSE被定义为0或者-1。
此外,PHP会按照字面上的值(literals)理解去判断变量类型。
比如:
$myname = "Brian";
$myage = 37;
echo "a: " . 73 . "
"; //Numeric literalecho "b: " . "Hello" . "
"; //String literalecho "c: " . FALSE . "
"; //Constant literalecho "d: " . $myname . "
"; //Variable string literalecho "e: " . $myage . "
"; //Variable numeric literal结果是:
a: 73 b: Hello c: d: Brian e: 37
PHP运算符(operators)
PHP提供了大量有用的运算符,比如计算,字符串和逻辑的运算符。“.”运算符用来连接字符串。
PHP 逻辑运算符(logical)
“or”返回值是布尔值。如果 $x 和 $y 至少有一个为 true,则返回 true。
“xor”返回值是布尔值。条件中不是A就是B。如果A就返回True,如果是B也返回True。但如果是A和B就返回False,如果即不是A也不是B就返回False。所以条件符合的有且仅有一个为 true,则返回 true。
PHP 结合性运算符(associativity)
这类型的运算符是从右到左计算。
Operator Description Example
NEW Create a new object
! Logical NOT
~ Bitwise NOT
++ -- Increment and decrement
+ - Unary plus and negation
(int) Cast to an integer $c = (int) ($a / $b);
(double) Cast to a float
(string) Cast to a string
(array) Cast to an array
(object) Cast to an object
@ Inhibit error reporting
@是为了抑制错误显示,让用户看不到,提升用户体验。注意:只是抑制错误,但是错误还是存在的。
= Assignment
PHP条件表达式(Conditionals)
条件表达式是动态页面的核心,它能够简单地根据不同的条件创造出不同的页面结果。有三种表达方法:if,switch和?(三目运算符)。这个和JavaScript都是一样的。
PHP循环(Looping)
能快速地周而复始地工作直到事情发生为止。循环方式有:while,do……while和for。
PHP的函数与对象
函数的好处:
1. 简洁
2. 减少语法和其他编写程序的错误
3. 减少程序文件的加载时间
4. 同时减少执行时间,因为每一个函数都仅仅被解析一次,无论它将被调用多少次。
5. 函数接受参数,这样能够被普遍使用,也同时能被特殊的情况使用。
PHP有上百种已经编写好的函数,使它成为一个丰富的语言。
Include和require
require()的性能与include()相类似,都是包括并运行指定文件。不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估;而对于require()来说,文件只处理一次。这就意味着如果可能执行多次的代码,则使用require()效率比较高。另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句。
require的使用方法如:require("myfile.php"),这个语句通常放在PHP脚本程序的最前面。PHP程序在执行前,就会先读入require()语句所引入的文件,使它变成PHP脚本文件的一部分。include使用方法和require一样如:include("myfile.php"),而这个语句一般是放在流程控制的处理区段中。PHP脚本文件在读到include()语句时,才将它包含的文件读取进来。这种方式,可以把程式执行时的流程简单化。
include在用到时加载 require在一开始就加载
include/require_once后缀表示已加载的不加载
PHP系统在加载PHP程序时有一个伪编译过程,可使程序运行速度加快。但include的文档仍为解释执行。include的文件中出错了,主程序继续往下执行,require的文件出错了,主程序也停了,所以包含的文件出错对系统影响不大的话(如界页面文件)就用include,否则用require。
require()和include()语句是语言结构,不是真正的函数,可以像php中其他的语言结构一样,例如echo()可以使用echo("ab")形式,也可以使用echo "abc"形式输出字符串abc。require()和include()语句也可以不加圆括号而直接加参数。
include_once()和require_once()语句也是在脚本执行期间包括运行指定文件。此行为和include()语句及require()类似,使用方法也一样。唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。这两个语句应该用于在脚本执行期间,同一个文件有可能被包括超过一次的情况下,确保它只被包括一次,以避免函数重定义以及变量重新赋值等问题。
function_exists("function name")是判断这个函数是否有效。
对象Object
面对对象(object-oriented programming OOP)让函数提升到新的水平。当一些方法要被重用,那么就可以考虑把这些方法和数据放入到对象中去。一起想想看一个社交网站,它有很多部分组成。一个组成部分是要管理所有的用户函数。比如让新用户注册,和让存在的用户更改他们的信息。一般来说,我们会建立一些函数去管理这些并且请求MySQL数据库去记录所有的用户。而我们知道对象后,完全可以建立一个名为User的对象,并且把所有的数据与方法放入到这个对象中里。那么无论什么时候当需要去操作一个用户的数据时,我们就可以简单地建立一个和User类有关的对象。对象中的数据被称为属性,对象中的函数被称为方法。如果你发现需要类外一个类,这个类与User类很相似,但有些不同,这时我们就需要继承User类。那么原来的User类就被成为父类(superclass),而新的类就被成为子类(subclass/derived class)。
声明一个类(Declaring a Class)
在使用一个对象之前,必须用关键字class定义一个类。定义一个类包含类名(它是大小写sensitive的),类的属性,和类的方法。可以使用 '->' 来给变量/属性进行赋值。这是变量不需要用$进行声明。
构造函数(Constructors)
在类里面带有参数并且与类名相同的方法被称为构造函数。现在很多使用__construct来命名构造函数。当不再需要这个对象的时候,就需要调用destructor,来释放这个对象所占的内存。但是destructor不需要设计,因为系统会自动释放特定的内存。除非你用到了动态内存,那么你就是要自己设计一个destructor告诉系统释放哪些内存。
声明一个方法(Methods)
声明一个方法与声明一个函数非常类似,但还是有少许不同。比如,方法的命名开头跟随两个下划线(__)。$this是指代现在这个对象,并返回这个对象的属性值。
静态方法(static methods)
在php编程中,static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法”
如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用。
User::pwd_string();
class User
{
static function pwd_string()
{
echo "Please enter your password";
}
}
?>
声明属性(Declaring Properties)
声明属性不是必须在类里的,类里没有属性和方法但仍然是合法的。但是为了帮助自己和其他人更好地理解与维护代码,还是建议把属性的声明放入到类里。
$object1 = new User();
$object1->name = "Alice";
echo $object1->name;
class User {}
?>
声明一个常量(Declaring Constant)
定义一个常量需要在常量名前加const。常量名一般使用大写字母,使他们变得更为突出。当常量/变量使用关键字self和两个冒号(::)时,就能够被直接引用。
属性和方法的作用域(Property and Method Scope)
PHP提供了3个关键字来控制属性和方法的作用域。
1. public —— 这些属性是用var和public关键字声明的。pubilic与var是能够被互换的,虽然这是不被赞成的。当外部的代码要调用这个属性,或者拓展类需要继承它,我们就应该用public来声明。
2. protected —— 这些属性和方法只能被对象中的方法和任何子类引用。当不想被外部代码来调用,但是拓展类希望继承它,我们就可以用protected来声明。
3. private —— 这些成员仅能被同一个类引用,子类也是不能引用的。当我们不想这些成员被外部任何代码方法或者类来调用,就应该使用private来进行声明。
静态属性和方法(static properties and methods)
静态方法可以被直接调用,而属性是不可以的。属性的调用可以使用关键字self和双冒号的方法来调用类内部的静态属性。
继承(Inheritance)
任何类都能被继承。减少代码的重复性,只要改变一小部分,调整不同的地方。使用关键字extends进行拓展声明。
PHP数组(Arrays)
is_array($array_name)返回布尔值,可以判断这个数组是否是有效的。
sort($array_name, SORT_NUMERIC/STRING)通过数字和字符串从小到大排序。
rsort($array_name, SORT_NUMERIC/STRING)通过数字和字符串从大到小排序。
shuffle($array_name)打乱数组,随机排序。
explode(' ',"string")这个是十分有用的方法,他会把输入的string,通过要求分隔成单个元素然后放入数组中。第一个参数是通过什么来分割,第二个是放入的string。
extract()这个方法可以很容易地把数组变成键值对的形式。经常可以用于$_POST和$_GET。
extract(array,extract_rules,prefix)有三个参数,
第一个array必需。规定要使用的输入。
第二个extract_rules可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中的变量名是否冲突。对非法、数字和冲突的键名的处理将根据此参数决定。可以是以下值之一:
可能的值:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
EXTR_SKIP - 如果有冲突,不覆盖已有的变量。(忽略数组中同名的元素)
EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。自 PHP 4.0.5 起,这也包括了对数字索引的处理。
EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix(第三个参数)。
EXTR_PREFIX_INVALID - 仅在非法或数字变量名前加上前缀 prefix。本标记是 PHP 4.0.5 新加的。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。可以用在已经定义了一组合法的变量,然后要从一个数组例如 $_REQUEST 中提取值覆盖这些变量的场合。本标记是 PHP 4.2.0 新加的。
EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。本标记是 PHP 4.2.0 新加的。
EXTR_REFS - 将变量作为引用提取。这有力地表明了导入的变量仍然引用了 var_array 参数的值。可以单独使用这个标志或者在 extract_type 中用 OR 与其它任何标志结合使用。本标记是 PHP 4.3.0 新加的。
第三个参数,prefix可选。请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。前缀和数组键名之间会自动加上一个下划线。
代码如下:
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>
输出:
$a = Cat;
$b = Dog;
$c = Horse
使用全部参数:
代码如下:
$a = 'Original';
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, 'dup');
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a;";
?>
输出:
$a = Original;
$b = Dog;
$c = Horse;
$dup_a = Cat;
在action.php中只要使用extract()函数将$_POST全局数据解开:
action.php
代码如下:
extract($_POST); //相当于$username = $_POST['username']; //$password = $_POST['password'];
?>
compact(var1,var2...)函数创建一个由参数所带变量组成的数组。如果参数中存在数组,该数组中变量的值也会被获取。
本函数返回的数组是一个关联数组,键名为函数的参数,键值为参数中变量的值。
本函数执行的行为与extract()正好相反。
例子 1
使用不匹配变量的字符串,以及一个变量名数组:
$firstname = "Bill";
$lastname = "Gates";
$age = "60";
$name = array("firstname", "lastname");
$result =compact($name, "location", "age");
print_r($result);
?>
输出结果:
Array ( [firstname] => Bill [lastname] => Gates [age] => 60 )
其他相关的方法:
current() - 返回数组中的当前元素的值
end() - 将内部指针指向数组中的最后一个元素,并输出
next() - 将内部指针指向数组中的下一个元素,并输出
prev() - 将内部指针指向数组中的上一个元素,并输出
each() - 返回当前元素的键名和键值,并将内部指针向前移动
printf(arg1,arg2,agr++)函数输出格式化的字符串。arg1、arg2、arg++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
参数 描述
format 必需。规定字符串以及如何格式化其中的变量。
可能的格式值:
%% - 返回一个百分号 %
%b - 二进制数
%c - ASCII 值对应的字符
%d - 包含正负号的十进制数(负数、0、正数)
%e - 使用小写的科学计数法(例如 1.2e+2)
%E - 使用大写的科学计数法(例如 1.2E+2)
%u - 不包含正负号的十进制数(大于等于 0)
%f - 浮点数(本地设置)
%F - 浮点数(非本地设置)
%g - 较短的 %e 和 %f
%G - 较短的 %E 和 %f
%o - 八进制数
%s - 字符串
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
附加的格式值。必需放置在 % 和字母之间(例如 %.2f):
+ (在数字前面加上 + 或 - 来定义数字的正负性。默认地,只有负数做标记,正数不做标记)
' (规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。)
- (左调整变量值)
[0-9] (规定变量值的最小宽度)
.[0-9] (规定小数位数或最大字符串长度)
注释:如果使用多个上述的格式值,它们必须按照上面的顺序进行使用,不能打乱。
arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
arg2 必需。规定插到 format 字符串中第二个 % 符号处的参数。
arg++ 可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。
PHP printf() 函数
附录:
syntax /'sintœks/ 语法
keep track of 记录
manipulate /məˈnɪpjuleɪt/ 操作
colon /ˈkəʊlən/ 冒号
deprecate /ˈdeprəkeɪt/ 不赞成
Atas ialah kandungan terperinci 记录学习PHP与mySQL的辛酸史. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!