学习PHP,环境为PHP5.2 和sqlserver 链接数据库正常,其中在查收某段代码时,和查询分析器里的结果不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习PHP,环境为PHP5.2 和sqlserver 链接数据库正常,其中在查收某段代码时,和查询分析器里的结果不同相关的知识,希望对你有一定的参考价值。

$query="SET NOCOUNT ON IF OBJECT_ID('tempdb..#TempFSalesID', 'U') IS NOT NULL DROP TABLE #TempFSalesID CREATE TABLE #TempFSalesID(ID int) IF(ISNULL (1,0)=1) BEGIN INSERT #TempFSalesID (ID) SELECT DISTINCT ID FROM v_ManpowersEmployees WHERE UserName = '曹灿_0708' OR SUBSTRING(UserName, 0, CHARINDEX('_', Username)) = '曹灿_0708' END ELSE IF(ISNULL(1,0)=2) BEGIN INSERT #TempFSalesID (ID) SELECT DISTINCT ID FROM v_ManpowersEmployees WHERE UserName = ANY (SELECT t2.CName + '_' + t2.WorkNo FROM ManpowersDepartment t LEFT JOIN ManpowersDepartment t1 ON SUBSTRING(t1.DepartmentCode, 1, LEN(t.DepartmentCode)) = t.DepartmentCode INNER JOIN ManpowersEmployees t2 ON t2.DeptID = t1.ID WHERE t2.DeleteFlag = 0 AND t2.DimissionFlag = 0 AND t.ID IN (SELECT DeptID FROM ManpowersEmployees WHERE CName + '_' + WorkNo = '曹灿_0708' OR CName = '曹灿_0708')) END ELSE IF(ISNULL(1,0)=3) BEGIN INSERT INTO #TempFSalesID (ID) VALUES (0) end SELECT top 10 t138.CustomerName ,C1.CustomerGroup ,t138.BuyOrderNo,t138.OrderNo , t138.deputystyle ,t138.FBillNo ,t138.InvNumber ,t138.PayStyle , t138.FeeAlias ,t138.ARMoney ,t138.CMoney ,t138.TARMoney , C.Currency ,t138.OrMoney ,CONVERT(nvarchar(10), t138.Fdate, 120) , CONVERT(nvarchar(10), t138.FArDate, 120) ,DATEDIFF(DAY, T138.FArdate, GETDATE()) , t138.CustomerName ,C1.SalerA ,C1.FollowerA ,C.ProductClass , C.SupplierName,C.Amount ,C.HGAmount ,C.PayMoney ,C.JMoney , C.PayALlMoney ,C.ApMoney FROM v_ArMoneys_Import t138 LEFT JOIN Customer C1 ON t138.CustomerID = C1.ID LEFT JOIN v_SalesOrderPay C ON t138.OrderID = C.SalesOrderID AND t138.FeeAlias = '货款' WHERE t138.CustomerName LIKE '%珠海双赢%' AND EXISTS (SELECT 1 FROM #TempFSalesID WHERE id =CASE WHEN ISNULL(1,0)=3 then 0 else C1.FSalerID end) AND t138.FDate between '2016-05-29' and '2016-10-01' "

现在在php里显示无记录,但是在sqlserver里是有记录的
如果去掉最后的where条件时,两边就是一样的结果
求大神帮忙......
还是编码的问题,因为除了查询条件外,上面的语句也有中文,但是可以查出来数据,就没有考虑中文编码问题,后来整个代码全部转成了gbk,没有问题了

