php获取文件夹下所有文件,包含子文件夹

貌似php5.3新增了一些新的方法来实现,如 RecursiveIteratorIterator 、 scandir

不过这里还是用最土的方法实现。

/**
 * 获取文件夹下所有文件
 * @param $directory 需要获取的文件夹
 * @param bool $recursive 是否递归获取子文件夹
 * @return array
 */
function directoryToArray($directory, $recursive = false) {
	$array_items = array();
	if(!is_dir($directory)) return "$directory folder does not exist";
	if ($handle = opendir($directory)) {
		while (false !== ($file = readdir($handle))) {
			if ($file != "." && $file != "..") {
				if (is_dir($directory. "/" . $file)) {
					if($recursive) {
						$array_items = array_merge($array_items, directoryToArray($directory. "/" . $file, $recursive));
					}
					$file = $directory . "/" . $file;
					$array_items[] = preg_replace("/\/\//si", "/", $file);
				} else {
					$file = $directory . "/" . $file;
					$array_items[] = preg_replace("/\/\//si", "/", $file);
				}
			}
		}
		closedir($handle);
	}
	return $array_items;
}

调用方法:

$files = directoryToArray('../project/353438199e',true);
var_dump($files);

wampp的alias使用mod_rewrite

使用wampp新建alias的时候,默认是无法使用mod_rewrite模块。

需要做一些配置:

1、wampp开启mod_rewrite

1

2、在alias配置文件里加入如下代码,请自行根据情况修改。

Alias /labs/ "E:/ecc_ecd_rep/labs_proj/trunk/" 

<Directory "E:/ecc_ecd_rep/labs_proj/trunk/">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order deny,allow
    allow from all
</Directory>

其中关键的是这句 AllowOverride All 允许使用mod_rewrite模块

3、在.htaccess文件中,需要使用 RewriteBase ,不然rewrite无法生效。

举个例子:

RewriteEngine On

# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
RewriteBase /labs/jdpat/import/api/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

加上这句 RewriteBase /labs/jdpat/import/api/ 即可。

php通过正则提取页面相关信息

1、获取页面标题

<?php
//提取标题
preg_match('/<title>(?<title>.*?)<\/title>/i', $html, $titleArr);
$title = $titleArr['title'];
?>

2、获取body主体内容,并将背景图片提取出来替换成其他图片地址

/**
 * 获取BODY主体区域内容
 * @param $html
 * @param $urlRoot
 * @return mixed
 */
function getBody($html,$urlRoot = null){
	//提取BODY主体
	preg_match('/<!--body-->(.*?)<!--body-->/is ', $html, $bodyArr);
	if(!$bodyArr){
		preg_match('/<body.*?>(.*?)<\/body>/is ', $html, $bodyArr);
	}
	$body = $bodyArr[1];
	//替换img文件
	$body =  preg_replace('/(<[img|IMG].*src=[\'|"])(\.\.\/)*(img.[^\'||^"]+)/',"$1$urlRoot$3",$body);
	//替换html文件内的css背景图片
	$body =  preg_replace('~\b(background(-image)?\s*:(.*?)\(\s*[\'|"]?)(\.\.\/)*(img.*?)?\s*\)~i',"$1$urlRoot$5)",$body);
	return $body;
}

3、提取页面Description内容

function getDescription($html){
	// Get the 'content' attribute value in a <meta name="description" ... />
	$matches = array();

	// Search for <meta name="description" content="Buy my stuff" />
	preg_match('/<meta.*?name=("|\')description("|\').*?content=("|\')(.*?)("|\')/i', $html, $matches);
	if (count($matches) > 4) {
		return trim($matches[4]);
	}

	// Order of attributes could be swapped around: <meta content="Buy my stuff" name="description" />
	preg_match('/<meta.*?content=("|\')(.*?)("|\').*?name=("|\')description("|\')/i', $html, $matches);
	if (count($matches) > 2) {
		return trim($matches[2]);
	}

	// No match
	return null;
}

4、替换css文件的背景图片地址

/**
 * 获取CSS内容
 * @param $cssCnt
 * @param $urlRoot
 * @return mixed
 */
function getCss($cssCnt,$urlRoot =null){
	//匹配包含 img文件夹的相对路径图片 (含义绝对路径的不包含在其中)
	//匹配替换不一定准确,因为只是将 含义 ../ 的地址转为url 而没有考虑 ../../ 之类的层级关系
	$css =  preg_replace('~\b(background(-image)?\s*:(.*?)\(\s*[\'|"]?)(\.\.\/)*(img.*?)?\s*\)~i',"$1$urlRoot$5)",$cssCnt);
	//添加css前缀
	$css =  preg_replace('/\b.(.*?)[,|{]/',"pat .$0",$cssCnt);
	//TODO 压缩css
	return $css;
}

