2014年3月

PHP 获取访问者IP

这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:
$ip = $_SERVER["REMOTE_ADDR"];搞定~

CodeIgniter 分页类的一点总结

这里我们以get与分页的结合为例,因为这点当时我纠结了很久,当然是在M-SHOW时候纠结完的,这次拿来主义了一次,记录一下。

        $this->load->library('pagination');
        $id = $this->input->get('id');

        /**
         *  pagination
         */
        $config['base_url'] = base_url().'poster_admin/works/search';
        $config['per_page'] = 5;
        $config['num_links'] = 7;
        $config['uri_segment'] = '4';
        $config['use_page_numbers'] = TRUE;
        $config['full_tag_open'] = '<ul class="pagination">';
        $config['full_tag_close'] = '</ul>';
        $config['cur_tag_open'] = '<li class="active"><a href="#">';
        $config['cur_tag_close'] = '</a></li>';
        $config['num_tag_open'] = '<li>';
        $config['num_tag_close'] = '</li>';
        $config['prev_tag_open'] = '<li>';
        $config['prev_tag_close'] = '</li>';
        $config['next_tag_open'] = '<li>';
        $config['next_tag_close'] = '</li>';
        $config['first_link'] = FALSE;
        $config['last_link'] = FALSE;
        $config['total_rows'] = $this->works_model->searchNum($id);

        $config['suffix'] = '?id='.$this->input->get('id');
        $config['first_url'] = base_url().'poster_admin/works/search'.'?id='.$this->input->get('id');

        $this->pagination->initialize($config);

- 阅读剩余部分 -

PHP 简单写个install.php

这次顺便做了一个install.php才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper或者是library的)

                $content = "<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
                $content .= '$active_group'. "= 'default';\n";
                $content .= '$active_record'." = TRUE;\n";
                $content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';\n";
                $content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';\n";
                $content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';\n";
                $content .= '$db'."['default']['database'] = '".$this->input->post('book')."';\n";
                $content .= '$db'."['default']['dbdriver'] = 'mysql';\n";
                $content .= '$db'."['default']['dbprefix'] = '';\n";
                $content .= '$db'."['default']['pconnect'] = TRUE;\n";
                $content .= '$db'."['default']['db_debug'] = TRUE;\n";
                $content .= '$db'."['default']['cache_on'] = FALSE;\n";
                $content .= '$db'."['default']['cachedir'] = '';\n";
                $content .= '$db'."['default']['char_set'] = 'utf8';\n";
                $content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';\n";
                $content .= '$db'."['default']['swap_pre'] = '';\n";
                $content .= '$db'."['default']['autoinit'] = TRUE;\n";
                $content .= '$db'."['default']['stricton'] = FALSE;";

在文件里用\n来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用\了,感觉工作量更大),针对$db,直接显示必须要用单引号,于是就出现了这个。

- 阅读剩余部分 -

CentOS 配置LNMP时访问出现File not found解决办法

安装之后测试发现,怎么Html能运行,而php就不行,显示File Not Found,很是悲伤之下谷歌,发现了各种奇奇怪怪的说法,作为一个error_log看不懂的人只能一个个尝试,而且我将安装步骤仔细重复了一遍又一遍,保证按照教程来了,还是没发现问题,最后找到了一个类似的答案:

是配置的问题
 location ~ \.php$ {
     root html;
html是nginx默认的目录,需要改成网站实际的路径

来自:http://www.360ito.com/question/9.html

然后我基本确定了在/etc/nginx/conf.d/default.conf下,反复修改之后发现了一点不同,其他地方都是:
root /usr/share/nginx/html;而在php下却是root html
所以才访问不了,原来是路径错了,修改完之后就可以访问了。

另外,错误日志所在位置是:var/log/nginx

VI 使用常用命令

以前从没使用过,刚来感觉就像是无头苍蝇,于是来mark一下。

首先进入vi的方法:如

vi /etc/sysconfig/iptables

insert就能切换到插入模式了,如果再按一次,状态就变成replace,如果需要退出等操作,按下esc

:w    #保存而不退出
:q    #结束编辑
:q!    #不保存直接退出
:wq    #保存并退出
:x    #保存并退出

PageUpPageDown按钮可以上下翻页,Home到行最前,End到行最后。

Esc下还可以查找,替换。

查找:

/hello    #向下查找hello
?hello    #向上查找hello

n可以查找下一个。

替换目前还没用过,传送门:http://blog.163.com/wchao226@126/blog/static/69514819201053095414526/mark一下。

另外还发现一个看着不错的东西:http://man.ddvip.com/soft/vieditor/vi.html

C 保护数组内容,说说const

因为有的时候我们会手贱在函数中传参导致修改数组值,所以就产生了这个东西,特点其实是让编译器报错,告诉你这里不应该被改变。
如:int sum(const int ar[], int n)

如果const int days[MONTHS] = {31, 28, 31},则数组内容就不能改变了。

如果:

double rates[5] = {88.9, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates;

则不能用pc来修改他所指向的数值,可是我们还是能通过rates[0]来修改,因为rates并不是常量。

如果我们换个写法double * const pc = rates那么就可以修改数据,却不能移动指针。

如果将上面两者结合使用,就相当于用了强力胶,怎么都动不了了:const double * const pc = rates

C 函数与多维数组

书上讲到函数正确的定义方法:void sum_cols(int ar[][COLS], int rows)void sum_cols(int ar[][], int rows)则是不正确的,看了半天没明白,后来终于结合着看看懂了,编译器会把数组富豪转换为指针符号,如果是ar[1],则会变成ar+1,可是对于多维数组而言,下一个元素地址在何处不仅取决于类型,还取决于有多少个具体的元素,比如
oid sum_cols(int ar[][4], int rows),那么编译器就知道了,哦,int值4个字节,有4个int的元素,那么我跳到另一个就要走过16个字节,否则的话,就无法正确处理了。

于是诞生了变长数组……(形如:int sum2d(int rows, int cols, int ar[rows][cols]),并非是可以任意改变长度,而是你的函数不用写死了,通过传入前两个参数来决定指针的情况)
rows,cols与指针位置不可颠倒。

C 几个程序,我们来聊聊数组,函数和指针

其实就是把书上的内容自己理解一番,做个连贯的笔记罢了。

#include <stdio.h>
#define SIZE 4

int main(void)
{
    short dates[SIZE];
    short * pti;
    short index;
    double bills[SIZE];
    double * ptf;

    pti = dates;
    ptf = bills;
    printf("%23s %10s\n", "short", "double");
    for (index = 0; index < SIZE; index++)
        printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
    return 0;
}

- 阅读剩余部分 -