作者jh961202 (阿电)
看板PHP
标题[请益] 处里档案中的字串
时间Fri Feb 7 17:22:07 2014
各位好,不知道这个标题下得好不好
但是,我大概先叙述一下我的程式要做甚麽,以及碰到的问题
=============================
这是一个可以浏览并且播放音乐的网站
网页端的PHP程式会先去找档案清单(实际上是一个文字档),内有档名和连结
当然,也有可能还会有子资料夹
而当发现是一个音乐(MP3)档时,会要求要开在新视窗,否则就在原视窗开启就好
光看上面的说明可能不太清楚,所以下面附上Input档案范例
(但是实际档案内容不包含後面的注解)
Input档案范例一:
Songs
// 这是音乐清单的开头指标
第一首歌
play.php?file=music1
第二首歌
play.php?file=music2
End_List
// 清单结尾标示
//Input至此结束,不含换行
小说明:play.php是播放器页面,必须开在新视窗
而Output必须是:(以HTML原始码呈现)
<a href =
play.php?file=music1 target="_blank">
第一首歌</a>
<a href =
play.php?file=music2 target="_blank">
第二首歌</a>
Input范例二:
Folder
// 资料夹清单开头指标
第一个资料夹
list.php?list=2 // list.php就是这个网页自己,他会列出一张档案与资料夹的清单
End_List
Songs
第一首歌
play.php?file=music1
End_List
//Input至此结束,不含换行
Output必须是:
<a href =
list.php?list=2 >
第一个资料夹</a>
<a href =
play.php?file=music1 target="_blank">
第一首歌</a>
=================================================
以下是负责判断清单类别,并且印出需要的HTML code的程式部分:
<?
$fp = fopen( "db/list_".$_GET['mid'].".txt", "r+" ) ;
$temp = fgets( $fp ) ;
// 取得第一张清单的类型
if ( strcmp($temp, "Folder") == 0 ) {
// 发现子资料夹清单
echo( "请选择一项类别继续浏览:<br>" );
$linkname = fgets( $fp ) ;
// 读进第一位
while( strcmp( $linkname, "End_List" ) != 0 ) {
// 清单还没结束就一直读
$link = fgets( $fp ) ;
?>
<a href = "<? echo($link) ; ?>&title=<? echo($linkname) ; ?>" ><?
echo($linkname) ; ?></a><br>
<?
$linkname = fgets( $fp ) ;
// 下一位!
}
// while
$temp = fgets( $fp ) ;
// 既然有资料夹清单,那有歌曲的清单吗?
if ( strcmp($temp, "Songs" ) == 0 ) {
// 有歌曲清单耶!
echo( "或者,选择一首歌曲播放:<br>" );
$linkname = fgets( $fp ) ;
// 读进第一位
while( strcmp( $linkname, "End_List" ) != 0 ) {
// 清单还没结束就一直读
$link = fgets( $fp ) ;
?>
<a href = "<? echo($link) ; ?>&title=<? echo($linkname) ; ?>"
target="_blank"><? echo($linkname) ; ?></a><br>
<?
$linkname = fgets( $fp ) ;
// 下一位!
}
// while
}
// if 有歌单
}
// if 有资料夹&歌单
else if ( strlen($temp) == 10 ) {
// 只发现歌曲清单
echo( "请选择一首歌曲播放:" );
$linkname = fgets( $fp ) ;
// 读进第一位
while( strcmp( $linkname, "End_List" ) != 0 ) {
// 清单还没结束就一直读
$link = fgets( $fp ) ;
?>
<a href = "<? echo($link) ; ?>&title=<? echo($linkname) ; ?>"
target="_blank"><? echo($linkname) ; ?></a><br>
<?
$linkname = fgets( $fp ) ;
// 下一位!
}
// while
}
// else if
// 歌单处理结束
}
// if
else {
echo("<center>本区域测试中,尚未开放,敬请拭目以待</center>") ;
}
// else
?>
=====================================================
这程式的回圈都会work,strcmp基本上也都没有问题
但是很奇怪的是,只要从档案读出来,Songs长度会变成10(不是应该是5吗?)
而Folder这个字串的长度则会变成12(不是应该是6吗?)
所以造成无法进入回圈,想当然尔,网页上就是空白一片了
本来想说是不是有藏什麽字元,於是有尝试加上trim()函式,但是结果一样...
有任何人可以帮忙解答吗?感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.250.127.134
1F:推 LPH66:检查输入档的编码 照叙述看似乎是 UTF-16... 02/07 17:24
2F:推 s25g5d4:直接读档名开档喔 感觉就超危险的阿 02/07 17:58
3F:推 alog:开档案前先做escape,不然你那个$_GET可以恶搞 02/07 18:00
不好意思,复制code的时候少复制一行:
if ( file_exists( "db/list_".$_GET['mid'].".txt" ) ) {
所以~这是有做前置处里的(只要找不到档案就显示一组讯息,并且不会继续执行)
抱歉造成各位误会~
4F:推 alog:另外资料的交换都统一使用UTF-8 这比较不易出问题 02/07 18:02
6F:推 alog:音乐歌曲易有日韩简体,建议用mbstring 来处理字串 02/07 18:04
※ 编辑: jh961202 来自: 111.250.127.134 (02/08 00:31)
7F:→ alog:filename 基本上要 escape / \ . 这三个字元 02/08 02:23
8F:→ alog:建议养成习惯,不要把 $_GET or $_POST 之类的参数 02/08 02:26
9F:→ alog:直接用在 function 上 02/08 02:26
10F:→ alog:你可以这样 music_filename = 跳脱("{$music_id}.txt"); 02/08 02:27
11F:→ alog:不仅好读、好维护,之後要修正也比较好替换 02/08 02:28
不管置换成哪一种编码方式都没有用...
(网页本身是UTF-8,确定每一个文件也都是UTF-8,甚至还试过ANSI...)
另外,范例中的Songs长度不是显示10,而是7
(多两个字元,到底是谁啊OAO)
而Folder换成Subfolder会变成13个字元...
(竟然多了4个字元...完全没有规律阿0.0)
※ 编辑: jh961202 来自: 111.250.127.134 (02/08 20:18)