PHP 获取访问者IP
这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:
$ip = $_SERVER["REMOTE_ADDR"];
搞定~
随手记录自己的学习过程
这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:
$ip = $_SERVER["REMOTE_ADDR"];
搞定~
这里我们以
get
与分页的结合为例,因为这点当时我纠结了很久,当然是在M-SHOW
时候纠结完的,这次拿来主义了一次,记录一下。
1 $this->load->library('pagination');
2 $id = $this->input->get('id');
3
4 /**
5 * pagination
6 */
7 $config['base_url'] = base_url().'poster_admin/works/search';
8 $config['per_page'] = 5;
9 $config['num_links'] = 7;
10 $config['uri_segment'] = '4';
11 $config['use_page_numbers'] = TRUE;
12 $config['full_tag_open'] = '<ul class="pagination">';
13 $config['full_tag_close'] = '</ul>';
14 $config['cur_tag_open'] = '<li class="active"><a href="#">';
15 $config['cur_tag_close'] = '</a></li>';
16 $config['num_tag_open'] = '<li>';
17 $config['num_tag_close'] = '</li>';
18 $config['prev_tag_open'] = '<li>';
19 $config['prev_tag_close'] = '</li>';
20 $config['next_tag_open'] = '<li>';
21 $config['next_tag_close'] = '</li>';
22 $config['first_link'] = FALSE;
23 $config['last_link'] = FALSE;
24 $config['total_rows'] = $this->works_model->searchNum($id);
25
26 $config['suffix'] = '?id='.$this->input->get('id');
27 $config['first_url'] = base_url().'poster_admin/works/search'.'?id='.$this->input->get('id');
28
29 $this->pagination->initialize($config);
30
这次顺便做了一个
install.php
才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper
或者是library
的)
1 $content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');\n";
2 $content .= '$active_group'. "= 'default';\n";
3 $content .= '$active_record'." = TRUE;\n";
4 $content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';\n";
5 $content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';\n";
6 $content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';\n";
7 $content .= '$db'."['default']['database'] = '".$this->input->post('book')."';\n";
8 $content .= '$db'."['default']['dbdriver'] = 'mysql';\n";
9 $content .= '$db'."['default']['dbprefix'] = '';\n";
10 $content .= '$db'."['default']['pconnect'] = TRUE;\n";
11 $content .= '$db'."['default']['db_debug'] = TRUE;\n";
12 $content .= '$db'."['default']['cache_on'] = FALSE;\n";
13 $content .= '$db'."['default']['cachedir'] = '';\n";
14 $content .= '$db'."['default']['char_set'] = 'utf8';\n";
15 $content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';\n";
16 $content .= '$db'."['default']['swap_pre'] = '';\n";
17 $content .= '$db'."['default']['autoinit'] = TRUE;\n";
18 $content .= '$db'."['default']['stricton'] = FALSE;";
19
在文件里用\n
来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用\
了,感觉工作量更大),针对$db
,直接显示必须要用单引号,于是就出现了这个。
原文:http://www.cnblogs.com/xiongpq/p/3384681.html 把
5.6.14
改成5.6.17
就OK了(因为14已经不提供下载了。)
安装之后测试发现,怎么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
被逼疯的节奏最后找到了一篇不错的教程,非常完善,让我这个不会用命令的人成功安装完了(当然也有部分归功于yum安装本身把难度降低了)
以前从没使用过,刚来感觉就像是无头苍蝇,于是来mark一下。
首先进入vi的方法:如
1vi /etc/sysconfig/iptables
2
按insert
就能切换到插入模式了,如果再按一次,状态就变成replace
,如果需要退出等操作,按下esc
。
1:w #保存而不退出
2:q #结束编辑
3:q! #不保存直接退出
4:wq #保存并退出
5:x #保存并退出
6
PageUp
和PageDown
按钮可以上下翻页,Home
到行最前,End
到行最后。
在Esc
下还可以查找,替换。
查找:
1/hello #向下查找hello
2?hello #向上查找hello
3
按n
可以查找下一个。
替换目前还没用过,传送门:http://blog.163.com/wchao226@126/blog/static/69514819201053095414526/mark一下。
另外还发现一个看着不错的东西:http://man.ddvip.com/soft/vieditor/vi.html
因为有的时候我们会手贱在函数中传参导致修改数组值,所以就产生了这个东西,特点其实是让编译器报错,告诉你这里不应该被改变。 如:
int sum(const int ar[], int n)
如果const int days[MONTHS] = {31, 28, 31}
,则数组内容就不能改变了。
如果:
1double rates[5] = {88.9, 100.12, 59.45, 183.11, 340.5};
2const double * pd = rates;
3
则不能用pc来修改他所指向的数值,可是我们还是能通过rates[0]
来修改,因为rates
并不是常量。
如果我们换个写法double * const pc = rates
那么就可以修改数据,却不能移动指针。
如果将上面两者结合使用,就相当于用了强力胶,怎么都动不了了:const double * const pc = rates
。
书上讲到函数正确的定义方法:
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
与指针位置不可颠倒。
其实就是把书上的内容自己理解一番,做个连贯的笔记罢了。
1#include <stdio.h>
2#define SIZE 4
3
4int main(void)
5{
6 short dates[SIZE];
7 short * pti;
8 short index;
9 double bills[SIZE];
10 double * ptf;
11
12 pti = dates;
13 ptf = bills;
14 printf("%23s %10s\n", "short", "double");
15 for (index = 0; index < SIZE; index++)
16 printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
17 return 0;
18}
19