同步两个SQLServer数据库  如何同步两个sqlserver数据库的内容?程序代码可以有版本管理cvs进行同步管理,可是数据库同步就非常麻烦,只能自己改了一个后再去改另一个,如果忘记了更改另一个经常造成两个数据库的结构或内容上不一致.各位有什么好的方法吗?  一、分发与复制  用强制订阅实现数据库同步操作.大量和批量的数据可以用数据库的同步机制处理://说明:为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式在客户机器使用强制订阅方式。  二、测试通过  1:环境  服务器环境:  机器名称:zehuadb  操作系统:windows2000server  数据库版本:sql2000server个人版  客户端  机器名称:zlp  操作系统:windows2000server  数据库版本:sql2000server个人版  2:建用户帐号  在服务器端建立域用户帐号  我的电脑管理->本地用户和组->用户->建立username:zlpuserpwd:zlp  3:重新启动服务器mssqlserver  我的电脑->控制面版->管理工具->服务->mssqlserver服务  (更改为:域用户帐号,我们新建的zlp用户.\zlp,密码:zlp)  4:安装分发服务器  a:配置分发服务器工具->复制->配置发布、订阅服务器和分发->下一步->下一步(所有的均采用默认配置)  b:配置发布服务器工具->复制->创建和管理发布->选择要发布的数据库(sz)->下一步->快照发布->下一步->选择要发布的内容->下一步->下一步->下一步->完成  c:强制配置订阅服务器(推模式,拉模式与此雷同)工具->复制->配置发布、订阅服务器和分发->订阅服务器->新建->sqlserver数据库->输入客户端服务器名称(zlp)->使用sqlserver身份验证(sa,空密码)->确定->应用->确定  d:初始化订阅复制监视器->发布服务器(zehuadb)->双击订阅->强制新建->下一步->选择启用的订阅服务器->zlp->下一步->下一步->下一步->下一步->完成  5:测试配置是否成功  复制监视器->发布衿?zehuadb)->双击sz:sz->点状态->点立即运行代理程序  查看:复制监视器->发布服务器(zehuadb)->sz:sz->选择zlp:sz(类型强制)->鼠标右键->启动同步处理  如果没有错误标志(红色叉),恭喜您配置成功  6:测试数据  在服务器执行:  选择一个表,执行如下sql:insertintowq_newsgroup_sselect'测试成功',5  复制监视器->发布服务器(zehuadb)->sz:sz->快照->启动代理程序->zlp:sz(强制)->启动同步处理  去查看同步的wq_newsgroup_s是否插入了一条新的记录  测试完毕,通过。  7:修改数据库的同步时间,一般选择夜晚执行数据库同步处理(具体操作略):d/*注意说明:服务器一端不能以(local)进行数据的发布与分发,需要先删除注册,然后新建注册本地计算机名称卸载方式:工具->复制->禁止发布->是在"zehuadb"上静止发布,卸载所有的数据库同步配置服务器注意:发布服务器、分发服务器中的sqlserveragent服务必须启动采用推模式:"d:\microsoftsqlserver\mssql\repldata\unc"目录文件可以不设置共享拉模式:则需要共享~!*/  少量数据库同步可以采用触发器实现,同步单表即可。  三、配置过程中可能出现的问题  在sqlserver2000里设置和使用数据库复制之前,应先检查相关的几台sqlserver服务器下面几点是否满足:  1、mssqlserver和sqlserveragent服务是否是以域用户身份启动并运行的(.\administrator用户也是可以的)如果登录用的是本地系统帐户local,将不具备网络功能,会产生以下错误:进程未能连接到distributor'@servername'(如果您的服务器已经用了sqlserver全文检索服务,请不要修改mssqlserver和sqlserveragent服务的local启动。会照成全文检索服务不能用。请换另外一台机器来做sqlserver2000里复制中的分发服务器。)修改服务启动的登录用户,需要重新启动mssqlserver和sqlserveragent服务才能生效。  2、检查相关的几台sqlserver服务器是否改过名称(需要srvid=0的本地机器上srvname和datasource一样)  在查询分析器里执行:usemasterselectsrvid,srvname,datasourcefromsysservers  如果没有srvid=0或者srvid=0(也就是本机器)但srvname和datasource不一样,需要按如下方法修改:usemastergo--设置两个变量declare@serverproperty_servernamevarchar(100),@servernamevarchar(100)--取得windowsnt服务器和与指定的sqlserver实例关联的实例信息select@serverproperty_servername=convert(varchar(100),serverproperty('servername'))--返回运行microsoftsqlserver的本地服务器名称select@servername=convert(varchar(100),@@servername)--显示获取的这两个参数select@serverproperty_servername,@servername--如果@serverproperty_servername和@servername不同(因为你改过计算机名字),再运行下面的--删除错误的服务器名execsp_dropserver@server=@servername--添加正确的服务器名execsp_addserver@server=@serverproperty_servername,@local='local'  修改这项参数,需要重新启动mssqlserver和sqlserveragent服务才能生效。  这样一来就不会在创建复制的过程中出现18482、18483错误了。  3、检查sqlserver企业管理器里面相关的几台sqlserver注册名是否和上面第二点里介绍的srvname一样  不能用ip地址的注册名。  (我们可以删掉ip地址的注册,新建以sqlserver管理员级别的用户注册的服务器名)  这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。  4、检查相关的几台sqlserver服务器网络是否能够正常访问  如果ping主机ip地址可以,但ping主机名不通的时候,需要在winnt\system32\drivers\etc\hosts(win2000)windows\system32\drivers\etc\hosts(win2003)    文件里写入数据库服务器ip地址和主机名的对应关系。例如:127.0.0.1localhost192.168.0.35oracledboracledb192.168.0.65fengyu02fengyu02202.84.10.193bj_dbbj_db  或者在sqlserver客户端网络实用工具里建立别名,例如:  5、系统需要的扩展存储过程是否存在(如果不存在,需要恢复):sp_addextendedproc'xp_regenumvalues',@dllname='xpstar.dll'gosp_addextendedproc'xp_regdeletevalue',@dllname='xpstar.dll'gosp_addextendedproc'xp_regdeletekey',@dllname='xpstar.dll'gosp_addextendedprocxp_cmdshell,@dllname='xplog70.dll'  接下来就可以用sqlserver企业管理器里[复制]->右键选择->[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了。  下面是按顺序列出配置复制的步骤:  1、建立发布和分发服务器[欢迎使用配置发布和分发向导]->[选择分发服务器]->[使"@servername"成为它自己的分发服务器,sqlserver将创建分发数据库和日志]->[制定快照文件夹]->[自定义配置]->[否,使用下列的默认配置]->[完成]  上述步骤完成后,会在当前"@servername"sqlserver数据库里建立了一个distribion库和一个distributor_admin管理员级别的用户(我们可以任意修改密码)。  服务器上新增加了四个作业:[代理程序历史记录清除:distribution][分发清除:distribution][复制代理程序检查][重新初始化存在数据验证失败的订阅]  sqlserver企业管理器里多了一个复制监视器,当前的这台机器就可以发布、分发、订阅了。  我们再次在sqlserver企业管理器里[复制]->右键选择->[配置发布、订阅服务器和分发]  我们可以在[发布服务器和分发服务器的属性]窗口->[发布服务器]->[新增]->[确定]->[发布数据库]->[事务]/[合并]->[确定]->[订阅服务器]->[新增]->[确定]  把网络上的其它sqlserver服务器添加成为发布或者订阅服务器.  新增一台发布服务器的选项:  我这里新建立的jin001发布服务器是用管理员级别的数据库用户test连接的,  到发布服务器的管理链接要输入密码的可选框,默认的是选中的,  在新建的jin001发布服务器上建立和分发服务器fengyu/fengyu的链接的时需要输入distributor_admin用户的密码。到发布服务器的管理链接要输入密码的可选框,也可以不选,也就是不需要密码来建立发布到分发服务器的链接(这当然欠缺安全,在测试环境下可以使用)。  2、新建立的网络上另一台发布服务器(例如jin001)选择分发服务器  [欢迎使用配置发布和分发向导]->[选择分发服务器]->使用下列服务器(选定的服务器必须已配置为分发服务器)->[选定服务器](例如fengyu/fengyu)->[下一步]->[输入分发服务器(例如fengyu/fengyu)的distributor_admin用户的密码两次]->[下一步]->[自定义配置]->[否,使用下列的默认配置]->[下一步]->[完成]->[确定]  建立一个数据库复制发布的过程:[复制]->[发布内容]->右键选择->[新建发布]->[下一步]->[选择发布数据库]->[选中一个待发布的数据库]->[下一步]->[选择发布类型]->[事务发布]/[合并发布]->[下一步]->[指定订阅服务器的类型]->[运行sqlserver2000的服务器]->[下一步]->[指定项目]->[在事务发布中只可以发布带主键的表]->[选中一个有主键的待发布的表]->[在合并发布中会给表增加唯一性索引和rowguidcol属性的唯一标识符字段[rowguid],默认值是newid()](添加新列将:导致不带列列表的insert语句失败,增加表的大小,增加生成第一个快照所要求的时间)->[选中一个待发布的表]->[下一步]->[选择发布名称和描述]->->[下一步]->[自定义发布的属性]->[否,根据指定方式创建发布]->[下一步]->[完成]->[关闭]  发布属性里有很多有用的选项:设定订阅到期(例如24小时)  设定发布表的项目属性:  常规窗口可以指定发布目的表的名称,可以跟原来的表名称不一样。  下图是命令和快照窗口的栏目  (sqlserver数据库复制技术实际上是用insert,update,delete操作在订阅服务器上重做发布服务器上的事务操作看文档资料需要把发布数据库设成完全恢复模式,事务才不会丢失但我自己在测试中发现发布数据库是简单恢复模式下,每10秒生成一些大事务,10分钟后再收缩数据库日志,这期间发布和订阅服务器上的作业都暂停,暂停恢复后并没有丢失任何事务更改)  发布表可以做数据筛选,例如只选择表里面的部分列:  例如只选择表里某些符合条件的记录,我们可以手工编写筛选的sql语句:  发布表的订阅选项,并可以建立强制订阅:  成功建立了发布以后,发布服务器上新增加了一个作业:[失效订阅清除]  分发服务器上新增加了两个作业:[jin001-dack-dack-5]类型[repl快照][jin001-dack-3]类型[repl日志读取器]  上面蓝色字的名称会根据发布服务器名,发布名及第几次发布而使用不同的编号  repl快照作业是sqlserver复制的前提条件,它会先把发布的表结构,数据,索引,约束等生成到发布服务器的os目录下文件(当有订阅的时候才会生成,当订阅请求初始化或者按照某个时间表调度生成)  repl日志读取器在事务复制的时候是一直处于运行状态。(在合并复制的时候可以根据调度的时间表来运行)  建立一个数据库复制订阅的过程:[复制]->[订阅]->右键选择->[新建请求订阅]->[下一步]->[查找发布]->[查看已注册服务器所做的发布]->[下一步]->[选择发布]->[选中已经建立发布服务器上的数据库发布名]->[下一步]->[指定同步代理程序登录]->[当代理程序连接到代理服务器时:使用sqlserver身份验证](输入发布服务器上distributor_admin用户名和密码)->[下一步]->[选择目的数据库]->[选择在其中创建订阅的数据库名]/[也可以新建一个库名]->[下一步]->[允许匿名订阅]->[是,生成匿名订阅]->[下一步]->[初始化订阅]->[是,初始化架构和数据]->[下一步]->[快照传送]->[使用该发布的默认快照文件夹中的快照文件](订阅服务器要能访问发布服务器的repldata文件夹,如果有问题,可以手工设置网络共享及共享权限)->[下一步]->[快照传送]->[使用该发布的默认快照文件夹中的快照文件]->[下一步]->[设置分发代理程序调度]->[使用下列调度]->[更改]->[例如每五分钟调度一次]->[下一步]->[启动要求的服务]->[该订阅要求在发布服务器上运行sqlserveragent服务]->[下一步]->[完成]->[确定]  成功建立了订阅后,订阅服务器上新增加了一个类别是[repl-分发]作业(合并复制的时候类别是[repl-合并])  它会按照我们给的时间调度表运行数据库同步复制的作业。  3、sqlserver复制配置好后,可能出现异常情况的实验日志:  1.发布服务器断网,sqlserver服务关闭,重启动,关机的时候,对已经设置好的复制没有多大影响中断期间,分发和订阅都接收到没有复制的事务信息  2.分发服务器断网,sqlserver服务关闭,重启动,关机的时候,对已经设置好的复制有一些影响中断期间,发布服务器的事务排队堆积起来(如果设置了较长时间才删除过期订阅的选项,繁忙发布数据库的事务日志可能会较快速膨胀),订阅服务器会因为访问不到发布服务器,反复重试我们可以设置重试次数和重试的时间间隔(最大的重试次数是9999,如果每分钟重试一次,可以支持约6.9天不出错)分发服务器sqlserver服务启动,网络接通以后,发布服务器上的堆积作业将按时间顺序作用到订阅机器上:会需要一个比较长的时间(实际上是生成所有事务的insert,update,delete语句,在订阅服务器上去执行)我们在普通的pc机上实验的58个事务100228个命令执行花了7分28秒.  3.订阅服务器断网,sqlserver服务关闭,重启动,关机的时候,对已经设置好的复制影响比较大,可能需要重新初试化我们实验环境(订阅服务器)从18:46分意外停机以,第二天8:40分重启动后,已经设好的复制在8:40分以后又开始正常运行了,发布服务器上的堆积作业将按时间顺序作用到订阅机器上,但复制管理器里出现快照的错误提示,快照可能需要重新初试化,复制可能需要重新启动.(我们实验环境的机器并没有进行快照初试化,复制仍然是成功运行的)  4、删除已经建好的发布和定阅可以直接用delete删除按钮  我们最好总是按先删定阅,再删发布,最后禁用发布的顺序来操作。  如果要彻底删去sqlserver上面的复制设置,可以这样操作:[复制]->右键选择[禁用发布]->[欢迎使用禁用发布和分发向导]->[下一步]->[禁用发布]->[要在"@servername"上禁用发布]->[下一步]->[完成禁用发布和分发向导]->[完成]我们也可以用t-sql命令来完成复制中发布及订阅的创建和删除,选中已经设好的发布和订阅,按属标右键可以[生成sql脚本]。(这里就不详细讲了,后面推荐的网站内有比较详细的内容)当你试图删除或者变更一个table时,出现以下错误server:msg3724,level16,state2,line1cannotdropthetable'object_name'becauseitisbeingusedforreplication.比较典型的情况是该table曾经用于复制,但是后来又删除了复制。处理法:select*fromsysobjectswherereplinfo>'0'sp_configure'allowupdates',1goreconfigurewithoverridegobegintransactionupdatesysobjectssetreplinfo='0'wherereplinfo>'0'committransactiongorollbacktransactiongosp_configure'allowupdates',0goreconfigurewithoverridego 参考技术A 代码杂乱不堪,你只把sql语句放出来就可以了追问