CentOS VPS硬盘挂载操作

有些VPS 默认没有帮你挂载硬盘,这时你的VPS默认空间是很小的。挂载硬盘 实际就相当于你接了个移动硬盘来扩容。 
而硬盘挂载操作也比较简单,主要就是以下几句代码:

mkdir  /mnt/sdb
mkfs.ext3    /dev/xvdb1
mount /dev/xvdb1 /mnt/sdb

那么接下来,详细记录一下硬盘挂载的步骤。

1. 添加磁盘,查看磁盘状况

fdisk -l

2. 用fdisk 对/dev/xvdb进行分区

fdisk /dev/xvdb

说明:通过第一步查看了硬盘名称后,再对相应的硬盘座分区。 
然后看着说明依次输入n、p、1、w 四个步骤。(详细请看文章后面的步骤过程)

3. 格式化 /dev/xvdb1 分区

mkfs -t ext3 /dev/xvdb1

4. 创建目录 并将 /dev/sdb1 挂在到该目录下


mkdir /mnt/sdb
mount /dev/xvdb1 /mnt/sdb

5. 验证挂载是否成功

df -k

6. 设置开机自动挂载

vi /etc/fstab

这里用Vi命令进行文件编辑 
/dev/xvdb1 41279536 180240 39002416 1% /mnt/sdb

以下是我的完整操作流程记录:

[root@MyCloudServer ~]# fdisk -l

Disk /dev/xvdb: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/xvdb doesn't contain a valid partition table

Disk /dev/xvda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

	Device Boot	  Start		 End	  Blocks   Id  System
/dev/xvda1   *		   1		  13	  104391   83  Linux
/dev/xvda2			  14		1044	 8281507+  8e  Linux LVM
/dev/xvda3			1045		1305	 2096482+  8e  Linux LVM

[root@MyCloudServer ~]

# fdisk /dev/xvdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won’t be recoverable. The number of cylinders for this disk issetto 5221. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): p Disk /dev/xvdb: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-5221, default 1): Usingdefault value 1 Last cylinder or +size or +sizeM or +sizeK (1-5221, default 5221): Usingdefault value 5221 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.

[root@MyCloudServer ~]

# fdisk -l Disk /dev/xvdb: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvdb1 1 5221 41937651 83 Linux Disk /dev/xvda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda1 * 1 13 104391 83 Linux /dev/xvda2 14 1044 8281507+ 8e Linux LVM /dev/xvda3 1045 1305 2096482+ 8e Linux LVM

[root@MyCloudServer ~]

# mkfs -t ext3 /dev/xvdb1 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 5242880 inodes, 10484412 blocks 524220 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0 320 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 36 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@MyCloudServer ~]

# ls

[root@MyCloudServer ~]

# cd /

[root@MyCloudServer /]

# ls bin dev home lost+found misc net proc sbin srv tmp var boot etc lib media mnt opt root selinux sys usr

[root@MyCloudServer /]

# mount /dev/xvdb1 /mnt/sdb mount: mount point /mnt/sdb does not exist

[root@MyCloudServer /]

# cd mnt/sdb -bash: cd: mnt/sdb: 没有那个文件或目录

[root@MyCloudServer /]

# cd mnt/

[root@MyCloudServer mnt]

# ls xs-tools

[root@MyCloudServer mnt]

# mkdir sdb

[root@MyCloudServer mnt]

# mount /dev/xvdb1 /mnt/sdb

[root@MyCloudServer mnt]

# df -k 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/mapper/VolGroup00-LogVol00 9743696 1425864 7814872 16% / /dev/xvda1 101086 44628 51239 47% /boot tmpfs 524380 0 524380 0% /dev/shm /dev/xvdb1 41279536 180240 39002416 1% /mnt/sdb

[root@MyCloudServer mnt]

# vi /etc/fstab

CentOS VPS手工安装apache、php流程记录

apache安装步骤

1、操作系统更新,先将系统内核更新到最新版,这步可以省略。

yum -y update

2、CentOS默认有了apache的,直接运行安装:

yum -y install httpd

3、安装apache扩展

yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

4、默认安装的话,中文是有乱码问题的,需要修改配置文件

#用VI命令修改
vi /etc/httpd/conf/httpd.conf

