扫除 PHP get_headers 带来的困扰

前段时间在使用 PHP 中的 get_headers 来获取头信息时,发现其中某个链接会返回多个 Location ,然后就疑惑了,难道 301 重定向这些可以同时多个?按理说只能重定向一次,且前后不能有输出?这到底是怎么一回事呢?

headers
继续阅读“扫除 PHP get_headers 带来的困扰”

NULL 与 “NULL”

在PHP中使用变量动态插入可能某些项可能为空(NULL)的方法

向往数据库中插入数据,其中有些项可能为空(NULL),直接的查询语句如下:

1
2
3
-- content text
-- parent int
INSERT INTO msg(content, parent) VALUES("Test message", NULL);

不过,需要考虑的是,上面的parent不一定为空,而是根据情况判断。当需要为空时,插入到数据库中的是NULL。所以需要采用变量的方式而不是硬coding,如:

1
$query = "insert into msg(content, parent) values('$content', $parent)";

在这里折腾了好久,因为一直通不过,后来才发现在判断该插入空的时候变量的PHP代码不正确。

1
2
3
4
# wrong
$parent = NULL;
# right
$parent = "NULL";

PHP中的NULL代表的是无值(no value),而实际上数据库中需要的是“NULL”,故应赋以字符串值而不是无值。

添加页内跳转

为博客添加回到顶部、直达底部、阅读评论这三个快速页内跳转

页内跳转,在我这里,其实就是锚跳转(包括回到顶部、直达底部、阅读评论这三个),只是做了些美化和 JS 效果而已,最终效果见页面右侧(单页和非单页有所不同)。

一开始,我是直接把 HTML/PHP 代码放进 footer.php 文件中的,后来采用 hook 的方法。虽说,就得到的 HTML 结构来说,可能不是非常好;但个人感觉比直接修改 footer.php 好。

HTML/PHP 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
    // add updown access, needs hook wp_footer() in footer.php
    function up_down() {
?>
    <div id="updown">
        <a href="#" title="返回顶部" id="goUp"></a>
        <?php if(is_single()):?>
        <a href="#comments" title="阅读评论" id="goComments"></a>
        <?php endif;?>
        <a href="#footer" title="直达底部" id="goDown"></a>
    </div>
<?php
    }
    add_action('wp_footer', 'up_down');
?>

使用这种方法,需要 footer.php 文件中有调用到 wp_footer() 函数,否则是无法 hook 的。
继续阅读“添加页内跳转”

都是换行惹的祸

PHP filesize 操作得到 Warning: filesize() [function.filesize]: stat failed for…

在使用以下 PHP 代码时遇到了些问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# list.txt
/*
    Be More.mp3
    Hello.mp3
    Drift Away.mp3
    Panda Sneeze.mp3
*/

$lines = file("list.txt");
foreach ($lines as $line){
    echo filesize($line);
    // code above get results like following except the last line:
    // Warning: filesize() [function.filesize]: stat failed for songs/Hello.mp3 in ...
    # echo filesize("songs/Hello.mp3");  // this'll be ok
}

继续阅读“都是换行惹的祸”

PHP中的UTF-8中文长度和截断

直接看代码简单:

1
2
3
4
5
6
7
8
9
<?php
    $str = "中文a数字1";
    printf("%d<br />", strlen($str));                #输出14,utf8中中文长度为3
    printf("%d<br />", mb_strlen($str, "UTF-8"));    #输出6
    printf("%s<br />", substr($str, 0 , 4));         #输出为“中�”
    printf("%s<br />", mb_internal_encoding());      #获取当前字符编码,常默认西欧编码“ISO-8859-1”
    mb_internal_encoding("UTF-8");                   #设定字符编码为utf8
    echo mb_substr($str, 0, 4);                      #输出为“中文a数”
?>