还是编码的问题,因为除了查询条件外,上面的语句也有中文,但是可以查出来数据,就没有考虑中文编码问题,后来整个代码全部转成了gbk,没有问题了

本回答被提问者采纳

PHP基础学习记录以及使用PHP搭建 “最最简单” 的留言板

学习php前,应当对html和css有简单的基础了解,可以参考: HTML和CSS简单学习整理。安装环境的话windows可以参考: PHP——学前知识储备与环境选择。不过这里笔者是以linux为学习环境,linux的环境搭建参考: 从入坑到不放弃-----centos7系统软件安装方法及网站环境搭建
本博文的重点在于语法学习和PHP表单,文件的处理

PHP基础语法(理解)

语法部分参考于菜鸟教程:https://www.runoob.com/php/php-syntax.html

PHP 脚本可以放在文档中的任何位置。
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。

PHP变量

<?php
$x=1;
$y=2;
$z=$x+$y;
echo $z;
?>//运行结果为3

PHP 变量规则:
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)

PHP global 关键字

global 关键字用于函数内访问全局变量

<?php
$x=1;
$y=2;
function myTest()
{
    global $x,$y;
    $y=$x+$y;
}
myTest();
echo $y; // 输出 3
?>
//或者写成下面这样也可
/*<?php
$x=1;
$y=2;
function myTest()
{
    $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 
myTest();
echo $y;//输出 3
?>*/

