开发终结篇-1

  1. 发布审核机制.
    这里的审核用review比较好(audit主要是用在财务上, 表示审计). under review(正在审核之中), 思想就是, 在controller中查询表 pre_review, 获取is_already_reviewed字段的值, 然后根据这个值,来决定显示的内容: foo.php: <?php if(is_already_reviewed) $content=$article_content; else $conten='该文章还未审核' ?>

  2. echo的选项options用法
    echo -n选项是不要输出末尾的newline换行符
    echo -e: e指的是escape, 转义字符. 因为默认的情况下, echo是不解析backslash反斜杠 转义的, 对\n, \c, \t等都是按原样输出的. 而加上-e选项后, 则将会解析转义字符, 将\n解析为回车换行符. \c: 表示cut, 将会截断后面的输出: produce no futher output.
    总之, 就是只要你man echo一下就可以查到了.

  3. mysql创建表的问题. 字段的描述顺序通常是: type(length) + attribute(如unsigned) + not null + extra(如:auto-increment) + primary key + default等. **在所有的描述中, 只有 auto_increment是连写的, 其他都是分开的, 如: not null, primary key ** , 对于default的写法如果是空, 就直接写'', 但是如果在图形界面输入'' , 则不是为空, 而是''' '''
    如: create table user(id int(10) unsgined auto_primary primary key, name varchar(20) not null default '');

  4. 理解php和cgi和apache之间的关系?
    在以前apache要response 对php文件 的request, 由于他自身并不能解析执行php文件(没有php的函数库解析执行能力), 所以他要 去执行"外部"程序: php解释程序, 去解释php脚本文件. apache执行外部程序的方式就是 cgi(common gatewagy interface), 他会启动/请求 cgi程序, 然后cgi作为接口 去启动php解析器执行 cgi-bin目录下的cgi脚本, cgi脚本本身与语言无关, 可以是perl, php, asp等脚本(但是这些脚本的编写要符合cgi的接口规范). 这些脚本的本身的脚本解释器执行完脚本后, 由cgi格式化(转换)为html内容, 然后再交给apache, 从而得到解析后的php脚本内容 . 这里cgi相当于一个中间人(中介机构), 如同出国留学的中介机构一样. 用户 request-> apche->cgi (-> <-) php解释器(解释执行php脚本文件).
    而现在apache响应php请求的方式是, 他自己就内嵌了php5_mod模块, 自己就可以"调用"php解释器...相当于, 原来由别人做的事, 自己在内部成立了一个机构, 专门来实现原来由外部实现的功能. 就如同华川厂, 原来的发动机要由 cgi->找 外面的发动机制造企业购买, 然后回来 -> 组装一样(cgi方式, 发动机可以随便找哪个厂家订购, 就如同cgi脚本的语言类型不限一样), 现在, 他自己成立了一个子公司, 专门生产发动机(如同apache自己内嵌一个模块php5_mod专门来解析php脚本一样), 自己就能够组装生产了, 不用再采取cgi的方式了.
    因为cgi方式, 每次响应/执行php等服务器端脚本的时候, 都要启动cgi进程, 占用cpu和内存, 当这样的请求有很多而且是并发的时候, 就会占用服务器较多的资源, 影响服务器的响应.所以采用php5_mod的方式更好.

  5. cgi和fastcgi和php5_mod 的区别.
    因为cgi方式, 每次响应/执行php等服务器端脚本的时候, 都要启动cgi进程, 占用cpu和内存, 当这样的请求有很多而且是并发的时候, 就会占用服务器较多的资源, 影响服务器的响应.所以采用php5_mod的方式更好.
    为了解决cgi的并发占用较多资源的问题, 提出了fastcgi方式, 让cgi进程作为常驻进程一直在内存中运行, 他"一个"进程响应 所有的 php解析请求.这就避免了高并发请求时服务器崩溃的问题.
    但是, 由于php5_mod的方式跟fastcgi的方式一样解决了高并发的问题, 同时, 他在编写php脚本的时候, 比cgi的方式更简洁简单方便,使用现在基本上都使用的是php5_mod方式, 而较少使用fastcgi 方式了.

  6. php本身提供很多的函数, 包括用来操作和交互apache(服务器, 或引擎) 和mysql(数据库)的函数. 并不是只有操作数据库的函数. 操作apache的函数, 比如: apache_get_version, apache_get_modules, apache_getenv, apache_child_terminate. apache_reset_env, apache_note, apche_request_headers, apache_response_headers. 等等. 注意这些都是php的函数. 便于来操纵 apache和数据库.

  7. apache使用php的方式
    可以有cgi, fastcgi, 和php5_mod三种方式, 前面两种都是 使用/通过 "外部"的程序调用接口. 而php5_mod的方式, 是将php作为一种内嵌模块进行使用. 即: 凡是cgi就相当于外部的厂矿和单位帮你处理事情或实现功能; 而内嵌 的mod方式, 则是 把原来 "外包" 的功能和事情, 都让自己来做, 自己来实现了, 自己在内部设立一个部门, 来实现原来的外部功能了. 现在使用得最多的还是 内嵌的mod方式, 是作为server side script的方式使用的.


  1. 在开发者文件夹的命名?
    首先是看你自己的规范,只要在整个项目中统一就行了; 其次,通常用单数,原因是你不必去考虑单词的复数形式是什么; 而且, 建议最好是使用简写,如img, css, js等. 最后, 其实你也完全不必去纠结, 即使你"任性"的随意命名某个文件夹, 又怎么样呢?没有问题的!

  2. 什么叫封闭标签?
    就是有开始标签和 结束标签的才叫封闭标签, 如:<div>...</div>. 否则,就叫自闭合标签, 非闭合标签.如<br/>

  3. 为了安全的文件放置位置?
    只是将 index和Public文件放在 /web根目录下, 其他应用程序(即通常所说的类库和函数库) 放在其他位置 , 非/web目录下,
    这样hacker就访问不到程序. 当然, 如果只是临时目录访问/更替, 可以使用 虚拟目录.

  4. 一个小操作: 在win下, 要快速的在桌面创建 文件夹和文件的快捷方式:文件夹/目录, 只要将explorer中的 location地址栏中的文件夹图标拖到桌面上就可以了.而文件,只要在拖动的时候, alt键就可以创建快捷方式了(alt表示这里不是拖动复制, 而是拖动创建快捷方式).

  5. dnf本身已经有了/内置了yum-fastestmirror插件了, 只是默认的没有启用, 所以你用不着再去安装什么fastestmirror插件了. 要启用的话, 只需要在 /etc/dnf/dnf.conf中配置: fastestmirror=true就ok了.

  6. <a href="foo.index?a=1&b=2...">...可以利用a标签的这种href属性性质在跳转地址后面跟上要传递的参数. 这种在两个页面间 通过 地址栏 传递参数的方式也是很常见的, 只要不是"帐户或密码之类的" 都可以这样做.


  1. 实际上, 利用框架集来布局页面, 在诸如 像后台管理之类的页面 是很常见的. framset标签. 分成左右页面 : <frameset cols="300, *" rows="*" > <frame id=... frameborder="0" src="....?..."> </frame> <frame> </frame> <noframes> .. </noframes> </frameset>

  2. 在变化的右边frame中, 实际的内容并不是一个文件index.php, 而是根据内容/操作的不同, 有很多对应的不同的 (内容生成文件) php文件. 那么这个操作类型可以用token地址参数来表示.

  3. /wamp/bin/mysql/mysql5.5.8/bin/下的mysqld是服务器后台进程 , 而mysql.exe才是 monitor 客户端操作工具.

  4. 如何直接连接mysql数据库

    临时的用法是 把 机器名称,用户名和密码 以及数据库名称, 等直接写死. 在实际项目中通常是把这些连接信息作为变量来给出;
    
    mysql数据库的连接跟其他数据库的连接不同, 他是通过函数 mysql_connect($server, $user, $passwd)来实现的. 是通过传入三个分散的参数来实现的.不是通过一个所谓的"像m*sql连接字符串"(这个连接字符串经常写错). 这样就要简洁得多;
    
    在某些框架中,配置文件使用return array('host'=>'localhost', 'user'=>..., 'passwd'=>...)实际上在最后连接mysql的时候, 都要做处理:list(函数)或数组关联元素值.取出host, user, passwd的值传入到mysql_connect函数中的.
    
    mysql_query的用法:是发送 **所有的/任意语句**(增删改查都可以的)mysql语句给数据库.   对于select语句,成功时返回指向外部查询结果的resource类型的变量, 出错则返回false; 对于非select语句,update, insert, delete语句成功时返回true, 失败时返回false.
    
    php的resource:是php的一种变量类型, 是指向 "外部资源"的 一种引用类型. 要注意的是, 他仅仅只是一种引用(指针). php本身实际上是没有这种资源的. 因为这些外部资源真实的内容是由mysql产生的, 是放在mysql的某个内存区域的. php resource类型的变量, 只是指向它, 本身并不做拷贝. 更通俗的说, php本身是没有这块内存区域的.所以叫"外部资源"
    
    关于资源相关的函数是, get_resource_type($rsc) , 查询资源的类型(为字符串), 常见的如: mysql_connect()的返回值是"mysql link" 注意不是mysql connect;  mysql_query() 返回值是 "mysql result" 但是 关于文件的操作函数, 返回的是: "stream 或socket" 
    
    注意, 所有关于文件的操作如fopen, fwrite, fread, fputs等, 返回的都是一个类型为 "stream" 的 资源变量. 为什么不是文件指针呢? **其实 在php中, stream实际上就是文件指针 **. 只是换了一个说法而已. 在php的源代码中, 就有:  FILE*  stream . 意思是: stream实际上是 一个"FILE" 类型的结构体 指针! 
    
    php中的资源, 是无需 手动释放的! 因为php的zend 引擎(解释器执行器), 使用了类似java的引用计数机制, 只有某个资源resource的引用次数为0时 就自动释放这个资源的内存. 所以想 mysql_connect ,mysql_query等的结果的资源, 都无需使用(mysql_free_result, mysql_close)去手动释放. 在当前这个php文件(php脚本)执行完的时候, 会自动释放所关联的资源内存.
    
    php中的@:  首先它是一种运算符, 类似如: 加号, 减号, 乘号 取反! 之类的东西. 是一种 "错误运算控制符". 他的用法是: 既然是一种运算符, 所以他可以放在任何**表达式**之前. 包括: 表达式, 常量和变量, 函数调用(最常用的是file操作类函数fopen, fputs等), include调用. 不能使用的地方是: 函数和类的定义处 +  结构语句如if, for, while等之前.
    
    php是一种基于/面向 表达式 的语言!   在php中, 几乎所写的一切都是表达式:  "凡是有值的东西"都是表达式. 所以, 所有的函数, 包含函数的式子都是表达式.   $a=5: 5 , $a, 以及 "$a=5"这个式子本身都是表达式.
    
    
  5. 关于fopen的6中模式" r, r+ , w, w+ , a, a+"区别
    凡是没有加的都表示只有一种功能, 如r表示只能读不能写, w和a表示只能写不能读. 反正r+, w+, a+表示既能读又能写. "能不能读/写, 区别还是挺大的..能读不能写, 和能写不能读都是 读文件的一种保护措施! " 这些模式都是有实际使用场合的.
    r, r+, (主要是为了读), 所以, 文件必须存在, 否则错误; 文件打开后文件指针是指向文件头的. 从文件头开始(读/ 写)
    w, w+ 相当于 echo "foo" > some_file. 是完全覆盖, 而a , a+ 则相当于 echo "foo" >> some_file. 表示"追加"
    w, w+文件截为0, 且文件指针在头部, 而a, a+文件指针是在尾部.
    w, w+, a, a+ 主要是为了写文件, 共性是, 文件如果不存在, 会自动创建该文件.
    r+和w+的区别是: r+是从文件头部开始写内容. 但是文件原来的内容还存在; 而w+文件原来的内容都要被删除, 从头开始添加内容. 因此:
    在追加内容的时候: 分三种情况: 如果在文件头部追加内容用r+, 如果在文件尾部追加内容用a+, 这两个都不会动原来的内容. 如果要把原来的内容除去, 完全重新写内容, 用w+.

  6. 从mysql_query得到的resource中如何取数据出来?
    首先, resource是一种资源, 是一个指针引用. 因此, 不管你的结果是什么, 即使是只有一条记录, 设置只是一个字段的内容, 都是一个resource.
    其次, 有很多种方法取得结果, 就看你的目的和使用的方式了 : mysql_fetch_(fetch就表示从资源中获取内容): mysql_fetch_row: 用数字数组/枚举数组的方式取结果; mysql_fetch_assoc, 用关联数组的方式取结果; mysql_fetch_object, 用对象的方式取结果. mysql_fetch_array($resource, MYSQL_STYLE)这个就是根据你的输入的第2个参数常数的值来决定: MYSQL_NUM , MYSQL_ASSOC, MYSQL_BOTH. 默认的是MYSQL_BOTH同时用两种方式取结果.
    而且通常用while来取结果, 当资源中结果取完了的时候, 这些mysql_fetch_函数都将返回false.

  7. 用mysql_fetch_... 从资源中, 取出来的结果总是 数组或对象, 所以总是可以用 foreach ...(foreach 只能遍历 数组或 对象) ... 来遍历的, 只是通常没有必要了, 一般直接echo +数组元素 就可以了.