找到 AddDefaultCharset UTF-8 并改为 AddDefaultCharset Off 
PS:vi的查找可以输入:/AddDefaultCharset 然后按回车。

修改完后,紧接着下一行添加以下代码:

AddCharset us-ascii.ascii .us-ascii

AddCharset ISO-8859-1  .iso8859-1  .latin1

AddCharset ISO-8859-2  .iso8859-2  .latin2 .cen

AddCharset ISO-8859-3  .iso8859-3  .latin3

AddCharset ISO-8859-4  .iso8859-4  .latin4

AddCharset ISO-8859-5  .iso8859-5  .cyr .iso-ru

AddCharset ISO-8859-6  .iso8859-6  .arb .arabic

AddCharset ISO-8859-7  .iso8859-7  .grk .greek

AddCharset ISO-8859-8  .iso8859-8  .heb .hebrew

AddCharset ISO-8859-9  .iso8859-9  .latin5 .trk

AddCharset ISO-8859-10  .iso8859-10  .latin6

AddCharset ISO-8859-13  .iso8859-13

AddCharset ISO-8859-14  .iso8859-14  .latin8

AddCharset ISO-8859-15  .iso8859-15  .latin9

AddCharset ISO-8859-16  .iso8859-16  .latin10

AddCharset ISO-2022-JP .iso2022-jp .jis

AddCharset ISO-2022-KR .iso2022-kr .kis

AddCharset ISO-2022-CN .iso2022-cn .cis

AddCharset Big5.Big5   .big5 .b5

AddCharset cn-Big5 .cn-big5

# For russian, more than one charset is used (depends on client, mostly):

AddCharset WINDOWS-1251 .cp-1251   .win-1251

AddCharset CP866   .cp866

AddCharset KOI8  .koi8

AddCharset KOI8-E  .koi8-e

AddCharset KOI8-r  .koi8-r .koi8-ru

AddCharset KOI8-U  .koi8-u

AddCharset KOI8-ru .koi8-uk .ua

AddCharset ISO-10646-UCS-2 .ucs2

AddCharset ISO-10646-UCS-4 .ucs4

AddCharset UTF-7   .utf7

AddCharset UTF-8   .utf8

AddCharset UTF-16  .utf16

AddCharset UTF-16BE .utf16be

AddCharset UTF-16LE .utf16le

AddCharset UTF-32  .utf32

AddCharset UTF-32BE .utf32be

AddCharset UTF-32LE .utf32le

AddCharset euc-cn  .euc-cn

AddCharset euc-gb  .euc-gb

AddCharset euc-jp  .euc-jp

AddCharset euc-kr  .euc-kr

#Not sure how euc-tw got in - IANA doesn't list it???

AddCharset EUC-TW  .euc-tw

AddCharset gb2312  .gb2312 .gb

AddCharset iso-10646-ucs-2 .ucs-2 .iso-10646-ucs-2

AddCharset iso-10646-ucs-4 .ucs-4 .iso-10646-ucs-4

AddCharset shift_jis   .shift_jis .sjis

5、修改hosts配置文件,需要在127.0.0.1这个ip上加入对应的主机名,

#查看vps主机名
hostname
#然后将本机的真实hostname输入到hosts文件
#vi /etc/hosts
#然后在这里加入127.0.0.1   localhost.localdomain   localhost   <strong>XX(主机名)</strong>
#如我的hostname是MyVPS
#则是127.0.0.1   localhost.localdomain   localhost   MyVPS

6、配置虚拟站点 
CentOS 默认没有这个文件,要手动添加

vi /etc/httpd/conf.d/vhost.conf

然后输入你的域名等信息,如果有多个的话,也是加在这个文件

NameVirtualHost *:80

<VirtualHost *:80>

	ServerAdmin webmaster@www.ghugo.com

	DocumentRoot /var/www/html/ghugo.com

	ServerName www.ghugo.com

	<Directory "/var/www/html/ghugo.com">

		 #  AllowOverride AuthConfig

		 #  Options Indexes

		 AllowOverride all

		 Order Deny,Allow

		 Deny from all

		 Allow from all

	</Directory>

	DirectoryIndex index.php

	ErrorLog logs/test.testweb.com-error_log

	CustomLog logs/test.testweb.com-access_log common

</VirtualHost>

然后保存并退出

:wq

apache已经安装完毕,接下来安装php。

php安装步骤 
1、输入安装命令:

yum -y install httpd php

2、安装php扩展

yum -y install php-gd php-xml php-mbstring php-ldap php-pear

3、启动apache 完成所有安装

/etc/init.d/httpd start

至此,所有安装已经完毕,不出意外的话,应该可以正常运行了。