Static 作用域

当一个函数完成时,它的所有变量通常都会被删除。如果希望某个局部变量不要被删除,请在第一次声明变量时使用 static 关键字

<?php
function myTest()
{
    static $x=0;
    echo $x;
    $x++;
    echo PHP_EOL;    // 换行符
}
 
myTest();
myTest();
myTest();
?>//输出结果为 0, 1, 2
//该变量仍然是函数的局部变量。

echo 语句

<?php
$test1="冰冰雪聪明";
$test2="胖头鱼";
$bingbing=array("孩怕","咕咕","哒咩");
echo $test1;
echo "<br>";
echo "冰冰说 $test2 好吃";
echo "<br>";
echo "我有一点 {$bingbing[0]}";
?>
/*上述代码运行结果
冰冰雪聪明
冰冰说 胖头鱼 好吃
我有一点 孩怕
*/

PHP 定界符 EOF
PHP EOF是一种在命令行 shell 和程序语言里定义一个字符串的方法。
EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。

<?php
$name="bingbing";
$a= <<<EOF
        "wang"$name
        "123456789"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
/*
运行结果
 "wang"bingbing
        "123456789"

*/

整型

<?php 
$x = 6666;
var_dump($x);
echo "<br>"; 
$x = -1; // 负数
var_dump($x);
echo "<br>"; 
$x = 0x2C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 035; // 八进制数
var_dump($x);
?>  
 