直接连接数据库的代码片段

php的标签:   // 在md中, 不要使用php的标签, 那个他会解析的! 
$host= '127.0.0.1';
$user='root';
$passwd = '';
$db='test';

if( ! $cid=@mysql_connect($host,$user,$passwd)) die('failed to connect to server!');   // 这里的@ 既可以放在函数mysql_connect的前面, 也可以放在整个表达式的前面即$cid的前面
mysql_select_db($db,$cid);
$res = mysql_query('select * from user');  // 这里的$res, 既可以认为是result, 结果, 也可以认为是resource. 资源.

while($row = mysql_fetch_row($rsc)){
   // echo $row[0] .':'.$row[1]. '<br/>';  直接输出每一行记录的各个字段的值
   // 或者硬是要使用foreach来遍历输出每一行的内容
    foreach($row as $v){
	echo $v.':';
    }
    echo '<br/>';
}
mysql_free_result($res);
mysql_close($cid);


  1. 关于php的错误报告机制? 参考: http://blog.csdn.net/allanfreax/article/details/6399586
    有两种方式可以修改错误报告,一种是在可能出错的单个php文件内页面, 使用函数 error_reporting(...),另一种是使用函数ini_set修改配置文件,或直接修改php.ini文件都可以.
    默认的php.ini中的error_reporting=E_ALL.
    而error_reporting(函数参数是一个整数, 或表示整数的常量):
    这个表示整数的常量是一个 "按位运算的整数", 最终的值是这些常量整数的 按位运算的结果.其中最常用的是 "运行时"错误报告常量, 共4个:
    E_ERROR => 1
    2 <= E_WARNING
    4 <= E_PARSE
    8 <= E_NOTICE
    比如: error_reporting(7); 就表示: 7=1+2+4, 即error_reporting(E_ERROR | E_WARNING | E_PARSE);
    通常的错误情形是:
    E_ERROR: 运行时致命错误, 通常如:函数名写错, 使用未定义的函数/类等
    E_WARNING: 运行时警告, 通常是: 在调用函数的时候, 变量错误, 如变量的个数不对, 变量的类型不对...
    E_PARSE: 运行时解析错误, 通常是 syntax error语法错误.
    E_NOTICE: 运行时提醒/提示. 通常是使用了未定义的变量, undefined variable.
    报告错误 的格式是: ( ! )Warning: mysql_query($sql, some_other_error_param) expects at most 1 variable, 2 parameters given... line 10.
    我们通常需要的是运行时错误, 警告和解析错误, 不需要显示 提醒错误, 所以, 通常用的最多的错误报告设置是:
    error_reporting( E_ALL ^ E_NOTICE ), 其中 脱字符 ^ 也可以用 &~ 来表示: 如: error_reporting(E_ALL & ~ E_NOTICE);
    由于E_ALL的值是2048, 表示所有类型的错误都要提示: 0 则表示不提示报告显示任何 类型的错误! error_reporting(E_ALL); error_reporting(0);
    但是, 如果设置error_reporting(0)不能屏蔽错误, 可能是由于log_error=0n, 但是却没有设置log_file

  1. mysql中一次性的插入多条语句?
    插入语句是insert into, 而不只是 insert, 不要忘了into.
    对于id auto_increment的, 在表中字段可以不写, 但是在后面的value中必须给出''值, 只有一种情况可以不给出空的字符串值, 那就是在user表不写id字段, 但写上其他字段的时候, 比如inser into user(name, class, score) values('jack',1, 90), 其余的情况,都要给出''值.因此, 还不如就默认的不写字段名,而默认的给出''值;
    insert into use values(...)中的values 可以用value来表示, 即可以用单数, 也可以用复数values. 不管插入的是一个还是多个value;
    一次性插入多个记录的时候, 只要在values(或value)的后面, 加上多个值就好了, 多个值之间用逗号分隔.

  2. 如何将一个表中的记录选出来, 插入到另一个表中.
    有两种方法,就是 insert into from 和 select into from
    第一, 格式是: insert into table2 select .... from table1, 在这个语句中, 要求table2必须已经存在; 然后, 后面的选择字句是不需要加括号的
    第二, 格式是: **select value1, value2,... into table2 from table1. 这里要强table2不能存在;
    区别是, insert into 后面的select字段必须和table2的字段类型一致, 可能一次插入多个记录. 而select into from 则不管table2的字段, 因为这里的table2 要后来才创造.

posted @ 2017-07-28 08:03  noitanym  阅读(211)  评论(0编辑  收藏  举报