可能遇到的问题: 
关于httpd 启动的问题no listening sockets available, shutting down

参考资料: 
http://blog.csdn.net/zqlee1216/article/details/6578841

mongodb 入门:安装

mongodb 之前听说过很久,一直没去试试。这几天正好有空,就随手搭了一个。

MongoDB的官网是: http://www.mongodb.org/

介绍啥的客套话也不多说了,网上一搜一大把。

先说下如何安装:

1、MongoDB最新版本下载在官网的DownLoad菜单下:http://www.mongodb.org/downloads ,找到对应的电脑版本下载。

2、解压mongodb-win32-i386-1.8.1.zip (下载后的压缩包,可能名称会不一样),创建路径C:\Program Files\mongodb ,将解压后的Bin文件Copy to 此文件夹下

3、C:\Program Files\mongodb 下建立Data文件夹 C:\Program Files\mongodb\data ,然后分别建立db,log两个文件夹,至此mongodb下有以下文件夹

C:\Program Files\mongodb\bin

C:\Program Files\mongodb\data\db

C:\Program Files\mongodb\data\log

在log文件夹下创建一个日志文件MongoDB.log,即C:\Program Files\mongodb\data\log\MongoDB.log

完成以上工作后,你为奇怪为什么要建立这些文件夹(因为,Mongodb安装需要这些文件夹,默认安装是不用创建,但是文件都为安装到C:\data\下)

4、以上方式做好后,接下来就开始启动MongoDB了。启动的方式很多,这里只介绍 windows service 的方式进行启动。因为这个比较方便哈!

运行cmd.exe

cd C:\Program Files\mongodb\bin

> C:\Program Files\mongodb\bin> mongod –dbpath “C:\Program Files\mongodb\data\db” –logpath “C:\Program Files\mongodb\data\log\MongoDB.log” –install –serviceName “MongoDB”

这里MongoDB.log就是开始建立的日志文件,–serviceName “MongoDB” 服务名为MongoDB

运行命令成功为如下图:

引时服务已经安装成功,运行

>NET START MongoDB   (开启服务)

>NET stop MongoDB   (关闭服务)

这时,MongoDB就成功启动了。

5、测试一下效果。

还是继续那个cmd界面

> cd C:\Program Files\mongodb\bin> mongo

会出现如下界面,说明已经启动成功了。

1

也可以直接在浏览器上输入以下地址: http://localhost:27017/ ,可以看到如下提示: 
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number

说明成功启动了。

6、接下来输入几段代码测试下数据库:

>db.foo.insert({a:1})    //(往foo表插入a,1字段值,foo表为默认表)

>db.foo.find()                //(查看foo表数据)

如下图:

2

7、可视化工具

以上都是操作命令行代码,不像mysql、SqlServer那些有可视化的客户端工具可以查看数据库内容。

在mongoDB官网也推荐了几款可视化的工具: http://docs.mongodb.org/ecosystem/tools/administration-interfaces/

大家可以选择自己感兴趣的下载使用就行。我这里下载了 mongovue 来体验,下载地址: http://www.mongovue.com/downloads/

下载后解压安装,然后运行 mongovue ,首次使用,需要创建用户,及连接数据库。(PS:貌似这款还是收费的,呵呵,不管了,先体验,晚点找个破解版)

3

8、最后体验完了,停止MongoDB

最稳妥的方式,处理完当前所有操作并将缓存的数据保存到磁盘上才停止

>user admin

>db.shutdownServer();

当然我们也可以直接关闭进程,但这种方式会导致缓存中的数据未急时刷新保存到磁盘上而丢失。

VPS安装到绑定多域名 过程

VPS安装到绑定多域名 过程

1、一个全新的VPS,是centOS的linux系统。首先需要安装Linux+Nginx+Mysql+PH环境。 
安装LNMP可查看文章: http://lnmp.org/install.html

2、安装完环境之后,需要绑定域名,绑定域名操作可查看: http://www.btdou.com/lnmp-vhost.html

3、绑定域名后,需要将文件上传至对应的文件夹,默认是/home/wwwroot/你绑定的域名/,上传可以搭建个ftp服务器,也可以用wget命令。 
由于我有另外的虚拟空间,我将网站源码通过那个空间的ftp上传后,然后调用如下命令:

wget http://xxx/com/temp.zip && unzip temp.zip

这句的命令意思是服务器从url上下载文件,然后执行解压操作。注意这个命令要在你域名对应的文件夹下进行。