/*
PHP var_dump() 函数
var_dump() 函数用于输出变量的相关信息。
上面代码的运行结果

int(6666)

int(-1)

int(44)

int(29)
   

*/

浮点型

<?php 
$x = 3.1415926;
var_dump($x);
echo "<br>"; 
$x = 1.1e2;
var_dump($x);
echo "<br>"; 
$x = 2E-5;
var_dump($x);
?>

/*
上面的代码运行结果
float(3.1415926)

float(110)

float(2.0E-5)

*/

NULL 值
NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。

<html>
<body>
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
</body>
</html>

/*
运行结果为:NULL
*/

类型比较

松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。

常量

<?php
define("BINGBING", "不愧是我王冰冰");
function myTest() 
{
    echo BINGBING;
} 
myTest();    // 输出 "不愧是我王冰冰"
?>
/*
上述的运行结果:不愧是我王冰冰
*/

字符串变量

<?php
$txt="Hello world!";
echo $txt;
?>
/*
输出为 Hello world!
*/
<?php
echo strlen("Hello world!");
?>
/*
strlen() 函数返回字符串的长度(字节数)
上面的代码将输出:12
*/
<?php
echo strpos("Hello world!","world");
?>
/*
上面的代码将输出:6
strpos() 函数用于在字符串内查找一个字符或一段指定的文本
*/

