EMLOG学院

SQL语句(LIKE模糊查询)

摘要: 昨天晚上需要实现这样一个功能,在e...

昨天晚上需要实现这样一个功能,在echo_list.php中根据文章ID输出文章附件中的图片。

首先是根据文章ID输出附件中的图片,这个很简单,而且已经有很多前辈们写出函数了,如下:


<?php
//Custom: 获取附件第一张图片
function getThumbnail($blogid){
$db = MySql::getInstance();
$sql = "SELECT * FROM ".DB_PREFIX."attachment WHERE blogid=".$blogid." AND (`filepath` LIKE '%jpg' OR `filepath` LIKE '%gif' OR `filepath` LIKE '%png') ORDER BY `aid` ASC LIMIT 0,1";
//die($sql);
$imgs = $db->query($sql);
$img_path = "";
while($row = $db->fetch_array($imgs)){
$img_path .= BLOG_URL.substr($row['filepath'],3,strlen($row['filepath']));
}
return $img_path;
}
?> 
不过这里有一个问题,就是在后台上传图片后写入数据库的不仅仅只有一张图片,而是同样名称的两张图片,一张大图,一张缩略图,那么现在问题来了。


假如一篇文章插入了两张图片,分别是11.jpg,1.jpg。那么它插入数据库后应该是有四张图片,两张原图和两张剪裁后的缩略图,而我要的是两张原图,不需要缩略图,下图是插入数据库后的四张图片:

4.png

上图第一个字段是自增字段,第二个字段是文章ID,第三个字段是图片名称,第四个字段是文件大小,第五个字段是图片地址。

可以看到最上边的函数根据文章ID取出来的是附件中的第一张图片,如果多取几张的话很明显包括原图,缩略图都会取出来,所以这里用了LIKE模糊查询。

以下是修改后的函数:


<?php
//Custom: 获取附件大图
function BLOG_IMG($blogid){
$db = MySql::getInstance();
$sql = "SELECT * FROM ".DB_PREFIX."attachment WHERE blogid=".$blogid." AND (`filepath` NOT LIKE '%-%' ) AND (`filepath` LIKE '%jpg' OR `filepath` LIKE '%gif' OR `filepath` LIKE '%png') ORDER BY `aid` ASC LIMIT 0,6";
//die($sql);
$imgs = $db->query($sql);
$img_path = "";
while($row = $db->fetch_array($imgs)){
$img_path .= '<a id="ematt:404" href="'.BLOG_URL.substr($row['filepath'],3,strlen($row['filepath'])).'" target="_blank" rel="lytebox[vacation]"><img border="0" width="31%" height="250" src="'.BLOG_URL.substr($row['filepath'],3,strlen($row['filepath'])).'" data-bd-imgshare-binded="1"></a>';
}
return $img_path;
}
?> 
相比第一个函数而言它多了一个WHERE条件,AND (`filepath` NOT LIKE '%-%' )其中这个LIKE '%-%'表示查询数据库中带“-”的字符串,因为通过观察发现原图的地址和缩略图的地址有个区别,所有的缩略图地址都有“thum-”,继而我们只需要把这个带“-”的剔出来即可。而LIKE前面的NOT则是相反的意思,也就是把所有地址中不带“-”的图片地址列出来,这样查询出来的图片地址就必然是原图地址了。



最后说一下LIKE的一些说明:


SQL语句中的模糊查询 LIKE

SQL语句中的模糊查询 LIKE
LIKE 关键字搜索与指定模式匹配的字符串、日期或时间值。LIKE 关键字使用常规表达式包含值所要匹配的模式。模式包含要搜索的字符串,字符串中可包含四种通配符的任意组合。
通配符 含义
% 包含零个或更多字符的任意字符串。
_ 任何单个字符。
[ ] 指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符。
[^] 不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符。

请将通配符和字符串用单引号引起来,例如:
LIKE ‘Mc%’ 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
LIKE ‘%inger’ 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
LIKE ‘%en%’ 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
LIKE ‘_heryl’ 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
LIKE ‘[CK]ars[eo]n’ 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
LIKE ‘[M-Z]inger’ 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
LIKE ‘M[^c]%’ 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如 MacFeather)。


发表评论:

评论(0)