php4.2.0的版本是没有用过,php官网提到:php最具争议的变化是php4.2.0版本配置中register_globals的On改为了Off,对此项依赖的是如此普遍以至于很多人不知道他的存在而以为php本来就是这么工作的,下面解释这个指令如何写出不安全的代码,但是要知道这个指令没有什么不安全的地方,只有不安全的代码。
当register_globals打开以后,很多代码都可以被注入比如html表单提交的内容,再加上php在使用变量的时候无需初始化,这就使得更容易出现不安全的代码。比如我将php.ini中register_globals设置为On开始状态:
代码如下 | 复制代码 |
// 由于并没有事先把 $flag初始化为 false, |
以上代码在register_globals = On的时候,由于$flag没有初始化,在后面判断的时候通过get方式的flag = 1也可以执行include。
工厂模式代码:
代码如下 | 复制代码 |
<?php //然后定义具体的人种 //人种也定义完毕了,那我们把八卦炉定义出来:
|
最简单php连接数据库代码如下
代码如下 | 复制代码 |
<? $hostname_conn = "localhost"; ?> |
包含到页面里面的时候用require_once,不用include了。
代码如下 | 复制代码 |
<?php require_once('Connections/conn.php'); ?> |
如果连接时出现错误提示:Call to undefined function mysql_connect() 说明你的配置未成功
解决办法
1.将libmysql.dll和php5ts.dll拷贝至windows目录下的system32下!
2.修改php.ini extension_dir = "d:phpext"
2.修改windows安装目录下的php.ini 去掉;extension=php_mysql.dll前面的分号;
1.&(与) 将数值转化为二进制后 都为1则为1否则为0
$a = 10; //1010
$b = 12; //1100
echo $a & $b; //得到的是8 => 1000 2.| (或) 将数值转化为二进制后 只要有一个是1则为1 否则为0
$a = 10; //1010
$b = 12; //1100
echo $a | $b; //得到的是14 => 1110 3.^ (异或)将数值转化为二进制后 相同的为0 不同的为1
$a = 10; //1010
$b = 12; //1100
echo $a ^ $b; //得到的是6 => 0110 4.~ (取非) 将数值转化为二进制后 1转为0 0转为1
$a = 10; //1010
echo ~$a; //结果是-11 => 1111111111111111111111111111111111111111111111111111111111110101 5.<< (左移) 左移几个位置就乘以几个2
$a = 10;
echo $a << 3; //结果是80 6. >> (右移) 右移几个位置除以几个2
$a = 80;
echo $a >> 3; //结果是10
(1)文件的创建与打开;
(2)文件的操作;
(3)文件的关闭;
在PHP中,通过一系列的函数来完成文件的操作,常用的函数及其简要说明罗列如下:
//文件打开,完成文件打开(在文件不存在时可创建文件),依赖于文件中模式的不同而具有不同的操作
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
//$filename 打开或者要创建文件的路径及文件名,为了便于移植,使用反斜杠/为佳
//$mode 是文件打开的模式,有很多模式,比较常用的r,w,a,同样为了便于移植,建议mode中增加b(二进制)
//通常读文件为 rb ,写文件为 ab,分别表示以二进制读文件及以二进制向文件追加内容
//在文件打开操作过程中出现错误请首先检查文件所在的路径的权限设置
代码如下 | 复制代码 |
//文件操作函数 //写操作相关函数 //把$string的内容写到文件指针$handle int fwrite ( resource $handle , string $string [, int $length ] ) //函数是fwrite的别名函数 fputs() //也能完成写操作,不同的是集成了fopen(),fwrite(),fclose(),使用该函数不用再打开关闭文件 int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) //读操作相关函数 //逐行读取 string fgets ( resource $handle [, int $length ] ) //逐行读,能够过滤标记 string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] ) //逐行读,能够根据定界符输出到数组 array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\' ]]]] ) //一次性读取一个文件并将文件内容发送到标准输出,包含了文件打开与文件关闭操作 int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] ) //先要打开文件,然后将文件指针所指向的文件内容发送到标准输出 int fpassthru ( resource $handle ) //把结果发送到一个数组中 array file ( string $filename [, int $flags = 0 [, resource $context ]] ) //一次读取一个字符 string fgetc ( resource $handle ) //读取任意长度字节的内容 string fread ( resource $handle , int $length ) //文件关闭 bool fclose ( resource $handle ) //文件操作中常用的函数 //检查文件或目录是否存在 bool file_exists ( string $filename ) //获取文件大小,返回文件大小的字节数 int filesize ( string $filename ) //删除文件 bool unlink ( string $filename [, resource $context ] ) //复位文件指针位置 bool rewind ( resource $handle ) //在文件指针中定位 int fseek ( resource $handle , int $offset [, int $whence = SEEK_SET ] ) |
函数的具体详细的说明在php.net上可以查到,下面练习一下文件的操作,练习名称为『简易日记』,需求如下:
(1)每日记录的内容以年-月-日.txt保存在数据目录下;
(2)首页写日记,并显示以往的记录;
(3)显示单页记录内容;
具体代码如下
首页(index.php)
代码如下 | 复制代码 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>简易日记--php文件操作练习</title> <style> h1 { font-size:24px; border-bottom:1px solid #000; line-height:40px; } .active { line-height:22px; font-size:14px; background:#2cf; padding:8px; text-decoration:none; } .btn { width:100px; height:40px; } </style> </head> <body> <h1>我的日记本</h1> <p><span class="active">写日记</span></p> <form name="writediary" method="POST" action="diaryprocessed.php"> <p>日记主题</p> <input type="text" name="diarytopic" size="60" maxlength="100" /> <p>日记内容</p> <textarea name="diarycontents" rows="10" cols="53"></textarea> <p><input class="btn" type="submit" name="save" value="保存" /></p> </form> <hr> <p><span class="active">日记列表</span> </p> <hr> <?php $handler = opendir($_SERVER['DOCUMENT_ROOT'] . '/phpcodes/diarydatas/'); while (($diaryname = readdir($handler)) !== false) { if($diaryname != "." && $diaryname != ".." ) { $files[] = $diaryname; } } closedir($handler); foreach($files as $value) { echo "<a href=viewdiary.php?id=" . substr($value,0,(strlen($value)-4)) . ">$value</a>" . " | "; } ?> </body> </html> |
保存处理页(diaryprocessed.php)
代码如下 | 复制代码 |
<?php header('Content-Type:text/html; charset=utf-8'); $date = gmdate('Y-m-d', time() + 3600 * 8); $diarytopic = $_POST['diarytopic']; $diarycontents = $_POST['diarycontents']; $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; $output = $diarytopic . "n" . $diarycontents . "n"; $fp = fopen($DOCUMENT_ROOT . '/phpcodes/diarydatas/' . $date . '.txt', 'ab'); flock($fp,LOCK_EX); if(!$fp) { echo "<p><strong>当前不能处理您提交的日志,请稍后再试!</strong></p>"; echo "<a href="index.htm">返回</a>"; } fwrite($fp,$output); flock($fp,LOCK_UN); fclose($fp); echo '日记提交成功!'; echo "<a href="index.htm">返回</a>"; |
查看内容页(viewdiary.php)
代码如下 | 复制代码 |
<?php |