数组

<?php
$bingbing=array("i","love","bingbing");
echo $bingbing[0] . "  " . $bingbing[1] . "   " . $bingbing[2] . ".";
?>
/*
运行结果
i  love   bingbing.
*/
<?php
$bingbing=array("i ","love","bingbing");
echo count($bingbing);
?>
/*
获取数组的长度 - count() 函数
上面的代码运行结果为: 3
*/

关联数组

<?php
$age=array("bingbing"=>"18","Ben"=>"37","Joe"=>"43");
echo "bingbing is " . $age['bingbing'] . " years old.";
?>

/*
运行结果 :bingbing is 18 years old.
关联数组是使用分配给数组的指定的键的数组
*/

遍历关联数组

<?php
$age=array("bingbing"=>"18","xiaolang"=>"100","makabaka"=>"20");

foreach($age as $x=>$x_value)
{
    echo "name=" . $x . ", old=" . $x_value;
    echo "<br>";
}
?>
/*
运行结果:
name=bingbing, old=18
name=xiaolang, old=100
name=makabaka, old=20

遍历并打印关联数组中的所有值,使用 foreach 循环
*/

数组排序
参考链接:https://www.runoob.com/php/php-ref-array.html

sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列

<?php
$bingbing=array("c","b","a"); 
sort($bingbing); 
print_r($bingbing);
?>
/*
运行结果
Array
(
    [0] => a
    [1] => b
    [2] => c
)
对数组进行升序排列
*/
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); 
asort($age); 
print_r($age); 
?>
/*
上述代码运行结果: Array ( [Peter] => 35 [Ben] => 37 [Joe] => 43 )
*/
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
arsort($age);
?>
/*
运行结果:Array ( [Joe] => 43 [Ben] => 37 [Peter] => 35 )
arsort() - 根据数组的值,对数组进行降序排列
*/

超级全局变量
$GLOBALS