4、修改404页面: 
由于网站设置需要404页面的支持,编辑你需要添加404页面的网站的conf文件,对应在 usr/local/nginx/conf/vhost/XXXX.com.conf,在server区域添加代码; 
代码如下:

error_page 404 = /404.php;

然后重启

/usr/local/nginx/sbin/nginx -s reload

5、这里说到修改,可以使用vi命令,vi命令常用语法可查看文章: http://my.oschina.net/aiguozhe/blog/35358 
一般vi 文件名,进入后按“a”,修改完后按“esc”,然后按“:wq” 保存退出!

6、修改多域名绑定: 
由于我购买的是多ip的VPS,我可以用不同的域名绑定不同的IP,这个设置页是对应在

usr/local/nginx/conf/vhost/XXXX.com.conf

, 
找到listen 80 改错 listen ip:80 
然后重启

/usr/local/nginx/sbin/nginx -s reload

自此,整个安装过程就结束了,如果全程都没错误的话,打开你的网站运行即可。

扩展阅读: 
http://www.kwx.gd/ 
http://lnmp.org/

mysql group by 无数据补0 方法

来看下这个SQL,这个SQL的意思是获取需求ID的数量及需求价格 并按需求类型分组显示。

SELECT `require_type_id` , COUNT(  `require_id` ) AScount,
SUM(  `require_final_cost` ) ASprice
FROM `tb_require`
WHEREDATE_FORMAT(  `require_start_date` ,  '%Y-%m') = DATE_FORMAT(  '2012-10-1',  '%Y-%m')
GROUPBY  `require_type_id`
1

得到如下数据:

但是没有数据的部分就无法显示出来了。

如果要将group by的数据显示完整,没有数据的字段显示0,可以使用子查询和 右连接查询。

改造的sql语句如下:

SELECTtb_type.`type_id` , IF(countIS NULL , 0, count) ascount  ,
IF(price ISNULL , 0, price) asprice
FROM
(select`require_type_id`,count(`require_id`) ascount  ,
sum(`require_final_cost`) asprice
FROMtb_require
wheredate_format(`require_start_date`,'%Y-%m')=  date_format('2012-10-1','%Y-%m')
GROUPBY `require_type_id`) indTable
RIGHTJOIN `tb_type` onindTable.`require_type_id` = `tb_type`.`type_id`
2

这样得到的数据则包含tb_type表所有的字段内容了。

这种方式适用于两个现有的表进行联合查询,但是有时候我们需要按日期进行分组。这个时候我们就需要创建个日期表了。
一个例子:

新建一个week表 week(id) 就是1-53

然后,采用连接查询。

SELECTweek.id , IF(amount ISNULL , 0, amount)
 
FROM
(SELECTWEEKOFYEAR(时间) AsperWeek  ,SUM(数量) ASamount FROM你的表 GROUPBY perWeek) indTable 
 
RIGHTJOIN week onindTable.perWeek = week.id;

除了if也可以用case then.

SELECT  CASE when c.co IS NULL then 0 else c.co END count,b.id,b.contact_name,b.team_name FROM team b
LEFT JOIN (SELECT count(*) co,a.team_id FROM member_team a GROUP BY a.team_id) c ON b.id = c.team_id

mysql语句:批量更新多条记录的不同值

mysql更新语句很简单,更新一条数据的某个字段,一般这样写:

UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';

如果更新同一字段为同一个值,mysql也很简单,修改下where即可:

UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');

这里注意 ‘other_values’ 是一个逗号(,)分隔的字符串,如:1,2,3

那如果更新多条数据为不同的值,可能很多人会这样写:

foreach ($display_order as $id => $ordinal) {
    $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";
    mysql_query($sql);
}

即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。

那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

UPDATE mytable
    SET myfield = CASE id
        WHEN 1 THEN 'value'
        WHEN 2 THEN 'value'
        WHEN 3 THEN 'value'
    END
WHERE id IN (1,2,3)

这里使用了case when 这个小技巧来实现批量更新。
举个例子:

UPDATE categories
    SET display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END
WHERE id IN (1,2,3)

这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

如果更新多个值的话,只需要稍加修改:

UPDATE categories
    SET display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END,
    title = CASE id
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

到这里,已经完成一条mysql语句更新多条记录了。
但是要在业务中运用,需要结合服务端语言,这里以php为例,构造这条mysql语句:

$display_order = array(
    1 => 4,
    2 => 1,
    3 => 2,
    4 => 3,
    5 => 9,
    6 => 5,
    7 => 8,
    8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
    $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;

这个例子,有8条记录进行更新。代码也很容易理解,你学会了吗?