分类 心得体会 下的文章

PHP中简单记录Log

在写简单的代码的时候有一个非常方便的记录Log日志的方法:log_error。
让我们来看一下log_error的用法:
bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )

message
应该被记录的错误信息。

message_type
设置错误应该发送到何处。可能的信息类型有以下几个:

error_log() 日志类型
0 message 发送到 PHP 的系统日志,使用 操作系统的日志机制或者一个文件,取决于 error_log 指令设置了什么。 这是个默认的选项。
1 message 发送到参数 destination 设置的邮件地址。 第四个参数 extra_headers 只有在这个类型里才会被用到。
2 不再是一个选项。
3 message 被发送到位置为 destination 的文件里。 字符 message 不会默认被当做新的一行。
4 message 直接发送到 SAPI 的日志处理程序中。
destination
目标。它的含义描述于以上,由 message_type 参数所决定。

extra_headers
额外的头。当 message_type 设置为 1 的时候使用。 该信息类型使用了 mail() 的同一个内置函数。

所以我们可以利用这个函数将一些日志保存到我们的邮箱地址,自定义日志文件,PHP系统日志,SAPI日志中去,在调试的时候非常方便。

form元素的enctype属性的选择

因为一个项目里面需要上传文件,所以在网上了解了一下资料之后就选择了通过修改enctype参数实现文件上传。在此,写一下自己关于这个参数的理解。

首先是默认的enctype参数——application/x-www-form-urlencoded。当你没有指定enctype参数的时候,浏览器以这样的enctype参数汇总表单提交项并且通过指定content-type的参数的形式告知服务器。

我们来看一下提交只有一个test提交项的表单,而且没有指定x-www-form-urlencoded,使用Fiddle抓包的结果:

POST http://192.168.164.12/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 192.168.164.12
Content-Length: 17
DNT: 1
Connection: Keep-Alive
Pragma: no-cache

test=%B2%E2%CA%D4

这就是一个x-www-form-urlencoded的服务器请求,就像参数名字中urlencoded描述的一样,你的提交信息都被进行了urlencoded一下。关于什么是urlencoded,具体请参考这篇文章

在enctype这个参数中有三个可选的选项,其中text/plain和x-www-form-urlencoded有点类似,它的特点是不对提交的字符进行编码,只是简单的将空格转换为 "+" 符号。

然后,我在自己机器上试验了一下PHP服务器端,发现如果通过text/plain进行提交数据的话,就只能通过读php://input来获取了,不会像默认提交那样会自动帮你解析成$_POST方便你调用。

那么关于multipart/form-data的话,在这篇文章里面有个很好的解释。在PHP中我们可以通过$_FILES来获取上传的文件数据和$_POST来获取上传的普通数据。

application/x-www-form-urlencoded这种模式适合上传参数,不适合上传大量文件,因为上传数据可以通过分行进行区别不同的参数,但是一个文件会有很多行, 自然不能通过简单的分行进行区分。

那么有什么解决办法呢?multipart/form-data给出的方法是采用专门设计的分隔符,这种办法虽然看上去土了一点,但是实际上非常有用,至少在当时解决了燃眉之急,后来也一直沿用了下来。

另外有一点比较特别,在PHP的实现里面,当multipart/form-data时,PHP负责帮你解析成$_POST和$_FILES,但是你是获取不到原始数据流的,也就是通过php://input读不到 enctype="multipart/form-data"上传的内容。

Git基础教程1——本地单分支的版本控制工具

以前面向公司的一些代码开发人员(非专业程序员)做了一次基于Git的命令行的Git培训。
第一次培训向所有培训者介绍了Git的革新和伟大,然而不出意外,所有人的表情都是一脸懵懂的表情,然后持续到第一次培训结束。然后第二次培训的话,来的人就只有第一次培训的一半不到。
因此,在这一次的系列培训中,我将不会给你介绍Git的功能有多么高级,Git的实现由多么伟大,我只会带你切身感受Git给我们带来的开发上的便利。

首先,先问大家一个问题:你有没有手动做过版本控制?可能大家有所疑问:什么是版本控制。
给大家看一张图片:

MySQL修改字段名称

今天需要修改一下table的某个字段名称,以前PHPmyAdmin用的比较多,较少接触alter命令,就直接查了一下,找到了这个命令:

alter table {table_name} change {old_field_name} {new_field_name} {filed_value_type};

误以为field_value_type可以省略,输了几次都报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

真是黑人问号!不得已之下加上了field_value_type,居然执行成功了。顿时怒了,你特么不是在逗我么,我只是想改一下字段名称啊,为啥还得加上字段类型啊。

不过没办法,既然这么要求,只能这么用了。这边可以用describe {table_name}命令查看当前各字段的类型。

Clang需要注意的一些不同于其他语言的地方

1、C语言需要include对应的库的头文件,比如使用printf的时候就需要include stdio.h。库的头文件里面有函数的声明,这样编译器就可以判断函数调用的对不对了。
2、C语言里面没有字符串,只能使用字符数组来模拟字符串,如果模拟的话字符数组需要比里面所有字符还要多一位,因为最后需要添加一个“哨兵字符”。&switch检查不了任何数组,包括字符数组。
3、C语言中没有布尔值,只能用不为零的值和0两个值来模拟布尔值。
4、C语言中不会记录数组的长度,可以想象存储在内存中的数组是多么赤裸裸的样子。
5、C语言执行某个函数会有返回值,0的话代表执行成功,非0的话代表执行失败。然而在其他语言中,执行语句不会有返回值,只会当异常发生时抛出异常。
6、c语言中有指针,指针有点像对象引用。使用一个变量指针就相当于使用那个变量的复制品,不过复制品只能用*(pointer variable)的形式进行操作。
7、c语言中的数组在参数传递的时候不是copy值的,其实是退化成指针传递过去,但是函数中的参数声明不是声明一个指针啊,摔!
8、虽然《head first c》里面说sizeof(msg)结果是指针的长度,这边的msg是传递到函数中的字符数组!然而为啥在main函数里面长度好好的,这边长度就不对了,难不成main函数里面的msg不是指针?
突然想起来当年上C语言课时候老师貌似提到过,在main函数里面的msg变量会保存字符串长度,但是传递到函数之后就丢失了么?