<?php 
$x = 1; 
$y = 2;
function addition() 
{ 
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
addition(); 
echo $z; 
?>
/*
运行结果: 3
*/

$_REQUEST
用于收集HTML表单提交的数据。

<!DOCTYPE html>
<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php 
$name = htmlspecialchars($_REQUEST['fname']); 
echo $name; 
?>

</body>
</html>


更多参考:https://www.runoob.com/php/php-superglobals.html

PHP实现冒泡排序

<?php
$arr = array(3,1,4,1,5,9,2,6);
for($i = count($arr)-1;$i>=0;$i--)
{
    for($j = 0 ; $j < $i ; $j++)
	{
        if($arr[$j+1] > $arr[$j] )
		{
            $aa = $arr[$j+1];
            $arr[$j+1] = $arr[$j];
            $arr[$j] = $aa;
        }
    }
}
print_r($arr);
?>

运行结果:

函数
在 PHP 中,提供了超过 1000 个内建的函数,参考连接:https://www.runoob.com/php/php-ref-array.html

<?php
function writeName($fname,$punctuation)
{
    echo $fname . " 皮卡皮卡" . $punctuation . "<br>";
} 
 
echo "她的名字是 :";
writeName("冰冰",".");
echo "她的另一个名字 : ";
writeName("胖头鱼","!");
echo "她还有一个名字是 :";
writeName("吃花椒的喵酱","!!!");
?>


返回值

<?php
function add($x,$y)
{
    $total=$x+$y;
    return $total;
}
echo "1 + 2 = " . add(1,2);
?>
/*
运行结果:1 + 2 = 3
*/

命名空间
参考链接:https://www.php.net/manual/zh/language.namespaces.rationale.php
命名空间一个最明确的目的就是解决重名问题,命名空间将代码划分出不同的空间,每个空间的常量、函数、类的名字互不影响, 类似于‘封装’的概念。

<?php
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

namespace AnotherProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
?>
<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // 全局代码
session_start();
$a = MyProject\\connect();
echo MyProject\\Connection::start();
}
?>
/*
将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来
*/

子命名空间

<?php
namespace MyProject\\Sub\\Level;  //声明分层次的单个命名空间

const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }

?>
/*
命名空间的名字可以使用分层次的方式定义
*/

命名空间使用

/*file1.php 文件代码*/
<?php
namespace Foo\\Bar\\subnamespace; 

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}
?>
/*file2.php 文件代码*/
<?php
namespace Foo\\Bar;
include 'file1.php';

const FOO = 2;
function foo() {}
class foo
{
    static function staticmethod() {}
}

/* 非限定名称 */
foo(); // 解析为函数 Foo\\Bar\\foo
foo::staticmethod(); // 解析为类 Foo\\Bar\\foo ,方法为 staticmethod
echo FOO; // 解析为常量 Foo\\Bar\\FOO

/* 限定名称 */
subnamespace\\foo(); // 解析为函数 Foo\\Bar\\subnamespace\\foo
subnamespace\\foo::staticmethod(); // 解析为类 Foo\\Bar\\subnamespace\\foo,
                                  // 以及类的方法 staticmethod
echo subnamespace\\FOO; // 解析为常量 Foo\\Bar\\subnamespace\\FOO
                                  
/* 完全限定名称 */
\\Foo\\Bar\\foo(); // 解析为函数 Foo\\Bar\\foo
\\Foo\\Bar\\foo::staticmethod(); // 解析为类 Foo\\Bar\\foo, 以及类的方法 staticmethod
echo \\Foo\\Bar\\FOO; // 解析为常量 Foo\\Bar\\FOO
?>

命名空间和动态语言特征
PHP 命名空间的实现受到其语言自身的动态特征的影响,所以要动态访问命名部分的元素。
example1.php 文件代码:

<?php
class classname
{
    function __construct()
    {
        echo __METHOD__,"\\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\\n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\\n"; // prints global
?>

动态访问命名空间的元素

<?php
namespace namespacename;
class classname
{
    function __construct()
    {
        echo __METHOD__,"\\n";
    }
}
function funcname()
{
    echo __FUNCTION__,"\\n";
}
const constname = "namespaced";

include 'example1.php';

$a = 'classname';
$obj = new $a; // 输出 classname::__construct
$b = 'funcname';
$b(); // 输出函数名
echo constant('constname'), "\\n"; // 输出 global

/* 如果使用双引号,使用方法为 "\\\\namespacename\\\\classname"*/
$a = '\\namespacename\\classname';
$obj = new $a; // 输出 namespacename\\classname::__construct
$a = 'namespacename\\classname';
$obj = new $a; // 输出 namespacename\\classname::__construct
$b = 'namespacename\\funcname'001thinkphp开发环境搭建

phpstudy提示要安装zend该怎么办?

在MAC上利用Docker镜像搭建PHP5.2开发环境

为 PHP5.2- 框架提供 PHP5.3+ 命名空间的类名别名

windows 12 server 怎么 配置 php 环境

RedHat5.7+ice3.4.2+php5.2.17+nginx1.8.1环境配置