• [技术干货] datax 搭建指南
    ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/11/1646988067652978089.png) # 1 软件介绍 MCrypt 是php里面重要的加密支持扩展库,linux环境下该库在默认情况下不开启。window环境下,PHP>=5.3,默认开启mcrypt扩展。 MCrypt基于libMCrypt,但libMCrypt自2007年开始没再继续维护,所以mcrypt拓展从PHP7.2之后删除。 # 2 环境配置 硬件配置 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/11/1646987818494254135.png) 软件配置 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/11/1646987804895864481.png) # 3 软件安装 ## 3.1 依赖安装安装 ### 3.1.1 Yum源安装依赖。 yum install –y make gcc-c++ gcc ## 3.2 LibMCrypt编译安装 ### 3.2.1 下载并解压LibMCrypt v2.0.15 wget https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz tar -zxvf libmcrypt-2.5.8.tar.gz && cd libmcrypt-2.5.8 ### 3.2.2 配置编译选项。 ./configure --build=arm ### 3.2.3 编译安装。 make -j96 && make install # 4 软件运行 ## 4.1 运行测试 ### 4.1.1 运行自带的测试套 make check # 5 其他 参考文档: https://blog.csdn.net/nianyixiaotian/article/details/82706927
  • [技术干货] IIS PHP fastcgi模式 pathinfo取值错误任意代码执行漏洞修复方法
    描述:目标存在任意代码执行漏洞。漏洞形成原因:PHP默认配置有误,IS+PHP fastcgi模式在解析PHP文件时存在缺陷,导致任意文件会被服务器以PHP格式解析,从而导致任意代码执行。验证方式:打开目标页面后在原URL后添加/test.php示例:在http://www.xxx.com/123.jpg后输入/test.php并回车,使用抓包工具查看响应头信息,如果包含PHP/x.x.x即可证明漏洞存在。部分浏览器免费抓包工具:360浏览器:工具-->开发人员工具IE浏览器:工具-->F12开发人员工具Firefox:搜索下载Firebug插件-->F12呼出Chrome:点击右上角的菜单-->工具-->开发者工具危害:攻击者可以利用该漏洞直接在网站执行任意代码,可能直接控制网站服务器,盗取网站数据,影响网站的正常运营。最近360提示这个IIS+PHP fastcgi模式 pathinfo取值错误任意代码执行漏洞,这里根据提示修复了漏洞,具体方法如下以下是360给出的解决方案一、更换PHP默认的Fastcgi模式为ISAPI模式(只能运行于Windows环境)1.下载PHP的ZIP文件包,下载地址http://www.php.net(注意版本要对应)2.将sapi目录中的:php4isapi.dll复制到c:\php目录中3.进入虚拟主机管理平台的"网站管理"-"虚拟主机"--服务器设置中,修改PHP的影射,将原来的:.php,C:\PHP\php.exe,5,GET,HEAD,POST,TRACE|改成:.php,C:\PHP\php4isapi.dll,5,GET,HEAD,POST,TRACE|4.(IIS 6才需要)打开IIS管理器,点击Web服务扩展,点击php的属性,“要求的文件”---添中--选中“C:\PHP\php4isapi.dll”,确定后,PHP就可以调用。 脚本之家小编评语:一般不建议变更为ISAPI模式,效率很低.2003 php5.2.17可以使用isapi方式,2008 则建议直接修改php.ini配置文件把cgi.fix_pathinfo值改为0 就行了.二、在条件允许的情况下(咨询网站工程师),更改php.ini中的配置参数cgi.fix_pathinfo值为0建议用这个,但需要用服务器管理权限的,一般是vps或主机脚本之家小编评语:推荐这种方式,不论iis还是apache、nginx都很方便三、针对iis的解决方案此处客户的环境是windows server 2008R2的IIS,这里我在‘处理程序映射’里找到php的双击进入此界面进入‘请求限制’确定后就可以了。测试:在服务器上根目录新建一个phpinfo()的JPG文件test.jpg,访问http://www.xxx.com/test.jpg/1.php(test.jpg后面的php名字随便写),如果有漏洞则可以看到phpinfo()的信息,反之会返回404错误。四、使用360网站卫士Nginx pathinfo取值错误任意代码执行漏洞漏洞形成原因:由于Nginx默认配置有误,从而导致了一个任意代码执行漏洞.受影响版本:nginx 0.5.*nginx 0.6.*nginx 0.7 <= 0.7.65nginx 0.8 <= 0.8.37危害:黑客可以利用该漏洞直接在网站执行任意代码,从而有可能直接控制网站服务器,盗取网站数据,影响网站的正常运营。解决方案:升级Nginx至最新版本,官方网站:http://nginx.org/ 。转载自https://www.jb51.net/hack/552161.html
  • [问题求助] php安装问题
    我现在购买了鲲鹏服务器centos7  for arm 系统,想安装PHP5.6到7.0 版本的服务,需要如何安装,按照网上的方法都不能成功,只能yum安装默认的PHP5.4版本?是否有其它的yum安装方式?或者能把5.4的版本升级到需要版本?
  • [技术干货] 有用php做SparkRTC接入鉴权的吗?
    static String hmacSha(String KEY, String VALUE, String SHA_TYPE) { try { SecretKeySpec signingKey = new SecretKeySpec(KEY.getBytes("UTF-8"), SHA_TYPE); Mac mac = Mac.getInstance(SHA_TYPE); mac.init(signingKey); byte[] rawHmac = mac.doFinal(VALUE.getBytes("UTF-8")); byte[] hexArray = { (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' }; byte[] hexChars = new byte[rawHmac.length * 2]; for (int j = 0; j rawHmac.length; j++) { int v = rawHmac[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } catch (Exception ex) { throw new RuntimeException(ex); } } 用php怎么写?
  • [问题求助] php版本sdk的扩展依赖问题,能否提升一下相关依赖扩展版本
    php版本sdk需要以下扩展"require" : { "php" : ">=5.6.0", "guzzlehttp/guzzle" : "6.3.0", "guzzlehttp/psr7" : "1.4.2", "guzzlehttp/promises" : "1.3.1", "psr/http-message" : "1.0.1", "monolog/monolog" : "1.23.0", "psr/log" : "~1.0"},但是guzzlehttp monolog版本都过低,我开发程序是使用了其他的sdk用于微信支付,支付宝支付,腾讯地图等等都用了guzzle,他们允许使用的版本都相对高一些,比如>=6.3.0或者>7.0,但咱的guzzle只能用6.3.0的版本,导致我因为版本依赖问题,无法安装obs的sdk为了使用obs,我只能强行降低guzzle版本,但是有可能导致我其他扩展无法正常使用,还需要去重新测试我的程序,带来很大的不便
  • [技术干货] Php 和ODBC数据库
    创建 ODBC 连接通过一个 ODBC 连接,您可以连接到您的网络中的任何计算机上的任何数据库,只要 ODBC 连接是可用的。这是创建到达 MS Access 数据库的 ODBC 连接的方法:在控制面板中打开管理工具图标。双击其中的数据源(ODBC)图标。选择系统 DSN 选项卡。点击系统 DSN 选项卡中的添加。选择Microsoft Access Driver。点击完成。在下一个界面,点击选择来定位数据库。为数据库起一个数据源名(DSN)。点击确定。请注意,必须在您的网站所在的计算机上完成这个配置。如果您的计算机上正在运行 Internet 信息服务(IIS),上面的指令将会生效,但是如果您的网站位于远程服务器,您必须拥有对该服务器的物理访问权限,或者请您的主机提供商为您建立 DSN。连接到 ODBCodbc_connect() 函数用于连接到 ODBC 数据源。该函数有四个参数:数据源名、用户名、密码以及可选的指针类型。odbc_exec() 函数用于执行 SQL 语句。实例下面的实例创建了到达名为 northwind 的 DSN 的连接,没有用户名和密码。然后创建并执行一条 SQL 语句:$conn=odbc_connect('northwind','','');$sql="SELECT * FROM customers";$rs=odbc_exec($conn,$sql);取回记录odbc_fetch_row() 函数用于从结果集中返回记录。如果能够返回行,则函数返回 true,否则返回 false。该函数有两个参数:ODBC 结果标识符和可选的行号:odbc_fetch_row($rs)从记录中取回字段odbc_result() 函数用于从记录中读取字段。该函数有两个参数:ODBC 结果标识符和字段编号或名称。下面的代码行从记录中返回第一个字段的值:$compname=odbc_result($rs,1);下面的代码行返回名为 "CompanyName" 的字段的值:$compname=odbc_result($rs,"CompanyName");关闭 ODBC 连接odbc_close() 函数用于关闭 ODBC 连接。odbc_close($conn);ODBC 实例下面的实例展示了如何首先创建一个数据库连接,接着创建一个结果集,然后在 HTML 表格中显示数据。<html><body><?php$conn=odbc_connect('northwind','','');if (!$conn){    exit("连接失败: " . $conn);}$sql="SELECT * FROM customers";$rs=odbc_exec($conn,$sql);if (!$rs){    exit("SQL 语句错误");}echo "<table><tr>";echo "<th>Companyname</th>";echo "<th>Contactname</th></tr>";while (odbc_fetch_row($rs)){    $compname=odbc_result($rs,"CompanyName");    $conname=odbc_result($rs,"ContactName");    echo "<tr><td>$compname</td>";    echo "<td>$conname</td></tr>";}odbc_close($conn);echo "</table>";?></body></html>
  • [技术干货] PHP MySQL Where 子句
    WHERE 子句WHERE 子句用于提取满足指定标准的的记录。语法SELECT column_name(s)FROM table_nameWHERE column_name operator value如需学习更多关于 SQL 的知识,请访问我们的 SQL 教程。为了让 PHP 执行上面的语句,我们必须使用 mysqli_query() 函数。该函数用于向 MySQL 连接发送查询或命令。实例下面的实例将从 "Persons" 表中选取所有 FirstName='Peter' 的行:<?php$con=mysqli_connect("localhost","username","password","database");// 检测连接if (mysqli_connect_errno()){    echo "连接失败: " . mysqli_connect_error();}$result = mysqli_query($con,"SELECT * FROM PersonsWHERE FirstName='Peter'");while($row = mysqli_fetch_array($result)){    echo $row['FirstName'] . " " . $row['LastName'];    echo "<br>";}?>以上代码将输出:Peter Griffin
  • [技术干货] PHP如何删除关联数组中键值
    1、使用unset()函数可以用于取消设置关联数组中的键及其值。1234567891011// 声明关联数组$arr = array(    "1" => "加",    "2" => "减",    "3" => "乘",    "4" => "除");// 关联数组中删除键1及其值unset($arr['1']);// 显示数组元素var_dump($arr);2、使用array_diff_key()函数用于获取一个或多个数组之间的差集。此函数比较一个或多个数组之间的键并返回它们之间的差集。123456789101112// 声明关联数组$arr = array(    "1" => "春",    "2" => "夏",    "3" => "秋",    "4" => "冬",);// 从关联数组中删除键1及其值$result = array_diff_key($arr,    array_flip((array) ['1']));// 显示数组元素var_dump($result);内容扩展:函数介绍array_values() 函数返回包含数组中所有的值的数组。注意:被返回的数组将使用数值键,从 0 开始且以 1 递增。语法1array_values(array)参数说明array 必需。规定数组。代码实现:1234$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');$arr2 = array_values($arr);print_r($arr2);?>
  • [技术干货] php图像处理
    使用 PHP 图像处理函数,需要加载 GD 支持库。请确定 php.ini 加载了 GD 库:Window 服务器上:extension = php_gd2.dllLinux 和 Mac 系统上:extension = php_gd2.so使用 gd_info() 函数可以查看当前安装的 GD 库的信息:<?phpvar_dump(gd_info());?>输出大致如下:array(12) {  ["GD Version"]=>  string(26) "bundled (2.1.0 compatible)"  ["FreeType Support"]=>  bool(true)  ["FreeType Linkage"]=>  string(13) "with freetype"  ["T1Lib Support"]=>  bool(false)  ["GIF Read Support"]=>  bool(true)  ["GIF Create Support"]=>  bool(true)  ["JPEG Support"]=>  bool(true)  ["PNG Support"]=>  bool(true)  ["WBMP Support"]=>  bool(true)  ["XPM Support"]=>  bool(false)  ["XBM Support"]=>  bool(true)  ["JIS-mapped Japanese Font Support"]=>  bool(false)}
  • [技术干货] PHP RESTful
    REST(英文:Representational State Transfer,简称REST) ,指的是一组架构约束条件和原则。符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:直观简短的资源地址:URI,比如:http://example.com/resources/。传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAM等。对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。本教程我们将使用 PHP(不用框架) 来创建一个 RESTful web service,在文章末尾你可以下载本章节使用到的代码。通过本教程你将学习到以下内容:创建一个 RESTful Webservice。使用原生 PHP, 不依赖任何框架。URI 模式需要遵循 REST 规则。RESTful service 接受与返回的格式可以是 JSON, XML等。根据不同情况响应对应的 HTTP 状态码。演示请求头的使用。使用 REST 客户端来测试 RESTful web service。RESTful Webservice 实例以下代码是 RESTful 服务类 Site.php:实例<?php /* * 教程 RESTful 演示实例 * RESTful 服务类 */ Class Site { private $sites = array( 1 => 'TaoBao', 2 => 'Google', 3 => 'Runoob', 4 => 'Baidu', 5 => 'Weibo', 6 => 'Sina' ); public function getAllSite(){ return $this->sites; } public function getSite($id){ $site = array($id => ($this->sites[$id]) ? $this->sites[$id] : $this->sites[1]); return $site; } } ?>RESTful Services URI 映射RESTful Services URI 应该设置为一个直观简短的资源地址。Apache 服务器的 .htaccess 应设置好对应的 Rewrite 规则。本实例我们将使用两个 URI 规则:1、获取所有站点列表:http://localhost/restexample/site/list/2、使用 id 获取指定的站点,以下 URI 为获取 id 为 3 的站点:http://localhost/restexample/site/list/3/项目的 .htaccess 文件配置规则如下所示:# 开启 rewrite 功能Options +FollowSymlinksRewriteEngine on# 重写规则RewriteRule ^site/list/$   RestController.php?view=all [nc,qsa]RewriteRule ^site/list/([0-9]+)/$   RestController.php?view=single&id=$1 [nc,qsa]RESTful Web Service 控制器在 .htaccess 文件中,我们通过设置参数 'view' 来获取 RestController.php 文件中对应的请求,通过获取 'view' 不同的参数来分发到不同的方法上。RestController.php 文件代码如下:实例<?php require_once("SiteRestHandler.php"); $view = ""; if(isset($_GET["view"])) $view = $_GET["view"]; /* * RESTful service 控制器 * URL 映射 */ switch($view){ case "all": // 处理 REST Url /site/list/ $siteRestHandler = new SiteRestHandler(); $siteRestHandler->getAllSites(); break; case "single": // 处理 REST Url /site/show/<id>/ $siteRestHandler = new SiteRestHandler(); $siteRestHandler->getSite($_GET["id"]); break; case "" : //404 - not found; break; } ?>简单的 RESTful 基础类以下提供了 RESTful 的一个基类,用于处理响应请求的 HTTP 状态码,SimpleRest.php 文件代码如下:实例<?php /* * 一个简单的 RESTful web services 基类 * 我们可以基于这个类来扩展需求 */ class SimpleRest { private $httpVersion = "HTTP/1.1"; public function setHttpHeaders($contentType, $statusCode){ $statusMessage = $this -> getHttpStatusMessage($statusCode); header($this->httpVersion. " ". $statusCode ." ". $statusMessage); header("Content-Type:". $contentType); } public function getHttpStatusMessage($statusCode){ $httpStatus = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => '(Unused)', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported'); return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500]; } } ?>RESTful Web Service 处理类以下是一个 RESTful Web Service 处理类 SiteRestHandler.php,继承了上面我们提供的 RESTful 基类,类中通过判断请求的参数来决定返回的 HTTP 状态码及数据格式,实例中我们提供了三种数据格式: "application/json" 、 "application/xml" 或 "text/html":SiteRestHandler.php 文件代码如下:实例<?php require_once("SimpleRest.php"); require_once("Site.php"); class SiteRestHandler extends SimpleRest { function getAllSites() { $site = new Site(); $rawData = $site->getAllSite(); if(empty($rawData)) { $statusCode = 404; $rawData = array('error' => 'No sites found!'); } else { $statusCode = 200; } $requestContentType = $_SERVER['HTTP_ACCEPT']; $this ->setHttpHeaders($requestContentType, $statusCode); if(strpos($requestContentType,'application/json') !== false){ $response = $this->encodeJson($rawData); echo $response; } else if(strpos($requestContentType,'text/html') !== false){ $response = $this->encodeHtml($rawData); echo $response; } else if(strpos($requestContentType,'application/xml') !== false){ $response = $this->encodeXml($rawData); echo $response; } } public function encodeHtml($responseData) { $htmlResponse = "<table border='1'>"; foreach($responseData as $key=>$value) { $htmlResponse .= "<tr><td>". $key. "</td><td>". $value. "</td></tr>"; } $htmlResponse .= "</table>"; return $htmlResponse; } public function encodeJson($responseData) { $jsonResponse = json_encode($responseData); return $jsonResponse; } public function encodeXml($responseData) { // 创建 SimpleXMLElement 对象 $xml = new SimpleXMLElement('<?xml version="1.0"?><site></site>'); foreach($responseData as $key=>$value) { $xml->addChild($key, $value); } return $xml->asXML(); } public function getSite($id) { $site = new Site(); $rawData = $site->getSite($id); if(empty($rawData)) { $statusCode = 404; $rawData = array('error' => 'No sites found!'); } else { $statusCode = 200; } $requestContentType = $_SERVER['HTTP_ACCEPT']; $this ->setHttpHeaders($requestContentType, $statusCode); if(strpos($requestContentType,'application/json') !== false){ $response = $this->encodeJson($rawData); echo $response; } else if(strpos($requestContentType,'text/html') !== false){ $response = $this->encodeHtml($rawData); echo $response; } else if(strpos($requestContentType,'application/xml') !== false){ $response = $this->encodeXml($rawData); echo $response; } } } ?>
  • [技术干货] PHP 实例 - AJAX 实时搜索
    AJAX Live Search在下面的实例中,我们将演示一个实时的搜索,在您键入数据的同时即可得到搜索结果。实时的搜索与传统的搜索相比,具有很多优势:当键入数据时,就会显示出匹配的结果当继续键入数据时,对结果进行过滤如果结果太少,删除字符就可以获得更宽的范围在下面的文本框中输入 "HTML",搜索包含 HTML 的页面:上面实例中的结果在一个 XML 文件(links.xml)中进行查找。为了让这个例子小而简单,我们只提供 6 个结果。实例解释 - HTML 页面当用户在上面的输入框中键入字符时,会执行 "showResult()" 函数。该函数由 "onkeyup" 事件触发:<html><head><script>function showResult(str){    if (str.length==0)    {         document.getElementById("livesearch").innerHTML="";        document.getElementById("livesearch").style.border="0px";        return;    }    if (window.XMLHttpRequest)    {// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行        xmlhttp=new XMLHttpRequest();    }    else    {// IE6, IE5 浏览器执行        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    }    xmlhttp.onreadystatechange=function()    {        if (xmlhttp.readyState==4 && xmlhttp.status==200)        {            document.getElementById("livesearch").innerHTML=xmlhttp.responseText;            document.getElementById("livesearch").style.border="1px solid #A5ACB2";        }    }    xmlhttp.open("GET","livesearch.php?q="+str,true);    xmlhttp.send();}</script></head><body><form><input type="text" size="30" onkeyup="showResult(this.value)"><div id="livesearch"></div></form></body></html>源代码解释:如果输入框是空的(str.length==0),该函数会清空 livesearch 占位符的内容,并退出该函数。如果输入框不是空的,那么 showResult() 会执行以下步骤:创建 XMLHttpRequest 对象创建在服务器响应就绪时执行的函数向服务器上的文件发送请求请注意添加到 URL 末端的参数(q)(包含输入框的内容)PHP 文件上面这段通过 JavaScript 调用的服务器页面是名为 "livesearch.php" 的 PHP 文件。"livesearch.php" 中的源代码会搜索 XML 文件中匹配搜索字符串的标题,并返回结果:<?php$xmlDoc=new DOMDocument();$xmlDoc->load("links.xml");$x=$xmlDoc->getElementsByTagName('link');// 从 URL 中获取参数 q 的值$q=$_GET["q"];// 如果 q 参数存在则从 xml 文件中查找数据if (strlen($q)>0){    $hint="";    for($i=0; $i<($x->length); $i++)    {        $y=$x->item($i)->getElementsByTagName('title');        $z=$x->item($i)->getElementsByTagName('url');        if ($y->item(0)->nodeType==1)        {            // 找到匹配搜索的链接            if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q))            {                if ($hint=="")                {                    $hint="<a href='" .                     $z->item(0)->childNodes->item(0)->nodeValue .                     "' target='_blank'>" .                     $y->item(0)->childNodes->item(0)->nodeValue . "</a>";                }                else                {                    $hint=$hint . "<br /><a href='" .                     $z->item(0)->childNodes->item(0)->nodeValue .                     "' target='_blank'>" .                     $y->item(0)->childNodes->item(0)->nodeValue . "</a>";                }            }        }    }}// 如果没找到则返回 "no suggestion"if ($hint==""){    $response="no suggestion";}else{    $response=$hint;}// 输出结果echo $response;?>
  • [技术干货] PHP Cookie
    Cookie 是什么?cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。如何创建 Cookie?setcookie() 函数用于设置 cookie。注释:setcookie() 函数必须位于 <html> 标签之前。语法setcookie(name, value, expire, path, domain);实例 1在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "runoob"。我们也规定了此 cookie 在一小时后过期:<?phpsetcookie("user", "runoob", time()+3600);?><html>.....注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)实例 2您还可以通过另一种方式设置 cookie 的过期时间。这也许比使用秒表示的方式简单。<?php$expire=time()+60*60*24*30;setcookie("user", "runoob", $expire);?><html>.....在上面的实例中,过期时间被设置为一个月(60 秒 * 60 分 * 24 小时 * 30 天)。如何取回 Cookie 的值?PHP 的 $_COOKIE 变量用于取回 cookie 的值。在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:<?php// 输出 cookie 值echo $_COOKIE["user"];// 查看所有 cookieprint_r($_COOKIE);?>在下面的实例中,我们使用 isset() 函数来确认是否已设置了 cookie:<html><head><meta charset="utf-8"><title>huawei(huawei.com)</title></head><body><?phpif (isset($_COOKIE["user"]))    echo "欢迎 " . $_COOKIE["user"] . "!<br>";else    echo "普通访客!<br>";?></body></html>如何删除 Cookie?当删除 cookie 时,您应当使过期日期变更为过去的时间点。删除的实例:<?php// 设置 cookie 过期时间为过去 1 小时setcookie("user", "", time()-3600);?>如果浏览器不支持 Cookie 该怎么办?如果您的应用程序需要与不支持 cookie 的浏览器打交道,那么您不得不使用其他的办法在您的应用程序中的页面之间传递信息。一种方式是通过表单传递数据(有关表单和用户输入的内容,在本教程的前面章节中我们已经介绍过了)。下面的表单在用户单点击 "Submit" 按钮时,向 "welcome.php" 提交了用户输入:<html><head><meta charset="utf-8"><title>华为(huawei.com)</title></head><body><form action="welcome.php" method="post">名字: <input type="text" name="name">年龄: <input type="text" name="age"><input type="submit"></form></body></html>取回 "welcome.php" 文件中的值,如下所示:<html><head><meta charset="utf-8"><title>华为(huawei.com)</title></head><body>欢迎 <?php echo $_POST["name"]; ?>.<br>你 <?php echo $_POST["age"]; ?> 岁了。</body></html>
  • [技术干货] AJAX PHP
    实例解释 - HTML 页面当用户在上面的输入框中键入字符时,会执行 "showHint()" 函数。该函数由 "onkeyup" 事件触发:<html><head><script>function showHint(str){    if (str.length==0)    {         document.getElementById("txtHint").innerHTML="";        return;    }    if (window.XMLHttpRequest)    {        // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行的代码        xmlhttp=new XMLHttpRequest();    }    else    {            //IE6, IE5 浏览器执行的代码        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    }    xmlhttp.onreadystatechange=function()    {        if (xmlhttp.readyState==4 && xmlhttp.status==200)        {            document.getElementById("txtHint").innerHTML=xmlhttp.responseText;        }    }    xmlhttp.open("GET","gethint.php?q="+str,true);    xmlhttp.send();}</script></head><body><p><b>在输入框中输入一个姓名:</b></p><form> 姓名: <input type="text" onkeyup="showHint(this.value)"></form><p>返回值: <span id="txtHint"></span></p></body></html>源代码解释:如果输入框是空的(str.length==0),该函数会清空 txtHint 占位符的内容,并退出该函数。如果输入框不是空的,那么 showHint() 会执行以下步骤:创建 XMLHttpRequest 对象创建在服务器响应就绪时执行的函数向服务器上的文件发送请求请注意添加到 URL 末端的参数(q)(包含输入框的内容)PHP 文件上面这段通过 JavaScript 调用的服务器页面是名为 "gethint.php" 的 PHP 文件。"gethint.php" 中的源代码会检查姓名数组,然后向浏览器返回对应的姓名:<?php// 将姓名填充到数组中$a[]="Anna";$a[]="Brittany";$a[]="Cinderella";$a[]="Diana";$a[]="Eva";$a[]="Fiona";$a[]="Gunda";$a[]="Hege";$a[]="Inga";$a[]="Johanna";$a[]="Kitty";$a[]="Linda";$a[]="Nina";$a[]="Ophelia";$a[]="Petunia";$a[]="Amanda";$a[]="Raquel";$a[]="Cindy";$a[]="Doris";$a[]="Eve";$a[]="Evita";$a[]="Sunniva";$a[]="Tove";$a[]="Unni";$a[]="Violet";$a[]="Liza";$a[]="Elizabeth";$a[]="Ellen";$a[]="Wenche";$a[]="Vicky";//从请求URL地址中获取 q 参数$q=$_GET["q"];//查找是否由匹配值, 如果 q>0if (strlen($q) > 0){    $hint="";    for($i=0; $i<count($a); $i++)    {        if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))        {            if ($hint=="")            {                $hint=$a[$i];        
  • [热门活动] 【榜单公示啦】1024开发者技能刷榜赢华为手环4、小音箱、快充、京东卡等好礼
    活动介绍华为云权威开发技能测评来啦,覆盖主流岗位技能客观、精准定位技能水平,助你明确短板,高效提升即日起至10月31日,通过测评、邀请好友通过测评、转发海报集赞、转发微博即可上本活动技能榜单和邀请达人榜单并可参与赢以下奖品奖活动赢奖规则参与细则如何报名&参与测评?①点击这里>>>,进入报名问卷,点击提交即可完成报名;②完成①后,会自动进到测评系统,选择任一技能测评进行测评(答题次数不限,可通过多次答题来通过测评,见下文)。如何邀请好友或重复参与测评?③完成报名后,再次点击步骤①的同一链接>>>,即可看到邀请好友、进入测评系统入口,可根据提示进入相应选项完成相应任务。如何转发朋友圈集赞?④在③中,选择邀请好友选项,即可生成海报,将海报下载转发朋友圈集赞;并将“集赞截图+参与活动用的华为云账号”发给下方小助手统计。如何转发微博?转发华为云微博本活动微博,传送门:https://weibo.com/1930559805/KDSnwwxQy?from=page_1006061930559805_profile&wvr=6&mod=weibotime如何抽奖?除微博抽奖直接通过微博抽奖工具抽奖外,其他抽奖奖项将在活动截止后,运营小姐姐会从后台拿到满足相应抽奖资格的账号,用抽奖工具进行统一抽奖。榜单&获奖公示邀请达人榜单技能榜单(不同榜单优先按得分降序排列,其次按账户名升序排列)②获奖结果和发奖事宜将在11月2日内于本帖置顶评论公示。
  • [技术干货] PHP 过滤器
    什么是 PHP 过滤器?PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。为什么使用过滤器?几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。您应该始终对外部数据进行过滤!输入过滤是最重要的应用程序安全课题之一。什么是外部数据?来自表单的输入数据CookiesWeb services data服务器变量数据库查询结果函数和过滤器如需过滤变量,请使用下面的过滤器函数之一:filter_var() - 通过一个指定的过滤器来过滤单一的变量filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量filter_input - 获取一个输入变量,并对它进行过滤filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤在下面的实例中,我们用 filter_var() 函数验证了一个整数:实例<?php$int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)){    echo("不是一个合法的整数");}else{    echo("是个合法的整数");}?>上面的代码使用了 "FILTER_VALIDATE_INT" 过滤器来过滤变量。由于这个整数是合法的,因此上面的代码将输出:如果我们尝试使用一个非整数的变量(比如 "123abc"),则将输出:"Integer is not valid"。如需查看完整的函数和过滤器列表,请访问我们的 PHP Filter 参考手册。Validating 和 Sanitizing有两种过滤器:Validating 过滤器:用于验证用户输入严格的格式规则(比如 URL 或 E-Mail 验证)如果成功则返回预期的类型,如果失败则返回 FALSESanitizing 过滤器:用于允许或禁止字符串中指定的字符无数据格式规则始终返回字符串选项和标志选项和标志用于向指定的过滤器添加额外的过滤选项。不同的过滤器有不同的选项和标志。在下面的实例中,我们用 filter_var() 和 "min_range" 以及 "max_range" 选项验证了一个整数:实例<?php$var=300; $int_options = array(    "options"=>array    (        "min_range"=>0,        "max_range"=>256    )); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)){    echo("不是一个合法的整数");}else{    echo("是个合法的整数");}?>就像上面的代码一样,选项必须放入一个名为 "options" 的相关数组中。如果使用标志,则不需在数组内。由于整数是 "300",它不在指定的范围内,以上代码的输出将是:不是一个合法的整数如需查看完整的函数和过滤器列表,请访问我们的 PHP Filter 参考手册。您可以看到每个过滤器的可用选项和标志。验证输入让我们试着验证来自表单的输入。我们需要做的第一件事情是确认是否存在我们正在查找的输入数据。然后我们用 filter_input() 函数过滤输入的数据。在下面的实例中,输入变量 "email" 被传到 PHP 页面:实例<?phpif(!filter_has_var(INPUT_GET, "email")){    echo("没有 email 参数");}else{    if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))    {        echo "不是一个合法的 E-Mail";    }    else    {        echo "是一个合法的 E-Mail";    }}?>实例解释上面的实例有一个通过 "GET" 方法传送的输入变量 (email):检测是否存在 "GET" 类型的 "email" 输入变量如果存在输入变量,检测它是否是有效的 e-mail 地址净化输入让我们试着清理一下从表单传来的 URL。首先,我们要确认是否存在我们正在查找的输入数据。然后,我们用 filter_input() 函数来净化输入数据。在下面的实例中,输入变量 "url" 被传到 PHP 页面:<?phpif(!filter_has_var(INPUT_GET, "url")){    echo("没有 url 参数");}else{    $url = filter_input(INPUT_GET,     "url", FILTER_SANITIZE_URL);    echo $url;}?>实例解释上面的实例有一个通过 "GET" 方法传送的输入变量 (url):检测是否存在 "GET" 类型的 "url" 输入变量如果存在此输入变量,对其进行净化(删除非法字符),并将其存储在 $url 变量中假如输入变量是一个类似这样的字符串:"http://www.ruåånoøøob.com/",则净化后的 $url 变量如下所示:过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 函数重复调用,我们可以使用 filter_var_array 或 the filter_input_array 函数。在本例中,我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一个名字、一个年龄以及一个 e-mail 地址:实例<?php$filters = array(    "name" => array    (        "filter"=>FILTER_SANITIZE_STRING    ),    "age" => array    (        "filter"=>FILTER_VALIDATE_INT,        "options"=>array        (            "min_range"=>1,            "max_range"=>120        )    ),    "email"=> FILTER_VALIDATE_EMAIL); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]){    echo("年龄必须在 1 到 120 之间。<br>");}elseif(!$result["email"]){    echo("E-Mail 不合法<br>");}else{    echo("输入正确");}?>实例解释上面的实例有三个通过 "GET" 方法传送的输入变量 (name、age 和 email):设置一个数组,其中包含了输入变量的名称和用于指定的输入变量的过滤器调用 filter_input_array() 函数,参数包括 GET 输入变量及刚才设置的数组检测 $result 变量中的 "age" 和 "email" 变量是否有非法的输入。(如果存在非法输入,在使用 filter_input_array() 函数之后,输入变量为 FALSE。)filter_input_array() 函数的第二个参数可以是数组或单一过滤器的 ID。如果该参数是单一过滤器的 ID,那么这个指定的过滤器会过滤输入数组中所有的值。如果该参数是一个数组,那么此数组必须遵循下面的规则:必须是一个关联数组,其中包含的输入变量是数组的键(比如 "age" 输入变量)此数组的值必须是过滤器的 ID ,或者是规定了过滤器、标志和选项的数组使用 Filter Callback通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。在下面的实例中,我们使用了一个自定义的函数把所有 "_" 转换为 ".":实例<?phpfunction convertSpace($string){    return str_replace("_", ".", $string);} $string = "www_runoob_com!"; echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));?>实例解释上面的实例把所有 "_" 转换成 "." :创建一个把 "_" 替换为 "." 的函数调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组