PHP 获取访问者IP
这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:$ip = $_SERVER["REMOTE_ADDR"];
搞定~
这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:$ip = $_SERVER["REMOTE_ADDR"];
搞定~
这里我们以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);
这次顺便做了一个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
,直接显示必须要用单引号,于是就出现了这个。
原文: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的方法:如
vi /etc/sysconfig/iptables
按insert
就能切换到插入模式了,如果再按一次,状态就变成replace
,如果需要退出等操作,按下esc
。
:w #保存而不退出
:q #结束编辑
:q! #不保存直接退出
:wq #保存并退出
:x #保存并退出
PageUp
和PageDown
按钮可以上下翻页,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
因为有的时候我们会手贱在函数中传参导致修改数组值,所以就产生了这个东西,特点其实是让编译器报错,告诉你这里不应该被改变。
如: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
。
书上讲到函数正确的定义方法: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
与指针位置不可颠倒。
其实就是把书上的内容自己理解一番,做个连贯的笔记罢了。
#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;
}