php学习手册

<p>php学习手册</p><p>1,处理文本和数字</p><p>\n 换行符(ASCII 10)</p><p>\r 回车符(ASCII 13)</p><p>\t 制表符 (ASCII 9)</p><p>\\ \</p><p>\$ $</p><p>\&quot; &quot;</p><p>\0 .. \77 八进制</p><p>\x0 .. \xFF 十六进制</p><p>trim()去掉首尾空白</p><p>strlen()查看字符串长度</p><p>格式化文本</p><p>printf();</p><p>&lt;?php</p><p>$price=5;</p><p>$tax=0.075;</p><p>printf(&#39;the dish costs %.2f&#39;,$price*(1+$tax));</p><p>//补白字符</p><p>//正负号</p><p>//最小宽度</p><p>//修饰符后面是一个必须指定的字符,表面指的类型(表示小数的d,表示字符串的s,表示浮点数的f)</p><p>//使用printf()函数补零</p><p>$zip=&#39;6520&#39;;</p><p>$month=2;</p><p>$day=6;</p><p>$year=2007;</p><p>printf(&quot;zip is %05d and the date is %02d/%02d/%d&quot;,$zip,$month,$day,$year);</p><p>//使用printf()显示正负号</p><p>$min=-40;</p><p>$max=40;</p><p>printf(&quot;the computer can operate between %+d and %+d degrees celsiius.&quot;,$min,$max);</p><p>//更改大小写</p><p>echo strtolower(&#39;ASDFASDF&#39;);</p><p>echo strtoupper(&#39;adfadsf&#39;);</p><p>//ucwords()把各个单词首字母变成大写</p><p>print(ucwords(&#39;this is a tag&#39;));</p><p>//substr()提取字符串的部分文本</p><p>$str=&#39;abcdefghijklmnopquvwxyz0123456789&#39;;</p><p>echo substr($str,0,5);</p><p>echo substr($str,-5);</p><p>//str_replace 字符串替换</p><p>//把变量放在字符串中,here文档和now文档</p><p>//strcmp()函数按字典顺序比较大小,如果两个字符串相等,返回0</p><p>$x=strcmp(&#39;x54321&#39;,&#39;x5678&#39;);</p><p>if($x&gt;0){</p><p><span > </span>print &#39;the string &quot;x54321&quot; is greater than the string &quot;x5678&quot;.&#39;;</p><p>}else{</p><p><span > </span>print &#39;The string &quot;x54321&quot; is less than the string &quot;x5678&quot;.&#39;;</p><p>}</p><p>//&lt;=&gt;飞船运算符,比较方式与strcmp()函数类似,不过能比较任何数据类型</p><p>//strcasecmp()忽略大小写</p><p>//循环</p><p>//使用while循环打印select 菜单</p><p>$i=1;</p><p>print &#39;&lt;select name=&quot;peaple&quot;&gt;&#39;;</p><p>while($i&lt;=10){</p><p><span > </span>print(&quot;&lt;option&gt;$i&lt;/optin&gt;&quot;);</p><p><span > </span>$i++;</p><p>}</p><p>print &#39;&lt;/select&gt;&#39;;</p><p>//使用for()打印</p><p>print(&#39;&lt;select name=&quot;peaple&quot;&gt;&#39;);</p><p>for($i=1;$i&lt;=10;$i++){</p><p><span > </span>print(&quot;&lt;option&gt;$i&lt;/option&gt;&quot;);</p><p>}</p><p>print &quot;&lt;/select&gt;&quot;;</p><p></p><p>//数据集合,处理数组</p><p>//count()函数返回数组中元素的个数</p><p>//使用foreach迭代数组</p><p>//使用for迭代数组</p><p></p><p>//array_key_exits() 检查特定的键</p><p>//in_array()在数组中找到指定的值,区分大小写</p><p>//array_search()函数的作用跟in_array()函数类似,不过如果找到元素,它返回元素的键,而不是true</p><p>//删除数组中一个元素 unset();unset($arr[1]);</p><p>$arr=array(&#39;one&#39;,&#39;two&#39;,&#39;three&#39;,&#39;four&#39;,&#39;five&#39;);</p><p>$menu=implode(&#39;,&#39;,$arr);</p><p>print($menu); //如果想一次打印数组中的所有值,最快的方法是implode()函数</p><p></p><p>//explode()把字符串变成数组</p><p>//sort()和asort()根据元素的值排序</p><p>//sort()数组升序排列,键会变化</p><p>$arr=array(&#39;2&#39;=&gt;&#39;one&#39;,&#39;bb&#39;=&gt;&#39;two&#39;,&#39;1&#39;=&gt;&#39;three&#39;,&#39;8&#39;=&gt;&#39;four&#39;,&#39;ee&#39;=&gt;&#39;five&#39;);</p><p>sort($arr);</p><p>print_r($arr);</p><p>//如果想根据元素的值排序关联数组,要使用asort,这个函数会保留键与指的对应关系</p><p>$arr=array(&#39;2&#39;=&gt;&#39;one&#39;,&#39;bb&#39;=&gt;&#39;two&#39;,&#39;1&#39;=&gt;&#39;three&#39;,&#39;8&#39;=&gt;&#39;four&#39;,&#39;ee&#39;=&gt;&#39;five&#39;);</p><p>asort($arr);</p><p>print_r($arr);</p><p>//ksort 这个函数保留键值对的关系,但是根据键排序</p><p>$arr=array(&#39;2&#39;=&gt;&#39;one&#39;,&#39;bb&#39;=&gt;&#39;two&#39;,&#39;1&#39;=&gt;&#39;three&#39;,&#39;8&#39;=&gt;&#39;four&#39;,&#39;ee&#39;=&gt;&#39;five&#39;);</p><p>ksort($arr);</p><p>print_r($arr);</p><p>//sourt(),asort(),ksort()这个三个数组排序函数都有对应的降序版本,分别是rsort(),arsort(),krsort()</p><p>$arr=array(&#39;2&#39;=&gt;&#39;one&#39;,&#39;bb&#39;=&gt;&#39;two&#39;,&#39;1&#39;=&gt;&#39;three&#39;,&#39;8&#39;=&gt;&#39;four&#39;,&#39;ee&#39;=&gt;&#39;five&#39;);</p><p>ksort($arr);</p><p>print_r($arr);</p><p>?&gt;</p><p>理解变量的作用域</p><p>在函数内部修改存储参数的变量对函数外部的变量没有影响,这是因为,函数内部的活动发生在不同的作用域中,在函数外部定义的变量叫做全局变量,在函数内部定义的变量叫局部变量,每个函数都有自己的作用域。</p><p>在函数内部访问全局变量有两种方式,最简单的方式是,在特殊的数组$GLOBALS中查找,每个全局变量都是这个数组的元素.</p><p>&lt;?php</p><p>$dinner=&#39;Curry cuttlefish&#39;;</p><p>function macrobiotic_dinner(){</p><p><span > </span>$dinner=&quot;some vegetables&quot;;</p><p><span > </span>print &quot;dinner is $dinner&quot;;</p><p><span > </span>print &quot;but i&#39;d rather thave&quot;;</p><p><span > </span>print $GLOBALS[&#39;dinner&#39;];</p><p>}</p><p>macrobiotic_dinner();</p><p>//在函数内部通过$GLOBALS[&#39;dinner&#39;]访问全局变量$dinner,$GLOBALS数组也可以修改全局变量。</p><p>?&gt;</p><p>在函数内部访问全局变量的第二种方式是使用global关键字,这样做的目的是告诉php引擎,在函数中使用的那个变量指的是全局变量,而不是局部变量。</p><p>为参数和返回值是加规则</p><p>array 必须是数组</p><p>bool 必须是布尔值,true或false</p><p>callable 必须是表示可调用函数或方法的元素</p><p>float 必须是浮点数</p><p>int 必须是整数</p><p>string 必须是字符串</p><p>对象基础知识</p><p>定义一个类</p><p>&lt;?php</p><p>class Entree{</p><p><span > </span>public $name;</p><p><span > </span>public $ingredients=array();</p><p><span > </span>public function hasIngredient($ingredient){</p><p><span > </span>return in_array($ingredient,$this-&gt;ingredients);</p><p><span > </span>}</p><p>}</p><p>//使用对象</p><p>$soup=new Entree;</p><p>$soup-&gt;name=&#39;chichen soup&#39;;</p><p>$soup-&gt;ingredients=array(&#39;chicken&#39;,&#39;water&#39;);</p><p>?&gt;</p><p>new运算符返回一个新Entree对象</p><p>箭头运算符 (-&gt;一个连字符和一个大于号) 是通往对象的属性(变量)和方法(函数)的途径</p><p>数组的箭头用的是等号=&gt;,对象的箭头用的是连字符-&gt;</p><p>类还可以有静态方法,这种方法不能使用$this变量,因为它们不在特定对象实例的上下文中运行,而是在类自身上运行,静态方法用于处理类的行为,而不是某个对象。</p><p>静态方法声明与其他方法类似,但是在function前面有个static关键字</p><p>调用静态方法的方式是,在类名和方法之间加上::,而不是-&gt;</p><p>$sizes=Entree::getSizes();</p><p>构造方法,构造方法的名称始终是__construct()</p><p>class Entree{</p><p><span > </span>public $name;</p><p><span > </span>public $ingredients=array();</p><p><span > </span>public function __construct($name,$ingredients){</p><p><span > </span>$this-&gt;name=$name;</p><p><span > </span>$this-&gt;ingredients=$ingredients;</p><p><span > </span>}</p><p><span > </span>public function hasIngredient($ingredient){</p><p><span > </span>return in_array($ingredient,$this-&gt;ingredients);</p><p><span > </span>}</p><p>}</p><p>使用异常表面有问题</p><p>抛出异常的另一面是捕获异常,在PHP引擎收到之前截获异常,逃离绝境</p><p>try{</p><p><span > </span>$drink=new Entree(&#39;Glass of Milk&#39;,&#39;milk&#39;);</p><p><span > </span>if($drink-&gt;hasIngredient(&#39;milk&#39;)){</p><p><span > </span>print &quot;yummy!&quot;;</p><p><span > </span>}</p><p>}catch(Exception $e){</p><p><span > </span>print &quot;could&#39;t create the drink:&quot;.$e-&gt;getMessage();</p><p>}</p><p>try和catch块是一起的,try块中的各个语句正常运行,遇到异常时停止,此时ph引擎跳到catch块,把变量$e的值设为所抛出的Exception对象。catch块中的代码</p><p>使用Exception类的getMessage()方法获取创建异常时指定的文本消息</p><p>扩展对象 extends 继承父类所有方法和属性、</p><p>在子类中定义构造方法</p><p>class ComboMeal extends Entree{</p><p><span > </span>public function __construct($name,$entrees){</p><p><span > </span>parent::__construct($name,$entrees);</p><p><span > </span>foreach($entrees as $entree){</p><p><span > </span>throw new Exception(&#39;Elements of $entrees must be Entree objects&#39;);</p><p><span > </span>}</p><p><span > </span>}</p><p>}</p><p>属性和方法的可见性</p><p>public</p><p>private 禁止类外部的代码访问属性</p><p>protected 在类的外部,只有在子类中才能访问属性</p><p>命名空间</p><p>命名空间把相关的代码组织在一起,避免你编写的类与别人编写的类有名称冲突</p><p>一定要理解命名空间,这样才能在你的程序中使用别人的包,包管理系统composer</p><p>命名空间可以理解我容器,用于盛放类定义或其他命名空间,这只是一种句法上的约定,而不是新的功能。你见到的namespace 关键字和类名中的反斜线就是php的命名空间。</p><p>如果想在某个命名空间中定义类,在文件的顶部使用namespace关键字指定命名空间的名称。这样,那个文件中定义的类就在指定的命名空间里。</p><p>namespace Tiny;</p><p>class Fruit{</p><p><span > </span>public static function munch($bite){</p><p><span > </span>print &quot;here is a tiney much of $bit.&quot;;</p><p><span > </span>}</p><p>}</p><p>使用命名空间中定义的类,最明确的方式是以\(顶层命名空间)开头,然后编写类所在的命名空间的名称,再写一个\,最后是定义类的名称</p><p>\Tiny\Fruit::much(&quot;banana&quot;);</p><p>如果没有前导\,类的引用根据当前命名空间(引用类时激活的命名空间)解析。在没有申明命名空间的php文件中,当前命名空间是顶层命名空间。此时,类名的写法与目前所见的没有命名空间的类一样。</p><p>一次次输入这些反斜线和命名空间的名称很繁琐,为了简化,PHP引擎提供了use关键字</p><p>use Tiny\Eating\Fruit as Snack;</p><p>use Tiny\Fruit;</p><p>Snack::much(&quot;strawberry&quot;);</p><p>Fruit::much(&quot;orange&quot;);</p><p>use Tiny\Eating\Fruit as Snack;告诉PHP引擎,在这个文件的后续代码中,当我提到Snack这个类名时,我指的其实是\Tiny\Eating\Fruit,如果没有as,</p><p>PHP引擎使用use的最后一个元素指代类,因此,use Tiny\Fruit;告诉php引擎,在这个文件的后续代码中,当我提到Fruit这个类名时,我指的其实是\Tiny\Fruit</p><p>与用户交换信息;</p><p>有用的$_SERVER变量</p><p>QUERY_STRING URL中问好之后的部分</p><p>PATH_INFO 在URL末尾斜线之后的额外信息</p><p>SERVER_NAME 运行PHP引擎的网站名</p><p>DOCUMENT_ROOT<span > </span>WEB服务器中存放网站文档的目录</p><p>REMOTE_ADDR<span > </span>请求服务器的用户的IP地址</p><p>REMOTE_HOST<span > </span>如果对WEB服务器做了配置,把用户的IP地址转换成主机名,那么这就是请求WEB服务器的用户的主机名</p><p>HTTP_REFERER 如果用户是通过单击链接到达当前URL的,HTTP_REFERER的值是那个链接所在的页面的URL。</p><p>HTTP_USER_AGENT 获取当前页面的Web浏览器。</p><p>数值或字符串元素</p><p>filter_input();</p><p>$ok=filter_input(INPUT_POST,&#39;age&#39;,FILTER_VALIDATE_INT);</p><p>if(is_null($ok) || ($ok===false)){</p><p><span > </span>$errors[]=&#39;please enter a valid age.&#39;;</p><p>}</p><p>$ok=filter_input(INPUT_POST,&#39;price&#39;,FILTER_VALIDATE_FLOAT);</p><p>strip_tags()把字符串中的HTML标签删除</p><p>htmlentites()函数编码特殊的html字符</p><p>function validate_form(){</p><p><span > </span>$errors=array();</p><p><span > </span>$input=array();</p><p><span > </span>$input[&#39;age&#39;]=filter_input(INPUT_POST,&#39;age&#39;,FILTER_VALIDATE_INT);</p><p><span > </span>if(is_null($input[&#39;age&#39;]) || ($input[&#39;age&#39;]===false)){</p><p><span > </span>$errors[]=&#39;Please enter a valid age.&#39;;</p><p><span > </span>}</p><p><span > </span>$input[&#39;price&#39;]=filter(INPUT_POST,&#39;price&#39;,FILTER_VALIDATE_FLOAT);</p><p><span > </span>if(is_null($input[&#39;price&#39;]) || ($input[&#39;price&#39;]===false)){</p><p><span > </span>$errors[]=&#39;Pleae enter a valid price.&#39;;</p><p><span > </span>}</p><p><span > </span>$input[&#39;name&#39;]=trim($_POST[&#39;name&#39;] ?? &#39;&#39;);</p><p><span > </span>if(strlen($input[&#39;name&#39;])==0){</p><p><span > </span>$errors[]=&#39;your name is requried.&#39;;</p><p><span > </span>}</p><p><span > </span>return array($errors,$input);</p><p>}</p><p>if($_SERVER[&#39;REQUEST_METHOD&#39;]==&#39;POST&#39;){</p><p><span > </span>list($form_errors,$input)==validate_form();</p><p><span > </span>if($form_errors){</p><p><span > </span>show_form($form_errors);</p><p><span > </span>}else{</p><p><span > </span>process_form($input);</p><p><span > </span>}</p><p>}else{</p><p><span > </span>show_form();</p><p>}</p><p>$input[&#39;email&#39;]=filter_input(INPUT_POST,&#39;email&#39;,FILTER_VALIDATE_EMAIL);</p><p>链接数据库程序</p><p>$db=new PDO(&#39;mysql:host=db.example.com;dbname=restaurant&#39;,&#39;username&#39;,&#39;password&#39;);</p><p>传给PDO构造方法的第一个字符串是数据源名称(Data Source Name,DSN),前缀指明要链接的数据库程序中类,后面是一个:然后是以分号分隔的键值对。</p><p>捕获链接错误</p><p>try{</p><p><span > </span>$db=new PDO(&#39;mysql:host=localhost;dbname=restaurant,&#39;uername&#39;,&#39;password&#39;);</p><p>}catch(PDOException $e){</p><p><span > </span>print &quot;couldn&#39;t connect to the database:&quot;.$e-&gt;getMessage();</p><p>}</p><p>PDO有三种错误模式:异常,静默和警告,异常模式在调用 $db-&gt;setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)时激活,最适合调试,绝不会错过任何数据库错误。如果不处理PDO抛出的异常,成功女婿会停止运行。</p><p>安全地插入表单数据</p><p>PDO提供了一个有用的特性,叫预处理语句(prepared statement)</p><p>使用预处理语句时,查询分两步执行,首先为PDO的prepare()方法提供带有?的sql查询,每个?表示要插入值的地方,这个方法返回一个PDOStatement对象。</p><p>然后,在PDOStatement对象上调用execute()方法,传入一个数组,用户替换占位字符?,放入查询之前,数组中的值会做恰当的转移,防止受到sql主任攻击。</p><p>$stmt=$db-&gt;prepare(&#39;INSERT into dishes (dish_name,price,is_spicy) values (?,?,?)&#39;);</p><p>$stmt-&gt;execute(array($_POST[&#39;new_dish_name&#39;],$_POST[&#39;new_price&#39;],$_POST[&#39;is_spicy&#39;]));</p><p>从数据库中检索数据</p><p>从数据库中检索信息使用query()方法,</p><p>使用query()和fetch()检索行</p><p>$q=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>while($row=$q-&gt;fetch()){</p><p><span > </span>print&quot;$row[&#39;dish_name&#39;],$row[price]\n&quot;;</p><p>}</p><p>PDOStatement对象有个rowCount()方法,但是并不支持所有数据库,如果行数不多,而且在程序中都要使用,可以使用fetchAll()方法把所有行存入一个数组,这样就无需循环了。</p><p>$db=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>$rows=$q-&gt;fetchAll();</p><p>如果行数很多,无法全部检索,可以使用SQL的count()函数,让数据库程序计算行数。</p><p>如果只想得到数值键数组,把fetch()或fetchAll()的第一个参数设为PDO::FETCH_NUM,如果只想得到字符串键数组(有时也称“关联数组”),使用PDO::FETCH_ASSOC</p><p>如果不想得到数组,而想得到对象,使用PDO::FETCH_OBJ</p><p>$q=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>while($row=$q-&gt;fetch(PDO::FETCH_NUM)){</p><p><span > </span>print implode(&#39;,&#39;,$row).&quot;\n&quot;;</p><p>}</p><p>$q=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>while($row=$q-&gt;fetch(PDO::FETCH_OBJ)){</p><p><span > </span>print &quot;{$row-&gt;dishname} has price {$row-&gt;price}\n&quot;;</p><p>}</p><p>如果想在某次连接的某个查询中一直使用某种风格,可以设置默认值。为此,在PDOStatement对象上调用setFetchMode()方法</p><p>$q=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>$q-&gt;setFetchMode(PDO::FETCH_NUM);</p><p>while($row=$q-&gt;fetch()){</p><p><span > </span>print implode(&#39;,&#39;,$row).&quot;\n&quot;;</p><p>}</p><p>安全地获取表单数据</p><p>$stmt=$db-&gt;prepare(&quot;select * from dishes where dish_name like ?&quot;);</p><p>$stmt-&gt;execuet(array($_POST[&#39;dish_search&#39;]));</p><p>使用quote()和strtr()处理提交的值</p><p>$dish=$db-&gt;quote($_POST[&#39;dish_search&#39;]);</p><p>$dish=strtr($dish,array(&#39;_&#39;=&gt;&#39;\_&#39;,&#39;%&#39;=&gt;&#39;\%&#39;));</p><p>$stmt=$db-&gt;query(&quot;select * from dishes where dish_name like $dish&quot;);</p><p>处理文件</p><p>读取整个文件 file_get_contents()函数</p><p>写入文件爱你 file_put_contents($filename,$content);</p><p>读写文件的部分内容</p><p>使用file()函数访问文件的各行</p><p>foreach(file(&#39;people.txt&#39;) as $line){</p><p><span > </span>$line=trim($line);</p><p><span > </span>$info=explode(&#39;|&#39;,$line);</p><p><span > </span>print &#39;&lt;li&gt;&lt;a href=&quot;mailto:&#39;.$info[0].&#39;&quot;&gt;$info[1].&#39;&lt;/a&gt;&lt;/li&gt;&#39;;</p><p>}</p><p>file()是很遍历,但是遇到大文件时很难应付,为了构建各行组成的数组,它要读取整个文件,如果文件包含的行数过多,要消耗大量内存。此时,应该逐行读取文件</p><p>$fp=fopen(&#39;people.txt&#39;,&#39;rb&#39;);</p><p>while((!feof($fh)) &amp;&amp; ($line=fgets($fh))){</p><p><span > </span>$line=trim($line);</p><p><span > </span>$info=explode(&#39;|&#39;,$line);</p><p><span > </span>print &#39;&lt;li&gt;&lt;a href=&quot;mailto:&#39;.$info[0].&#39;&quot;&gt;&#39;.$info[1].&quot;&lt;/a&gt;&lt;/li&gt;\n&quot;;</p><p>}</p><p>fclose($fp);</p><p>$fp=fopen(&#39;dishes.txt&#39;,&#39;wb&#39;);</p><p>$q=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>while($row=$q-&gt;fetch()){</p><p><span > </span>fwrite($fp,&quot;the price of $row[0] is $row[1] \n&quot;);</p><p>}</p><p>fclose();</p><p>处理csv文件</p><p>若想读取csv文件中的一行,别用fgets(),而是用fgetcsv(),这个函数读取CSV文件中的一行,返回一个数组,包含一行中的各个字段,</p><p>把csv格式数据写入文件</p><p>try{</p><p><span > </span>$db=new PDO(&#39;sqlite:/tmp/restaurant.db&#39;);</p><p>}catch(Exception $e){</p><p><span > </span>print &quot;couldn&#39;t connect to database:&quot;.$e-&gt;getMessage();</p><p><span > </span>exit();</p><p>}</p><p>$fp=fopen(&#39;dish-list.csv&#39;,&#39;&#39;wb&#39;);</p><p>$dishes=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>while($row=$dishes-&gt;fetch(PDO::FETCH_NUM)){</p><p><span > </span>fputcsv($fh,$row);</p><p>}</p><p>fclose($fh);</p><p>若想把只包含CSV格式的数据发给WEB客户端,要让fputcsv()把数据写入常规的PHP输出流(而不是文件)。此外,还要使用PHP的header()函数告诉web客户端,那是csv文档,而不是html文档。</p><p>header(&#39;Content-Type:text/csv&#39;);</p><p>header(&#39;Content-Disposition:attachment;filename=&quot;dishes.csv&quot;&#39;);</p><p>把csv文件爱你发给浏览器</p><p>try{</p><p><span > </span>$dn=new PDO(&#39;sqlite:/tmp/restaurant.db&#39;);</p><p>}catch(Exception $e){</p><p><span > </span>print &quot;coulud&#39;t connect to database:&quot;.$e-&gt;getMessage();</p><p><span > </span>exit();</p><p>}</p><p>header(&#39;Content-Type:text/csv&#39;);</p><p>header(&#39;Content-Disposition:attachment;filename=&quot;dishes.csv&quot;&#39;);</p><p>$fh=fopen(&#39;php://output&#39;,&#39;wb&#39;);</p><p>$dishes=$db-&gt;query(&quot;select * from dishes&quot;);</p><p>fhile($row=$dishes-&gt;fetch(PDO::FETCH_NUM)){</p><p><span > </span>fputcsv($fh,$row);</p><p>}</p><p>php://output这是一个内置的特殊文件句柄,把数据发送到print发送到的地方。</p><p>file_exists()文件是否存在</p><p>is_readable()是否有读权限</p><p>is_writeable() 是否有写的权限</p><p>如果启用了track_errors配置指令,错误消息的文本可以通过全局变量$php_errormsg获取</p><p>检查fopen(),fgets(),fclose()是否出错</p><p>$fh=fopen(&#39;people.txt&#39;,&#39;wb&#39;);</p><p>if(!$fh){</p><p><span > </span>print &quot;error opening people.txt:$php_errormsg&quot;;</p><p>}else{</p><p><span > </span>while(!feof($fh)){</p><p><span > </span>$line=fgets($fh);</p><p><span > </span>if($line!==false){</p><p><span > </span>$line=trim($line);</p><p><span > </span>$info=explode(&#39;|&#39;,$line);</p><p><span > </span>print &#39;&lt;li&gt;&lt;a href=&quot;mailto:&#39;.$info[0].&#39;&quot;&gt;&#39;.$info[1].&#39;&lt;/a&gt;&lt;/li&gt;\n&#39;;</p><p><span > </span>}</p><p><span > </span>}</p><p><span > </span>if(!fclose($fh)){</p><p><span > </span>print &quot;error closing people.txt:$php_errormsg&quot;;</p><p><span > </span>}</p><p>}</p><p>净化外部提供的文件名</p><p>清理放入文件名中的表单参数</p><p>$user=str_replace(&#39;/&#39;,&#39;&#39;,$_POST[&#39;user&#39;]);</p><p>$user=str_replace(&#39;..&#39;,&#39;&#39;,$user);</p><p>使用realpath()函数,它的作用是把包含..序列的模糊文件名变成没有..的文件名,明确指出文件的位置。</p><p>激活会话</p><p>会话默认使用名为PHPSESSID的cookie</p><p>若想在一个页面中使用会话,在脚本的开头调用session_start(),与setcookie()一样,这个函数也必须在发送任何输出之前调用。如果想在所有页面中使用会话,把配置指令</p><p>session.auto_start设为On,这样设置之后就无需在各个页面中调用session_start()了。</p><p>配置会话</p><p>session.gc_maxlifetime配置指令用于控制会话的存货时间,默认是1440,即24分钟。</p><p>ini_set(&#39;session.gc_maxlifetime&#39;,600);</p><p>session_start();</p><p>ini_set(&#39;session.gc_probability&#39;,100); //100% 每次请求都清理</p><p>session_start();</p><p>如果会话是使用session.auto_start配置指令激活的,不能使用ini_set()修改session_gc_maxlifetime和session.gc_probability的值,必须在服务器的配置中修改。</p><p>会话cookie的配置参数</p><p>session.name PHPSESSID</p><p>session.cookie_lifetime 0</p><p>session.cookie_path /</p><p>session.cookie_domain 无</p><p>session.cookie_secure off</p><p>session.cookie_httponly off</p><p>password_hash()函数,哈希值,password_verify() php5.5及以上版本中使用</p><p>不同的流支持的上下文选项有所不同,http流有个header选项,其值是一个字符串,设定要随http请求发送的首部名称和值。</p><p>$params=array(&#39;api_key&#39;=&gt;NDB_API_KEY,&#39;q&#39;=&gt;&#39;black pepper&#39;);</p><p>$url=&#39;http://www.afs.com?&#39;.http_build_query($params);</p><p>$options=array(&#39;header&#39;=&gt;&#39;Content-Type:application/json&#39;);</p><p>$context=stream_context_create(array(&#39;http&#39;=&gt;$options));</p><p>print file_get_contents($url,false,$context);</p><p>$options数组是要设定的选项的键值对,我们要告知stream_context_create()函数上下文是为那种流创建的,因此它的参数是一个数组,里面有个键指定流类型(http),其值是要设定的选项。</p><p>file_get_contents()的第二个参数指明查找文件时要不要考虑PHP引擎的引入路径。这对HTTP没有意义,所以设为false。file_get_contents()的第三个参数是流上下文。</p><p>通过file_get_contents()发送POST请求也要使用上下文。上下文的method选项控制请求方法,content选项指定要发送的请求主题。主题的内容必须根据内容类型首部正确格式化。</p><p>NDB API不支持POST请求,只能通过GET请求获取营养数据。它不允许我们添加新数据。</p><p>$url=&quot;http://www.adfafas.com/post-server.php&quot;;</p><p>$form_data=array(&#39;name&#39;=&gt;&#39;black pepper&#39;,&#39;smell&#39;=&gt;&#39;good&#39;);</p><p>$options=array(&#39;method&#39;=&gt;&#39;POST&#39;,&#39;header&#39;=&gt;&#39;Content-Type:application/x-www-form-urlencoded&#39;,&#39;content&#39;=&gt;http_build_query($form_data));</p><p>$context=strem_context_create(array(&#39;http&#39;=&gt;$options));</p><p>print file_get_contents($url,false,$conteext);</p><p>使用cURL全面访问URL</p><p>1,通过GET取回URL</p><p>$c=curl_init(&#39;http://www.baidu.com&#39;);</p><p>curl_setopt($c,CURLOPT_RETURNTRANSFER,true); //告诉curl返回字符串形式的响应,而不是立即打印</p><p>$fact=curl_exec($c);</p><p>echo $fact;</p><p>调用curl_setopt()设定CURLOPT_RETURNTRANSFER选项,告诉cURL发起HTTP请求后返回字符串形式的响应。否则,cURL会打印获得的响应。curl_exec()函数执行请求,返回结果。</p><p>使用cURL,设定查询字符串参数和首部</p><p>$params=array(&#39;api_key&#39;=&gt;NOB_API_KEY,&#39;q&#39;=&gt;&#39;black_pepper&#39;);</p><p>$url=&#39;http://api.nal.usda.gov/ndb/search?&#39;.http_build_query($params);</p><p>$c=curl_init($url);</p><p>curl_setopt($c,CURLOPT_RETURNTRANSFER,true);</p><p>curl_setopt($c,CURLOPT_HTTPHEADER,array(&#39;Content-Type:application/json&#39;));</p><p>print curl_exec($c);</p><p>CURLOPT_HTTP_HEADER选项设定随HTTP请求发送的首部。如果有多个首部,在那个数组中放多个元素。</p><p>CURL请求有两种错误要处理。第一种是curl自身导致的问题,例如找不到主机名,或者无法连接远程服务器。此时,curl_exec()返回false,curl_errno()返回错误代码,curl_error()</p><p>返回错误代码对应的错误信息。</p><p>第二种 错误是远程服务器导致的错误,例如在服务器上找不到请求的URL,无法生产响应。cURL仍然认为这是成功的请求,因为服务器有返回,因此要检查HTTP响应码,判断有没有问题。</p><p>curl_getinfo()函数返回一个数组,包含关于请求的信息,那个数组中有一个元素是HTTP响应码。、</p><p>处理cURL相关的错误</p><p>$c=curl_init(&#39;http://api.example.com&#39;);</p><p>curl_setopt($c,CURLOPT_RETURNTRANSFER,true);</p><p>$result=curl_exec($c);</p><p>$info=curl_getinfo($c);</p><p>if($result===false){ //链接出错</p><p><span > </span>print &quot;Error#&quot;.curl_errno($c).&quot;\n&quot;;</p><p><span > </span>print &quot;Uh-oh!cURL says:&quot;.curl_error($c).&quot;\n&quot;;</p><p>}elseif($info[&#39;http_code&#39;]&gt;=400){</p><p><span > </span>print &quot;The server says http error{$info[&#39;http_code&#39;]}.\n&quot;;</p><p>}else{</p><p><span > </span>print &quot;A successfull result!\n&quot;;</p><p>}</p><p>请求信息中还包括时间统计</p><p>print &quot;By the way,this request took {$info[&#39;total_time&#39;]} seconds.\n&quot;;</p><p>通过POST取回URL</p><p>$url=&#39;http://www.example.com/post-server.php&#39;;</p><p>$form_data=array(&#39;name&#39;=&gt;&#39;black pepper&#39;,&#39;smell&#39;=&gt;&#39;good&#39;);</p><p>$c=curl_init($url);</p><p>curl_setopt($c,CURLOPT_RETURNTRANSFER,true);</p><p>curl_setopt($c,CURLOPT_POST,true);</p><p>curl_setopt($c,CURLOPT_POSTFIELDS,$form_data);</p><p>print curl_exec($c);</p><p>使用cURL在POST请求中发送JSON</p><p>$url=&#39;http://www.example.com/post-server.php&#39;;</p><p>$form_data=array(&#39;name&#39;=&gt;&#39;black_pepper&#39;,&#39;smell&#39;=&gt;&#39;good&#39;);</p><p>$c=curl_init($url);</p><p>curl_setopt($c,CURLOPT_RETURNTRANSFER,true);</p><p>curl_setopt($c,CURLOPT_POST,true);</p><p>curl_setopt($c,CURLOPT_HEADER,array(&#39;Content-type:application/json&#39;));</p><p>curl_setopt($c,CURLOPT_POSTFIELDS,json_encode($form_data);</p><p>print curl_exec($c);</p><p>CURL_HTTPHEADER选项告诉服务器,请求主题是JSON,而不是常规的表单数据。随后,把CURLOPT_POSTFIELDS的值设为json_encode($form_data),把请求主体设为真正的json数据</p><p></p><p>若想跟踪cookie,要启用cURL的cookie jar,如果想在特定cURL句柄的生存期内跟踪cookie,把CURLOPT_COOKIEJAR设为true</p><p>$c=curl_init(&#39;http://www.example.com/cookie-server.php&#39;);</p><p>curl_setopt($c,CURLOPT_RETURNTRANSFER,true);</p><p>curl_setopt($c,CURLOPT_COOKIEJAR,true); //启用cookie jar</p><p>//第一次请求没有cookie</p><p>$res=curl_exec($c);</p><p>print $res;</p><p>$res=curl_exec($c);</p><p>print $res //第二次请求,第一次请求的cookie保留下来了</p>
返回顶部 留言