分类
PHP编程

2020年最新PHP面试题(三年php面试题)

一 、PHP基础部分
1、PHP语言的一大优势是跨平台,什么是跨平台?
PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台
2、WEB开发中数据提交方式有几种?有什么区别?百度使用哪种方式?
Get与post两种方式
区别:
(1)url可见性:get 方式url参数可见,post 不可见
(2)可缓存性:get 方式是可以缓存的,post 方式不可以缓存。
(3)传输数据大小:get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post 请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
(4)数据传输上:get 方式通过url地址栏拼接参数进行传输,post 方式通过body体进行传输。
建议:
1、get式安全性较Post式要差些包含机密信息建议用Post数据提交式;
2、做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式;
百度使用的get方式,因为可以从它的URL中看出
3、掌握PHP的哪些框架、模板引擎、系统等
框架:框架有很多,例如CI、Yii、Laravel等等,咱们学过的是thinkphp
模板引擎:也有很多,在课本中有,咱们学过的是smarty
系统:有很多,例如:康盛的产品(uchome、supesite、discuzX等),帝国系统、DEDE(织梦)、ecshop等,咱们学过的是DEDECMS、Ecshop
4、说一下你所掌握的网页前端技术有哪些?
熟练掌握p+CSS网页布局,JavaScript,jQuery框架、photoshop图片处理
5、AJAX的优势是什么?
ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。
6、安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
(1)使用验证码防止注册机灌水。
(2)使用预处理,绑定参数,参数过滤转义 防止sql注入
(3)使用token防止远程提交,使用token验证登录状态。
7、在程序的开发中,如何提高程序的运行效率?
(1)优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询。
(2)数据表中创建索引。
(3)对程序中经常用到的数据生成缓存(比如使用redis缓存数据,比如使用ob进行动态页面静态化等等)。
(4)对mysql做主从复制,读写分离。(提高mysq执行效率和查询速度)
(5)使用nginx做负载均衡。(将访问压力平均分配到多态服务器)
8、PHP可否与其它的数据库搭配使用?
PHP与MYSQL数据库是最优搭配,当然PHP也可以去其它的数据库搭配使用,例如PostgreSql,SqlServer,Oracle,SqlLite等。
9、现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?
MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示。
优点是:
①可以实现代码的重用性,避免产生代码冗余;
②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
10、对json数据格式的理解?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,json数据格式固定,可以被多种语言用作数据的传递。
PHP中处理json格式的函数为json_decode( string $json [, bool $assoc ] ) ,接受一个 JSON格式的字符串并且把它转换为PHP变量,参数json待解码的json string格式的字符串。assoc当该参数为TRUE时,将返回array而非object;
Json_encode:将PHP变量转换成json格式。
11、Print、echo、print_r有什么区别?
(1) echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
(2) print 是打印字符串
(3)print_r 则是打印复合类型 如数组 对象
12、SESSION与COOKIE的区别?
(1)存储位置:session存储于服务器,cookie存储于浏览器
(2)安全性:session安全性比cookie高
(3)session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用
13、PHP处理数组的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)array() 创建数组
(2)in_array() 判断元素是否在数组中
(3)count() 返回数组中元素的数目
(4)array_merge() 将多个数组合并成一个数组
(5)array_diff() 比较两个或两个以上数组的差异
(6)array_intersect() 获取两个或两个数组以上的交集
(7)array_keys() 获取数组的key列表
(8)array_values() 获取数组的值列表
(9)array_unique() 删除数组中的重复值
(10)array_push()将一个或多个元素插入数组的末尾(入栈)
(11)array_pop() 弹出并返回 array 数组的最后一个单元(出栈)
(12)array_walk() 使用用户自定义函数对数组中的每个元素做回调处理
14、PHP处理字符串的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)trim() 移除字符串两侧的空白字符和其他字符;
(2)strlen() 获取字符串的长度
(3)mb_strlen() 获取字符串长度(可指定字符编码,对中文字符串计算长度)
(4)substr()返回字符串的一部分;
(5)str_replace() 子字符串替换
(6)str_repeat () 重复一个字符串
(7)is_string() 检测变量是否是字符串;
(8)str_shuffle () 随机打乱一个字符串
(9)sprintf() 返回根据格式化字符串生成的字符串(通常用于获取分表后的数据表名)
(10)strstr() 查找字符串的首次出现
(11)addslashes 使用反斜线引用字符串
15、PHP处理时间的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)date() 格式化一个本地时间/日期。
(2)getdate() 取得日期/时间信息。
(3)date_default_timezone_set() 设定默认时区。
(4)date_default_timezone_get() 返回默认时区。
(5)mktime() 返回一个日期的 Unix时间戳。
(6)strtotime() 将任何字符串的日期时间描述解析为 Unix 时间戳
(7)strftime() 根据区域设置格式化本地时间/日期
16、PHP处理数据库的常用函数?(重点看函数的‘参数’和‘返回值’)
请参照php手册,认真查看,此项非常重要
17、PHP操作文件的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)打开文件 fopen()
(2)读取文件 fgets() ; 注:file_get_contents()也是读取文件
(3)写入文件fwrite() ; 注:file_put_contents()同样可以写入文件
(4)关闭文件句柄 fclose()
(5)移动 / 重命名文件 rename()
(6)复制文件 copy()
(7)创建文件 vim 或 touch
(8)删除文件 unlink()
(9)获取文件上次访问的时间 fileatime()
(10)获取文件上次修改的时间 filemtime()
(11)获取文件大小 filesize()
(12)获取文件类型 filetype()
(13)获取文件详细信息 state()
(14)判断是否是目录 is_dir()
18、PHP操作目录(文件夹)的常用函数?(重点看函数的‘参数’和‘返回值’)
(1)打开目录 opendir()
(2)读取目录 readdir()
(3)删除目录 rmdir()
(4)关闭目录句柄 closedir()
(5)创建目录 mkdir()
(6)返回路径中的目录部分 dirname()
(7)取得当前工作目录 getcwd()
(8)列出指定路径中的文件和目录 scandir()
二 、数据库部分
1、常见的关系型数据库管理系统产品有?
答:Oracle、SQL Server、MySQL、Sybase、DB2、Access等。
2、SQL语言包括哪几部分?每部分都有哪些操作关键字?
答:SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵:Select ,insert,update,delete,
数据控制:grant,revoke
数据查询:select
3、完整性约束包括哪些?
数据完整性(Data Integrity)是指数据的精确(Accuracy) 和 可靠性(Reliability)。
包括:
(1)实体完整性:规定表的每一行在表中是惟一的实体。
(2)域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
(3)参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
(4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。
4、什么是事务?及其特性?
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
特性:
(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
简单理解:在事务里的操作,要么全部成功,要么全部失败。
5、什么是锁?
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
基本锁类型:锁包括行级锁和表级锁
6、什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
7、什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。
8、索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。
缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
如何通俗地理解三个范式?
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。。
什么是基本表?什么是视图?
基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。
视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表
试述视图的优点?
(1) 视图能够简化用户的操作
(2) 视图使用户能以多种角度看待同一数据;
(3) 视图为数据库提供了一定程度的逻辑独立性;
(4) 视图能够对机密数据提供安全保护。
NULL是什么意思
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。
对NULL这个值的任何比较都会生产一个NULL值。
您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。
使用IS NULL来进行NULL判断
主键、外键和索引的区别?
主键、外键和索引的区别
定义:
主键–唯一标识一条记录,不能有重复的,不允许为空
外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引–该字段没有重复值,但可以有一个空值
作用:
主键–用来保证数据完整性
外键–用来和其他表建立联系用的
索引–是提高查询排序的速度
个数:
主键–主键只能有一个
外键–一个表可以有多个外键
索引–一个表可以有多个唯一索引
你可以用什么来确保表格里的字段只接受特定范围里的值?
Check限制,它在数据库表格里被定义,用来限制输入该列的值。
说说对SQL语句优化有哪些方法?(选择几条)
(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用计算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?
(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。
(2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
因此非相关子查询比相关子查询效率高
char和varchar的区别?
char是一种固定长度的类型,varchar则是一种可变长度的类型。
区别:
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足。(在检索操作中那些填补出来的空格字符将被去掉)。
varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。
Mysql 的存储引擎,myisam和innodb的区别。
MyISAM 是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;不支持事务。适合小数据,小并发
innodb是支持事务的存储引擎;适合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。
数据表类型有哪些
MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CSV等。
MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。
InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
(1)设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
(2) 选择合适的表字段数据类型和存储引擎,适当的添加索引。
(3) 做mysql主从复制读写分离。
(4)对数据表进行分表,减少单表中的数据量提高查询速度。
(5)添加缓存机制,比如redis,memcached等。
(6)对不经常改动的页面,生成静态页面(比如做ob缓存)。
(7)书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.
对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?
(1) 确认服务器是否能支撑当前访问量。
(2) 优化数据库访问。
(3)禁止外部访问链接(盗链), 比如图片盗链。
(4)控制文件下载。
(5)做负载均衡,使用不同主机分流。
(6)使用浏览统计软件,了解访问量,有针对性的进行优化。
三、 面向对象部分
1、什么是面向对象?(理解着回答)
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节。
面向对象有三大特征:封装性、继承性、多态性。
现在纯正的OO语言主要是 Java 和 C#,PHP、C++也支持OO,C是面向过程的。
2、简述 private、 protected、 public修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
3、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
4、XML 与 HTML 的主要区别
语法要求不同:
(1)在html中不区分大小写,在xml中严格区分。
(2)在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略
或者之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。
(3) 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。
(4)在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
(5)在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
(6) 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。
标记不同:
(1)html使用固有的标记;而xml没有固有的标记。
(2)Html标签是预定义的;XML标签是免费的、自定义的、可扩展的。
作用不同:
(1)html是用来显示数据的;xml是用来描述数据、存放数据的,所以可以作为持久化的介质!Html将数据和显示结合在一起,在页面中把这数据显示出来;xml则将数据和显示分开。 XML被设计用来描述数据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观。
(2)xml不是HTML的替代品,xml和html是两种不同用途的语言。 XML 不是要替换 HTML;实际上XML 可以视作对 HTML 的补充。XML 和HTML 的目标不同HTML 的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容。
(3)对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具。
(4)XML未来将会无所不在。XML将成为最普遍的数据处理和数据传输的工具。
5、面向对象的特征有哪些方面?
主要有封装,继承,多态。如果是4个方面则加上:抽象。
封装:
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.
继承:
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
多态:
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
抽象:
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。
6、抽象类和接口的概念以及区别?
抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。
接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。
区别:
(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。
(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。
(3)抽象类中可以有构造方法,但是接口没有构造方法。
(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。
(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。
7、什么是构造函数,什么是析构函数,作用是什么?
构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。它存在于每个声明的类中,是一个特殊的成员方法。作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。
析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。是PHP5中新添加的内容作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。
8、如何重载父类的方法,举例说明
重载,即覆盖父类的方法,也就是使用子类中的方法替换从父类中继承的方法,也叫方法的重写。
覆盖父类方法的关键是在子类中创建于父类中相同的方法包括方法的名称、参数和返回值类型。PHP中只要求方法的名称相同即可。
9、常用的魔术方法有哪些?举例说明
php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。
10、$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
$this 当前对象
self 当前类
parent 当前类的父类
$this在当前类中使用,使用->调用属性和方法。
self也在当前类中使用,不过需要使用::调用。
parent在类中使用。
11、类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。
定义常量使用关键字const.
例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,
访问常量的格式都是类名加作用域操作符号(双冒号)来调用。
即:类名 :: 类常量名;
12、作用域操作符::如何使用?都在哪些场合下使用?
(1)调用类常量
(2)调用静态方法(使用static修饰的类方法)
13、__autoload()方法的工作原理是什么?
使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。
这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后
就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。
使用自动载入的魔术函数可以不必要写很多个include或者require函数。
四、THINKPHP部分
1、常见的PHP框架
答:thinkPHP、laravel、yii、ci 等。
2、如何理解TP中的单一入口文件?
ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口。应该说,所有项目都是从入口文件开始的,并且所有的项目的入口文件是类似的。
入口文件中主要包括:
(1)定义框架路径、项目路径和项目名称(可选)
(2)定义调试模式和运行模式的相关常量(可选)
(3)载入框架入口文件(必须)
3、ThinkPHP中的MVC分层是什么?(理解)
MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:
模型(M):模型的定义由Model类来完成。
控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。
视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。
但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。
总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。
4、如何进行SQL优化?(关于后边的解释同学们可以进行理解,到时根据自己的理解把大体意思说出来即可)
(1)选择正确的存储引擎
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
(2)优化字段的数据类型
记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。
(3)为搜索字段添加索引
索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。
(4)避免使用Select 从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用通配符,善用内置提供的字段排除定义也许能给带来更多的便利。
(5)使用 ENUM 而不是 VARCHAR
ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。
(6)尽可能的使用 NOT NULL
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。
(7)固定长度的表会更快
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。
固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。
并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。
5、如何理解 ThinkPHP 3.0 架构(核心 + 行为 + 驱动)中的行为?
(1)核心(Core):就是框架的核心代码,不可缺少的东西,TP本身是基于MVC思想开发的框架。
(2)行为(Behavior) :行为在新版ThinkPHP的架构里面起着举足轻重的作用,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为。行为扩展就因此而诞生了,而且很多系统功能也是通过内置的行为扩展完成的,所有行为扩展都是可替换和增加的,由此形成了底层框架可组装的基础。
(3)驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。
6、什么是惯例配置?
所谓的惯例配置,便是框架的自带的配置文件。该文件在核心框架目录下的convention.php中,配置内容如下。由于该文件属于框架自带的配置文件,在实际的开发过程中,主要给我们做参考实例使用,我们很少去修改该文件的配置内容,更多的是根据需求来按照惯例配置中的字段定义和注释来在模块或者Common中自定义配置内容。
7、什么是SQL注入?(理解)
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。
一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器,这就是SQL注入。
8、ThinkPHP如何防止SQL注入?(理解)
(1)查询条件尽量使用数组方式,这是更为安全的方式;
(2)如果不得已必须使用字符串查询条件,使用预处理机制;
(3)使用绑定参数
(4)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)
(5)使用自动验证和自动完成机制进行针对应用的自定义过滤;
(6)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。
9、如何开启调试模式?调试模式有什么好处?
开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define(‘APP_DEBUG’, true);
调试模式的优势在于: 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试; 关闭模板缓存,模板修改可以即时生效; 记录SQL日志,方便分析SQL; 关闭字段缓存,数据表字段修改不受缓存影响; 严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题; 可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。
10、TP中支持哪些配置模式?优先级?
惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置
以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以优先顺序从右到左。
11、TP中的URL模式有哪几种?默认是哪种?
ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。
默认模式为:PATHINFO模式,设置URL_MODEL 为1
12、TP中系统变量有哪些?如何获取系统变量?
(1)系统变量:_SERVER、SERVER、_ENV、 $_POST、 $_GET、 _REQUEST、REQUEST、_SESSION和 $_COOKIE变量
(2)获取系统变量:
{KaTeX parse error: Expected 'EOF', got '}' at position 25: …ver.script_name}? // 输出_SERVER[‘SCRIPT_NAME’]变量
{KaTeX parse error: Expected 'EOF', got '}' at position 22: …session.user_id}? // 输出_SESSION[‘user_id’]变量
{KaTeX parse error: Expected 'EOF', got '}' at position 21: ….get.pageNumber}? // 输出_GET[‘pageNumber’]变量
{KaTeX parse error: Expected 'EOF', got '}' at position 18: …ink.cookie.name}? // 输出_COOKIE[‘name’]变量
13、ThinkPHP框架中D函数与M函数的区别是什么?
M方法实例化模型无需用户为每个数据表定义模型类,D方法可以自动检测模型类,如果存在自定义的模型类,则实例化自定义模型类,如果不存在,则会自动调用M方法去实例化Model基类。同时对于已实例化过的模型,不会重复去实例化(单例模式)。
五、smarty模板引擎
1、编译和缓存区别?
smarty的编译过程就是把模板拿过来,把里面的标签替换成相应php代码,这就是smarty的编译, 其实就是php和html混合的过程
smarty的缓存需要手动开启,smarty的缓存就是把编译好的文件执行后,同时生成一份静态的html页面,再次访问的时候,你访问的就是是html文件了,所以就效率来说,要高一些。
2、什么是smarty? Smarty的优点是什么?
Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)
Smarty优点
(1)速度快:相对其他模板引擎。
(2) 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件
(3)缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页
(4)插件技术:smarty可以自定义插件。
不适合使用smarty的地方
(1)需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新
(2)小项目。小项目因为项目简单而美工与程序员兼于一人的项目
3、在模板中使用{$smarty}保留变量
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.get.page}? //类似在php脚本中访问_GET[page]
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.cookies.}? {smarty.post.}
{KaTeX parse error: Expected 'EOF', got '}' at position 16: smarty.session.}? {smarty.server.}
4、在模板中访问php中的变量
5、变量调解器
2018PHP经典面试题大全汇总(更新)-PHP面试题
6、php查询mysql数据库时,查询中文结果时出现的乱码。怎么解决?
(1)文件meta(设置浏览器解析的时候)
(2)连接数据库时编码设定
(3)PHP文件中使用header函数确定编码
7、缓存机制
如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。
8、smarty的赋值和载入模板
$Smarty->assign(name,value)
$Smarty->display(‘index.html’)
9、marty模板技术的用途是什么?
为了php与html分开,美工和程序员各司其职,互不干扰。
10、smarty配置主要有哪几项?
(1)引入smarty.class.php;
(2) 实例化smarty对象;
(3)重新修改默认的模板路径;
(4)重新修改默认的编译后文件的路径;
(5)重新修改默认的配置文件的路径;
(6)重新修改默认的cache的路径。
(7) 可以设置是否开启cache。
(8)可以设置左侧和右侧定界符。
11、smarty在使用过程中需要注意哪些细节?
Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层,
也就是说smarty技术将用户UI与php代码分离开。
这样程序员和美工各司其职,互不干扰。
12、smarty运用过程中要注意以下几个问题:
(1)正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径;
(2)php页面中使用assign赋值 和display显示页面;
(3)smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。
六、二次开发系统(DEDE、ecshop)
1、对二次开发的理解
二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核。
2、MVC
Model(模型)数据处理。
View(视图) 模板显示。
Controller(控制器) 控制流程。
MVC的概念是什么?各层主要做什么工作?
MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。
M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。
使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。
在网站开发中,
模型层一般负责对数据库表信息进行增删改查,
视图层负责显示页面内容,
控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法,
执行完毕后由控制器层决定将结果assign到哪个view层。
3、二次开发程序安装后访问时候出现一些警告以及错误
根据错误,来修改服务器配置参数以及百度
4、功能,模板的更换,功能的添加修改
其实也就是面向对象的应用 用,以及模板的更换类似smarty的使用
5、用过哪些二次开发的东西?
Dedecms phpcms ecshop,基本这些的东西如果基础好了 学习起来都是没问题的。
6、像php做一次开发好,还是二次开发好?
一般中小企业都用cms系统二次开发,都是为了效率。当然如果想一次开发也行,会用框架而且时间充足的话就可以了,大企业都是团队来开发的,杜绝版权问题。
7、二次开发过程中很多类与类之间进行之间的方法访问,是通过什么方式传递的?
不是类继承而是对象组合,把实例化好的对象通过global传递进去
8、dedecms如果更换目录,后台某项就进不去了如何解决?
后台核心设置中修改成现在的 项目目录名称
9、dedecms中自定义模型的理解?
在织梦系统中有内容模型这个概念,不同内容模型可以用来构建不同内容形式的站点,在系统中自带了以下几种模型:普通文章、图集、软件、商品、分类信息、专题。
通过系统自带的模型,我们可以用来构建不同类型的站点,例如:使用图集可以做一个图片站,用软件模型构建一个软件下载站点。
当然以上随系统附带的模型被称为系统模型,用户可以自己定义一些模型,比如图书、音乐专辑等,自定义了这些模型才可以构建更多内容形式的站点。
相当于我们自动添加了表结构,适应现在当前需求的变化
10、dede中概念,设计和使用模板,必须要理解下面几个概念
(1)板块(封面)模板:
指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。
(2)列表模板:
指网站某个栏目的所有文章列表的模板,一般用 “list_识别ID.htm” 命名。
(3) 档案模板:
表示文档查看页的模板,如文章模板,一般用 “article_识别ID.htm” 命名。
(4) 其它模板:
一般系统常规包含的模板有:主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。
11、dede中几种标签的使用?
列表 内容 等标签 只能在其本范围内使用,列表标签只能在列表中使用,内容标签只能在内容标签中使用。
全局标签能在所有页面中使用
12、熟悉常用类库
(例如:dedesql.class.php);熟悉系统函数库(common.func.php);熟悉自定义函数库(extend.func.php);熟悉前台入口文件(common.inc.php)
七、微信公众平台开发
1、微信运行机制
公众号与php之间用什么语言通信:Xml
Weixin.php中是如何接收公众号数据的:
$postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];//接收数据 XML数据
2、消息类型
微信目前提供了7种基本消息类型,分别为:
(1)文本消息(text);
(2)图片消息(image);
(3)语音(voice)
(4)视频(video)
(5)地理位置(location);
(6)链接消息(link);
(7)事件推送(event)
类型。掌握不同的消息类型发送时的数据传递格式
3、将整个文件读入一个字符串的函数是
File_get_contents
4、常用函数
把xml数据解析成对象的函数是
simplexml_load_string( )
将字符串转换为数组的函数是___ explode_________,将数组转化为字符串的函数是____implode________.
编码 URL 字符串的字符串是____urlencode________.
5、Sprintf函数的作用
这个都是可以查手册的。
6、微信公众号出现无法提供服务的原因?
(1)网络原因 ,数据接口原因
(2)代码错误,怎么推测原因
修改的哪里检查一下,如果代码没错
可以输出数据 看一下。用php操作文件
$myfile = fopen(“newfile.txt”, “w”);
txt="aaaaaaaaaa";fwrite(txt ="aaaaaaaaaa";
fwrite(txt="aaaaaaaaaa";fwrite(myfile, txt);fclose(txt);
fclose(txt);fclose(myfile);
7、自定义菜单的事件推送
单击
单击跳转链接
扫码推事件
扫码推且弹出
弹出系统拍照发图的事件
弹出微信相册发图器的事件
弹出地理位置选择器的事件
8、token的作用
安全机制验证,用于微信服务器与PHP服务器之间的安全验证

分类
PHP编程

2020年最新的PHP面试题(附答案)(PHp面试题)

1. 什么是面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。

2、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

3. HTTP 状态中302、403、 500代码含义?

一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列

302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。

4. Linux 下建立压缩包,解压缩包的命令

Tar.gz:

打包: tar czf file.tar.gz file.txt

解压: tar xzf file.tar.gz

Bz2:

打包: bzip2 [-k] 文件

解压: bunzip2 [-k] 文件

Gzip(只对文件,不保留原文件)

打包: gzip file1.txt

解压: gunzip file1.txt.gz

Zip: -r 对目录

打包: zip file1.zip file1.txt

解压: unzip file1.zip

5. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?

Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型 Varchar 与char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。 Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

6. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?

MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。

创建索引:alert table tablename add index (`字段名`)

7. 不使用cookie向客户端发送一个cookie.

理解:session_start()开启时,生成一个常量 SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。通过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面可以使用SESSION里面的值。 当客户端开启COOKIE和服务器端开启SESSION时。 浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID. 当浏览器第二次请求时,会把已存在

8. isset() 和 empty() 区别

Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。

9. 如何在页面之间传递变量(至少两种方式) ? GET,POST,COOKIE,SESSION,隐藏表单

1. 写出匹配URL的正则表达式.

‘/^(https?|ftps?):\/\/(www)\.([^\.\/]+)\.(com|cn|org)(\/[\w-\.\/\?\%\&\=]*)?/i’

2. 请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。

常见的排序算法: 冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法。

冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就象气泡在水中向上浮一样,所以该算法也称为气泡排序法。

// 冒泡排序法

Function mysort($arr){

For($i=0; $i<count($arr); $i++){

For($j=0; $j<count($arr)-1-$i; $j++){

If($arr[$j] > $arr[$j+1]){

$tmp=$arr[$j];

$arr[$j]=$arr[$j+1];

$arr[$j+1]=$tmp;

}

}

}

Return $arr;

}

$arr=array(3,2,1);

print_r(mysort($arr));

3. 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

在PHP中error_reporting这个函数有什么作用?

设置 PHP 的报错级别并返回当前级别。

请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。

if(isset($_POST['action']) && $_POST['action']==’submitted’){

$email=$_POST['email'];

if(!preg_match(“/^[0-9a-zA-Z-][email protected][0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+){1,3}$/”,$email)){

echo “电子邮件检测失败”;

}else{

echo “电子邮件检测成功”;

}

}

使用PHP描述快速排序算法,对象可以是一个数组?

原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:

(1)从数列中挑出一个元素,称该元素为“基准”。

(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。

(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。

//快速排序(数组排序)

function QuickSort($arr){

$num = count($arr);

$l=$r=0;

for($i=1;$i<$num;$i++){

if($arr[$i] < $arr[0]){

$left[] = $arr[$i];

$l++;

}else{

$right[] = $arr[$i];

$r++;

}

}

if($l > 1){

$left = QuickSort($left);

}

$new_arr = $left;

$new_arr[] = $arr[0];

if($r > 1){

$right = QuickSort($right);

}

for($i=0;$i<$r;$i++){

$new_arr[] = $right[$i];

}

return $new_arr;

}

使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

//二分查找(数组里查找某个元素)

function bin_sch($array, $low, $high, $k){

if ($low <= $high){

$mid = intval(($low+$high)/2);

if ($array[$mid] == $k){

return $mid;

}elseif ($k < $array[$mid]){

return bin_sch($array, $low, $mid-1, $k);

}else{

return bin_sch($array, $mid+1, $high, $k);

}

}

return -1;

}

//顺序查找(数组里查找某个元素)

function seq_sch($array, $n, $k){

$array[$n] = $k;

for($i=0; $i<$n; $i++){

if($array[$i]==$k){

break;

}

}

if ($i<$n){

return $i;

}else{

return -1;

}

}

写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())

//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序

function array_sort($arr, $keys, $order=0) {

if (!is_array($arr)) {

return false;

}

$keysvalue = array();

foreach($arr as $key => $val) {

$keysvalue[$key] = $val[$keys];

}

if($order == 0){

asort($keysvalue);

}else {

arsort($keysvalue);

}

reset($keysvalue);

foreach($keysvalue as $key => $vals) {

$keysort[$key] = $key;

}

$new_array = array();

foreach($keysort as $key => $val) {

$new_array[$key] = $arr[$val];

}

return $new_array;

}

请以空格作为间隔,拆分字符串’Apple Orange Banana Strawberry’,组成数组$fruit,

* 数组中所有元素都用小写字母,并按照字母先后次序排序

class sort {

private $str;

public function __construct($str) {

$this->str=strtolower($str);

}

private function explodes() {

if(empty($this->str)) return array();

$arr=explode(" ",$this->str);

return is_array($arr)?$arr:array($arr);

}

public function sort() {

$explode=$this->explodes();

sort($explode);

return $explode;

}

}

$str='Apple Orange Banana Strawberry';

$sortob=new sort($str);

var_dump($sortob->sort());

对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息

class regx {

public static function check($str) {

if(preg_match("/^([1-9,])+$/",$str)) {

return true;

}

return false;

}

}

$str="12345,6";

if(regx::check($str)) {

echo "suc";

} else {

echo "fail";

}

请写一段程序,在服务器创建一个文件fruit.dat,将试题3中得到的数组写入到改文件中,然后写一段程序从文件中读取并还原数组@author zhuwenqiong

class sort {

private $str;

public function __construct($str) {

$this->str=strtolower($str);

}

private function explodes(){

if(empty($this->str)) return array();

$arr=explode(" ",$this->str);

return is_array($arr)?$arr:array($arr);

}

public function sort() {

$explode=$this->explodes();

sort($explode);

return $explode;

}

}

class file {

private $sort=null;

private $filepath;

public function __construct($arrobj,$path) {

$this->sort=$arrobj;

$this->filepath=$path;

}

private function getresource($filename,$mode) {

return fopen($this->filepath.$filename,$mode);

}

private function closeresource($resource) {

fclose($resource);

}

public function savefile($filename) {

$arr=$this->sort->sort();

$fopen=$this->getresource($filename,"a+");

if(!$fopen){

echo "文件打开失败!";

exit;

}

var_dump($arr);

foreach($arr as $key=>$value) {

fwrite($fopen,$value."\n");

}

$this->closeresource($fopen);

}

public function readfile($filename) {

$this->savefile($filename);

$fopen=$this->getresource($filename,"r");

if(!$fopen){

echo "文件打开失败!";exit;

}

$arr=array();

while(!feof($fopen)) {

$get=fgets($fopen);

if(!empty($get))

$arr[]=str_replace("\n","",$get);

}

$this->closeresource($fopen);

return $arr;

}

}

$file=new file(new sort('Apple Orange Banana Strawberry'),"E:\\");

$arr=$file->readfile("fruit.dat");

var_dump($arr);

单例模式,创建mysqli数据库链接的单例对象

class Db {

private static $instance;

public $handle;

Private function __construct($host,$username,$password,$dbname) {

$this->handle=NULL;

$this->getcon($host,$username,$password,$dbname);

}

public static function getBb() {

self::$instance=new Db();

return self::$instance;

}

private function getcon($host,$username,$password,$dbname) {

if($this->handle!=NULL){

return true;

}

$this->handle=mysqli_connect($host,$username,$password,$dbname);

}

}

windows平台, Apache Http Server启动失败, 排错思路是什么?

检查apache使用的80端口是否被占用,如果被占用,先停止占用80端口的服务,然后启动apache服务器

PHP session扩展默认将session数据储存在哪里? D

A) SQLite Database

B) MySQL Database

C) Shared Memory

D) File System

E) Session Server

如果你想要自动加载类,下面哪种函数声明是正确的 C

A) function autoload($class_name)

B) function __autoload($class_name, $file)

C) function __autoload($class_name)

D) function _autoload($class_name)

E) function autoload($class_name, $file)

PHP程序使用utf-8编码, 以下程序输出结果是什么? B

<?php

$str = ’hello你好世界’;

echo strlen($str);

?>

A) 9

B) 13(gbk)

C) 18

D) 17(utf8)

你所知道的php数组相关的函数?

array()—-创建数组

array_combine()—-通过合并两个数组来创建一个新数组

range()—-创建并返回一个包含指定范围的元素的数组

compact()—-建立一个数组

array_chunk()—-将一个数组分割成多个

array_merge()—-把两个或多个数组合并成一个数组

array_slice()—-在数组中根据条件取出一段值

array_diff()—-返回两个数组的差集数组

array_intersect()—-计算数组的交集

array_search()—-在数组中搜索给定的值

array_splice()—-移除数组的一部分且替代它

array_key_exists()—-判断某个数组中是否存在指定的key

shuffle()—-把数组中的元素按随机顺序重新排列

array_flip()—-交换数组中的键和值

array_reverse()—-将原数组中的元素顺序翻转,创建新的数组并返回

array_unique()—-移除数组中重复的值

php读取文件内容的几种方法和函数?

打开文件,然后读取。Fopen() fread()

打开读取一次完成 file_get_contents()

以下程序,变量str什么值的情况下输入111?

if( ! $str ) { echo 111; }

在$str值为:0,’0′,false,null,”"

你所知道的PHP的一些技术(smarty等)?

Smarty,jquery,ajax,memcache,div+css,js,mysqli,pdo,svn,thinkphp,brophp,yii

你所熟悉的PHP论坛系统 有哪些?

Discuz

你所熟悉的PHP商城系统 有哪些?

Ecshop

你所熟悉的PHP开发框架 有哪些?

Brophp,thinkphp

说说你对缓存技术的了解?

1、缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。

2、使用memcache可以做缓存。

你所知道的设计模式有哪些?

工厂模式、策略模式、单元素模式、观察者模式、命令链模式

说说你对代码管理的了解? 常使用那些代码版本控制软件?

通常一个项目是由一个团队去开发,每个人将自己写好的代码提交到版本服务器,由项目负责人按照版本进行管理,方便版本的控制,提高开发效率,保证需要时可以回到旧版本。

常用的版本控制器:SVN

说说你对SVN的了解?优缺点?

SVN是一种版本控制器,程序员开发的代码递交到版本服务器进行集中管理。

SVN的优点:代码进行集中管理,版本控制容易,操作比较简单,权限控制方便。

缺点:不能随意修改服务器项目文件夹。

怎么找到PHP.ini的路径?

一般都在php的安装目录下,或者window系统的windows目录下。

PHP加速模式/扩展? PHP调试模式/工具?

Zend Optimizer加速扩展

调试工具:xdebug

你常用到的mysql命令?

Show databases

Show tables

Insert into 表名() values()

Update 表名 set 字段=值 where …

Delete from 表名 where …

Select * from 表名 where 条件 order by … Desc/asc limit … Group by … Having …

进入mysql管理命令行的命令?

Mysql -uroot -p 回车 密码

show databases; 这个命令的作用?

显示当前mysql服务器中有哪些数据库

show create database mysql; 这个命令的作用?

显示创建数据库的sql语句

show create table user; 这个命令的作用?

显示创建表的sql语句

desc user; 这个命令的作用?

查询user表的结构

explain select * from user; 这个命令的作用?

获取select相关信息

show processlist; 这个命令的作用?

显示哪些线程正在运行

SHOW VARIABLES; 这个命令的作用?

显示系统变量和值

SHOW VARIABLES like ’%conn%’; 这个命令的作用?

显示系统变量名包含conn的值

LEFT JOIN 写一个SQL语句?

1

SELECT A.id,A.class FROM A LEFT JOIN B ON A.cid=B.id

in, not ni, exist, not exist的作用和区别?

in在什么中

Not in 不在什么中

Exists 存在

Not exists 不存在

怎么找到数据库的配置文件路径?

在数据库安装目录下,my.ini

简述Linux下安装PHP的过程?

安装软件之前先安装编译工具gcc、gcc-c++

拷贝源码包,解包解压缩

Cd /lamp/php进入php目录

./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc指定安装目录和配置文件目录

Make 编译

Make install安装

简述Linux下安装Mysql的过程?

Groupadd mysql 添加一个用户组mysql

Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql

Cd /lamp/mysql 进入mysql目录

./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all

Make

Make all

简述Linux下安装apache的过程?

Cd /lamp/httpd 进去apache软件目录

./configure –prefix=/usr/local/apache2/ –sysconfdir=/etc/httpd/ –with-included-apr

Make

Make all

HTML/CSS/DIV/Javascritp:

1. 设计一个页面(4个 div 第一个div 宽960px 居中;第2-4个div 3等分960px;)

<style>

Body{ Text-align:center; Margin:0; Padding:0; }

#box{ Width:960px; Margin:0 auto; }

.small{ Width:320px; Float:left; }

</style>

<div id=’box’>

<div class=’small’></div>

<div class=’small’></div>

<div class=’small’></div>

</div>

用javascript取得一个input的值?取得一个input的属性?

document.getElementById(‘name’).value;

document.getElementById(‘name’).type;

用Jquery取得一个input的值?取得一个input的属性?

$(“input[name='aa']“).val();

$(“input[name='aa']“).attr(‘type’);

请您写一段ajax提交的js代码,或者写出ajax提交的过程逻辑。

var xmlhttp;

if(window.XMLHttpRquest){

xmlhttp=new XMLHttpRequest();

}else if(window.ActiveXObject){

xmlhttp=new ActiveXObject(‘Microsoft.XMLHTTP’);

}

xmlhttp.open(‘GET’,’1.php?aa=name’,true);

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readyState==4){

if(xmlhttp.status==200){

var text=xmlhttp.responseText;

}

}

}

xmlhttp.send(null);

简述Cookie的设置及获取过程

设置COOKIE的值:

Setcookie(名称,值,保存时间,有效域);

获取值:$_COOKIE['名称'];

面向对象中接口和抽象类的区别及应用场景?

1、有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。

2、接口中全部是抽象方法,方法不用使用abstract定义。

3、当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。

用面向对象来实现A对象继承B和C对象

Interface B{ … }

Interface C{ … }

Class A implements B,C{ … }

写出Smarty模板引擎中你最常用的关键词

Assign Display Foreach

Section Loop Item

$smarty Now Const get

l 增加一个字段性别sex,写出修改语句

Alert table user add sex enum(’0′,’1′);

查询出年龄介于20岁到30岁之间的用户

Select * from user where age>20 and age<30

如果是一个Web频繁访问的查询,上题的查询如何优化?

可对where后面的字段 age 建立索引,也可对语句建立存储过程。

echo(),print(),print_r()的区别?

Echo,print是PHP语句, print_r是函数,

Print()只能打印出简单类型变量的值(如int,string),有返回值。

print_r()可以打印出复杂类型变量的值(如数组,对象)

echo 输出一个或者多个字符串,无返回值

什么是模板技术、能够使HTML和PHP分离开使用的模板?

模板技术就是使程序的逻辑代码和界面分开的技术。

能够使HTML和PHP分开的模板有:Smarty、Template、PHPlib Template、FastTemplate

对于大流量的网站,您采用什么样的方法来解决访问量问题?

优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:

1、确定当前服务器设备是否满足流量需求。

2、使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。

3、禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。

4、控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。

5、使用不同的主机分流主要流量,使服务器均衡负载。

6、使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

mysql_fetch_row() 和mysql_fetch_array之间有什么区别?

Mysql_fetch_row()是从结果集中取出一行作为枚举数组,mysql_fetch_array()是从结果集中取出一行作为索引数组或关联数组或两种方式都有。

实现中文字串截取无乱码的方法

Mb_substr();

用PHP写出显示客户端IP与服务器IP的代码

获取客户端IP:$_SERVER(“REMOTE_ADDR”);

获取服务器端IP:$_SERVER["SERVER_ADDR"];

有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?

获取网页内容:

$url=”http://www.phpres.com/index.html“;

$str=file_get_contents($url);

或 $ch=curl_init();

curl_setopt($ch,CURLOPT_URL,’’);

curl_setopt($ch,CURLOPT_HEADER,0);

curl_exec($ch);

curl_close($ch);

请写一个函数验证电子邮件的格式是否正确

function checkemail($email){

echo preg_match(‘/^[0-9a-zA-Z-][email protected][0-9a-zA-Z-]+\.[0-9a-zA-Z]+$/’,$email)?’email格式正确‘:’email格式不正确‘;

}

简述如何得到当前执行脚本路径,包括所得到参数

用$_SERVER['SCRIPT_FILENAME'].$_SERVER['REQUEST_URI'];取得当前页面的完整路径和参数。

取得参数:$_SERVER['QUERY_STRING'];

JS表单弹出对话框函数是?获得输入焦点函数是?

Alert(); focus();

写一个函数,算出两个文件的相对路径

如 $a = ’/a/b/c/d/e.php’;

$b = ’/a/b/12/34/c.php’;

计算出 $b 相对于 $a 的相对路径应该是 http://www.cnblogs.com/c/d将()添上

$a=”http://www.cnblogs.com/a/b/c/d/e.php”;

$b=”http://www.cnblogs.com/a/b/12/34/c.php”;

$ainfo=parse_url($a);

$binfo=parse_url($b);

$apath=ltrim($ainfo['path'],'/');

$bpath=ltrim($binfo['path'],'/');

$arr=explode('/',$apath);

$brr=explode('/',$bpath);

$flag=false;

for($i=0;$i<count($arr);$i++){

if($arr[$i]!==$brr[$i]){

$ab[$i]='..';

if(!$flag){

for($j=$i;$j<count($brr);$j++){

$bb[]=$brr[$j];

}

$flag=true;

}

}

}

$cha=array_merge($ab,$bb);

$cha=implode('/',$cha);

print_r($cha);

写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

function my_scandir($dir){

$files = array();

if ( $handle = opendir($dir) ){

while ( ($file = readdir($handle)) !== false ) {

if ( $file != ".." && $file != "." ) {

if ( is_dir($dir . "/" . $file) ) {

$files[$file] = scandir($dir . "/" . $file);

}else {

$files[] = $file;

}

}

}

closedir($handle);

return $files;

}

}

数据库索引有几类,分别是什么?什么时候该用索引?

普通索引、主键索引、唯一索引

并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。

写几个魔术方法并说明作用?

__call()当调用不存在的方法时会自动调用的方法

__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件

__set()当给未定义的变量赋值时会自动调用的方法

__get()当获取未定义变量的值时会自动调用的方法

__construct()构造方法,实例化类时自动调用的方法

__destroy()销毁对象时自动调用的方法

__unset()当对一个未定义变量调用unset()时自动调用的方法

__isset()当对一个未定义变量调用isset()方法时自动调用的方法

__clone()克隆一个对象

__tostring()当输出一个对象时自动调用的方法

$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILES的意思是什么?

它们都是PHP预定义变量

$_REQUEST用来获取post或get方式提交的值

$_POST用来获取post方式提交的值

$_GET用来获取get方式提交的值

$_COOKIE用来获取cookie存储的值

$_SESSION用来获取session存储的值

$_FILES用来获取上传文件表单的值

数组中下标最好是什么类型的,为什么?

数组的下标最好是数字类型的,数字类型的处理速度快。

++i和i++哪一个效率高,为什么?

++i效率比i++的效率更高,因为++i少了一个返回i的过程。

magic_quotes_gpc()、magic_quotes_runtime()的意思是什么?

Magic_quotes_gpc()是php配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在‘之前加\

Magic_quotes_runtime()是php中的函数,如果参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。

框架中什么是单一入口和多入口,单一入口的优缺点?

1、多入口就是通过访问不同的文件来完成用户请求。

单一入口指web程序所有的请求都指向一个脚本文件的。

2、单一入口更容易控制权限,方便对http请求可以进行安全性检查。

缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。

你对Memcach的理解,优点有哪些?

Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库。使用memcache做缓存的好处是:提高网站的访问速度,减轻高并发时服务器的压力。

Memcache的优点:稳定、配置简单、多机分布式存储、速度快。

对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:

a) 索引的目的是什么?

1、快速访问数据表中的特定信息,提高检索速度

2、创建唯一性索引,保证数据库表中每一行数据的唯一性

3、加速表和表之间的连接

4、使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

b) 索引对数据库系统的负面影响是什么?

负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。

c) 为数据表建立索引的原则有哪些?

1、在最频繁使用的、用以缩小查询范围的字段上建立索引

2、在平频繁使用的、需要排序的字段上建立索引

d) 什么情况下不宜建立索引?

1、对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引

2、对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。

web应用中,数据库的读取频率远高于写入频率, 如何优化MySQL而应对此种情景?

使用memcache缓存技术,将动态数据缓存到文件,访问动态页面时直接调用缓存文件,而不必重新访问数据库,这样就减少了查询数据库的次数。

如果网站的访问量很大,可以把数据库读写服务器分开,使用多台服务器去处理数据库查询,使用较少的服务器去处理数据库的写入和修改。

include与require的区别?

1.include()在执行文件时每次都要进行读取和评估

require()文件只处理一次(实际上文件内容替换了require()语句)

2.require()通常放在PHP脚本程序的最前面

include()的使用和require()一样,一般放在流程控制的处理区段中,PHP脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化

3,require()和include()语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样

4,include_once()和require_once()语句也是在脚本执行期间包括并运行指定文件,与include()require()唯一的区别是如果文件中的代码已经被包括了,则不会再次包括.

5,require()包含文件失败,停止执行,给出错误(致命的)

include()常用于动态包含.

通常是自动加载的文件,即使加载出错,整个程序还是继续执行

一个页面声明,另一个页面调用

包函文件失败,继续向下执行,返回一条警告

PHP字符串中单引号与双引号的区别?

单引号不能解释变量,而双引号可以解释变量。

单引号不能转义字符,在双引号中可以转义字符。

php中,模板引擎的目的是什么? 你用过哪些模板引擎?

使用模板引擎的目的是使程序的逻辑代码和html界面代码分离开,是程序的结构更清晰。

使用过的模板引擎:Smarty、ThinkPHP的ThinkTemplate

指出以下代码片段中的SQL注入漏洞以及解决方法(magic_quotes_gpc = off)

1

mysql_query(“select id,title from content where catid=’{$_GET[catid]}’ and title like ’%$_GET[keywords]%’”, $link);

注入漏洞主要存在用户提交的数据上,这里的注入漏洞主要是$_GET[catid]和$_GET[keyword]

解决注入漏洞:

$_GET[catid]=intval($_GET[catid]);

$sql=”select id,title from content where catid=’{$_GET[catid]}’ and title like ’%$_GET[keywords]%”;

$sql=addslashes($sql);

Mysql_query($sql);

分别指出php.ini中 magic_quotes_gpc, magic_quotes_runtime两项参数的作用.

Magic_quotes_gpc的作用是在POST、GET、COOKIE数据上使用addslashes()自动转义。

Magic_quotes_runtime参数的作用是设置状态,当状态为0时则关闭自动转义,设置为1则自动转义,将数据库中取出来的单引号、双引号、反斜线这些字符加上反斜杠转义。

写出以下php代码的运行结果:

<?php

function foo($i) {

$i++;

echo $i ;

}

function bar(&$i) {

}

$i = 10 ;

echo $i++ , ++$i; 输出:10,12

foo($i); 输出:13

bar($i); 输出:无输出

如何快速下载一个远程http服务器上的图片文件到本地?

$file=”";

$fp=fopen($file,’rb’);

$img=fread($fp,10000);

$dir=”./”;

$local=fopen($dir.’/’.basename($file),’w');

Fwrite($local,$img);

什么是时间戳? 如何取得当前时间戳?

时间戳是从1970年1月1日 00:00:00到指定日期的秒数。

获取当前时间戳:time()

了解XSS攻击吗? 如何防止 ?

XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。

使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。

SQL注入漏洞产生的原因 ? 如何防止?

SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。

防止SQL注入:

1、开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置

2、执行sql语句时使用addslashes进行sql语句转换

3、Sql语句书写尽量不要省略小引号和单引号

4、过滤掉sql语句中的一些关键字:update、insert、delete、select、*

5、提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

6、Php配置文件中设置register_globals为off,关闭全局变量注册

7、控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。

一个字节占多少bit ? 一个IPv4地址占几个字节? 一个IPv6地址呢?

一个字节占8bit,一个IPV4占用4字节,一个IPV6占用16字节。

142.M ADSL宽带连接, 理想情况下, 最大下载速度是多少KB/s ?

256KB/s

143.请写出一个正则表达式,用于匹配一个HTML文件中<img />标记中的图片地址

$url=”<img src=’11.jpg’/>”;

/<img[\s]*src=['|\"](.*)['|\"][\s]*\/>/

145.Fatal error: Call to undefined method ge_user() in /website/index.php on line 39

调用了未定义的方法ge_user(),检查程序中有没有定义此方法

146.Fatal error: Class ’client’ not found in /website/index.php on line 173

类client没有找到,检查文件中有没有client类,或者有没有包含client类文件

Warning: Cannot modify header information – headers already sent by (output started at /website/index.php:1) in /website/index.php on line 3

提示文件前面有输出,检查是否有输出,或者编码

148.Warning:session_start(): open(/website/tmp/sess_47e067121facf033785f9a1cb16d243b, O_RDWR) failed: No such file or directory (2) in /website/index.php on line 10

没有找到文件或目录,检查文件是否存在

149.Parse error: syntax error, unexpected T_STRING in /website/index.php on line 18

18行语法错误,检查语法

150.Warning:fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /website/index.php on line 2

没有找到welcome.txt文件,检查文件是否存在

1、抓取远程图片到本地,你会用什么函数?

fsockopen, A

3、用PHP打印出前一天的时间,打印格式是2007年5月10日22:21:21

Echo date(‘Y-m-d H:i:s’,strtotime(‘-1 day’));

4、javascript能否定义二维数组,如果不能你如何解决?

javascript不支持二维数组定义,可以用arr[0] = new array()来解决

5、假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。

<script>

function go2b(){

window.location = “b.html”;

window.close();

}

setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()

</script>

//正在浏览当前页面用户的 IP 地址:127.0.0.1

echo $_SERVER["REMOTE_ADDR"].”<br />”;

//查询(query)的字符串(URL 中第一个问号 ? 之后的内容):id=1&bi=2

echo $_SERVER["QUERY_STRING"].”<br />”;

//当前运行脚本所在的文档根目录:d:inetpubwwwroot

echo $_SERVER["DOCUMENT_ROOT"].”<br />”;

7、在HTTP 1.0中,状态码 401 的含义是未授权____;如果返回“找不到文件”的提示,则可用 header 函数,其语句为header(“HTTP/1.0 404 Not Found”);

401表示未授权;header(“HTTP/1.0 404 Not Found”);

9、把 John 新增到 users 阵列?

$users[] = ‘john’; array_push($users,‘john’);

在PHP中error_reporting这个函数有什么作用?

error_reporting() 设置 PHP 的报错级别并返回当前级别。

13、如何修改SESSION的生存时间(1分).

方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache

方法2:$savePath = “./session_save_dir/”;

$lifeTime = 小时 * 秒;

session_save_path($savePath);

session_set_cookie_params($lifeTime);

session_start();

方法3:

setcookie() and session_set_cookie_params($lifeTime);

14、有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?($1分)

方法1(对于PHP5及更高版本):

$readcontents = fopen(“http://www.phpres.com/index.html”, “rb”);

$contents = stream_get_contents($readcontents);

fclose($readcontents);

echo $contents;

方法2:

echo file_get_contents(“http://www.phpres.com/index.html”);

16、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php

答案1:

function getExt($url){

$arr = parse_url($url);

$file = basename($arr['path']);

$ext = explode(“.”,$file);

return $ext[1];

}

答案2:

function getExt($url) {

$url = basename($url);

$pos1 = strpos($url,”.”);

$pos2 = strpos($url,”?”);

if(strstr($url,”?”)){

Return substr($url,$pos1 + 1,$pos2 – $pos1 – 1);

} else {

return substr($url,$pos1);

}

}

使用五种以上方式获取一个文件的扩展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,

必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数 get_ext1($file_name), get_ext2($file_name)

function get_ext1($file_name){

return strrchr($file_name, ‘.’);

}

function get_ext2($file_name){

return substr($file_name,strrpos($file_name, ‘.’));

}

function get_ext3($file_name){

return array_pop(explode(‘.’, $file_name));

}

function get_ext4($file_name){

$p = pathinfo($file_name);

return $p['extension'];

}

function get_ext5($file_name){

return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), ‘.’)));

}

18、<?php

$str1 = null;

$str2 = false;

echo $str1==$str2 ? ‘相等’ : ‘不相等’;

$str3 = ”;

$str4 = 0;

echo $str3==$str4 ? ‘相等’ : ‘不相等’;

$str5 = 0;

$str6 = ’0′;

echo $str5===$str6 ? ‘相等’ : ‘不相等’;

?>

相等 相等 不相等

MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?

Varchar是变长,节省存储空间,char是固定长度。查找效率要varchar型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些

请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)

(1)var img = new Image();

(2)var img = document.createElement(“image”)

(3)img.innerHTML = “<img src=”xxx.jpg” />”

请描述出两点以上XHTML和HTML最显著的区别

(1)XHTML必须强制指定文档类型DocType,HTML不需要

(2)XHTML所有标签必须闭合,HTML比较随意

写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)

MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎

求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数

方法一:

<?php

class Dtime{

function get_days($date1, $date2){

$time1 = strtotime($date1);

$time2 = strtotime($date2);

return ($time2-$time1)/86400;

}

}

$Dtime = new Dtime;

echo $Dtime->get_days(’2007-2-5′, ’2007-3-6′);

?>

方法二:

<?php

$temp = explode(‘-’, ’2007-2-5′);

$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);

$temp = explode(‘-’, ’2007-3-6′);

$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);

echo ($time2-$time1)/86400;

方法三:echo abs(strtotime(“2007-2-1″)-strtotime(“2007-3-1″))/60/60/24 计算时间差

请写一个函数,实现以下功能:

字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。

方法:

function str_explode($str){

$str_arr=explode(“_”,$str);$str_implode=implode(” “,$str_arr); $str_implode=implode

(“”,explode(” “,ucwords($str_implode)));

return $str_implode;

}

$strexplode=str_explode(“make_by_id”);print_r($strexplode);

方法二:

$str=”make_by_id!”;

$expStr=explode(“_”,$str);

for($i=0;$i<count($expStr);$i++){

echo ucwords($expStr[$i]);

}

方法三:echo str_replace(‘ ‘,”,ucwords(str_replace(‘_’,’ ‘,’open_door’)));

一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。

DELIMITER //

create procedure proc_countNum(in columnId int,out rowsNo int)

begin

select count(*) into rowsNo from member where member_id=columnId;

end

call proc_countNum(1,

select @no;

方法:视图:

create view v_countNum as select member_id,count(*) as countNum from member group by

member_id

select countNum from v_countNum where member_id=1

js中网页前进和后退的代码

前进: history.forward();=history.go(1);

后退: history.back();=history.go(-1);

echo count(“abc”); 输出什么?

答案:1

count — 计算数组中的单元数目或对象中的属性个数

int count ( mixed$var [, int $mode ] ), 如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回1,有一个例外,如果 var 是 NULL 则结果是 0。

对于对象,如果安装了 SPL,可以通过实现 Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。

有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)

<?php

function BubbleSort(&$arr){

$cnt=count($arr);

$flag=1;

for($i=0;$i<$cnt;$i++){

if($flag==0){

return;

}

$flag=0;

for($j=0;$j<$cnt-$i-1;$j++){

if($arr[$j]>$arr[$j+1]){

$tmp=$arr[$j];

$arr[$j]=$arr[$j+1];

$arr[$j+1]=$tmp;

$flag=1;

}

}

}

}

$test=array(1,3,6,8,2,7);

BubbleSort($test);

var_dump($test);

30、请举例说明在你的开发过程中用什么方法来加快页面的加载速度

要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具。

31、.以下的代码会产生什么?为什么?

$num =10;

function multiply(){

$num =$num *10;

}

multiply();

echo $num;

由于函式 multiply() 没有指定 $num 为全域变量(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。

HTTP协议中GET、POST和HEAD的区别?

HEAD: 只请求页面的首部。

GET: 请求指定的页面信息,并返回实体主体。

POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

(1)HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。

(2)在FORM提交的时候,如果不指定Method,则默认为GET请 求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为 该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;

GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

(3)GET 这个是浏览器用语向服务器请求最常用的方法。POST这个方法也是用来传送数据的,但是与GET不同的是,使用POST的时候,数据不是附在URI后面传递的,而是要做为独立的行来传递,此时还必须要发送一个Content_length标题,以标明数据长度,随后一个空白行,然后就是实际传送的数据。网页的表单通常是用POST来传送的。

分类
PHP编程

PHP 没你想的那么差(php简单么)

PHP现在名声很糟糕,因为它曾经是“可怕”的。本文试着回答一些常见的关于 PHP 的断言,目的是向非技术人员解释,PHP 并不像许多人所说的那么糟糕。

它是不是鼓励糟糕的实践?

不再是了。过去,许多开发者被书本教授非常糟糕的实践,因此 PHP 代码的质量非常差。PHP 曾经还允许你做一些非常奇怪的事情,使得它非常容易构建,但维护起来却是一场噩梦。

这些不再是常见的问题。随着高质量学习材料的引入,这些材料易学且易获取,一名新的开发人员可以以正确的方式学习 PHP。这样就可以避免初级开发者因为不知道构建事物的正确方法而编写一些维护起来非常痛苦的代码。

随着框架的引入,导致许多糟糕体验的大部分通用代码现在都自动完成了;因此,开发人员只需使用框架,框架就可以正确地对其进行编码。

而且,这些年来,一些糟糕的实践是由缺失的特性造成的,导致了一些本不应该被允许的事情被允许。现在大多数情况下,甚至不可能实现以前编写的一些东西来导致这种声誉。

小结

  • 它不再鼓励糟糕的实践…
  • 通过使用框架避免了糟糕实践。
  • 语言特性现在有很多讨论。糟糕的特性不再受到支持。
  • PHP 添加了其他语言中存在的大部分(即使不是全部)的特性。

它的安全性是不是很差?

过去,PHP应用程序的安全性通常很差,因为语言允许这样做。这些东西不再被使用,因为 PHP 应用程序的开发现在已经完全不同。

通过使用自动加载程序来包含文件而不是动态包含文件,已经移除了远程和本地文件包含(其中 PHP 从其它地址而不是最初打算的地址读取文件)。

通过广泛使用模板系统(可以自动处理显示动态内容的转义和安全问题),已经避免了由于直接在 PHP 中直接使用 HTML 所导致的跨站脚本攻击(其中一个用户将 JavaScript 脚本添加到要显示给另一个用户的地方)。

通过在 SQL 中使用 prepared 语句,避免了 SQL 注入攻击(这是由于需要构建 SQL 查询并将查询和数据一起发送导致的,其中用户可以向查询中增加额外的 SQL 命令)。另外,ORM 的使用也很普遍,它确保用户数据和查询是分开发送的,而 SQL 不能将其视为单独的命令。

通过广泛使用且采用 nonce 系统的 form 库,避免了跨站请求伪造(其中,用户能够被诱骗在你的站点上执行某些操作)。

小结

  • 不再是了。
  • 通过使用自动加载程序(所有主流框架的标配),避免了远程和本地文件包含。
  • 通过使用模板语言作为标准或一种前端框架(例如 React),避免了跨站脚本(XSS)攻击。
  • 通过使用 ORMs 和广泛使用 prepared 语句,避免了 SQL 注入。
  • 通过使用 nonce token(被所有主流框架自动支持),避免了跨站请求伪造(CRSF)攻击。

它是不是真的很慢?

这取决于你把它与什么比较。如果你把 PHP 与 Java、C 或者 Go 比较,那么它是比较慢。但是如果你把 PHP 与 Python、Ruby 等等比较,那么它并不慢。在同类型的语言中,PHP 是最快的之一,并且不断在提高性能。

大多数情况下,你的应用程序慢是因为服务器过载或者数据库查询慢。这些问题在任何语言中都会存在。

小结

  • PHP 与编译型语言相比是比较慢。
  • PHP 与其它脚本型语言相比是比较快的。
  • 网站慢通常不是由于使用的语言不够快,而是因为服务器或数据库导致的性能问题。

它的伸缩性是不是真的很差?

实际上,任何语言都可以伸缩。编译型语言(例如 Go、C 或 Rust)比脚本型语言(例如 PHP)的扩展成本更低。然而,它们并不是为了同样的任务而设计的。事实上,它们都是一样的;这简单地归结于你使用的服务器数量。如果你使用足够多的服务器,你可以扩展任何应用程序。PHP 比其它脚本型语言的扩展成本更低,因为它需要更少的资源来开始运行,并且可以在具有更多 CPU 的较小内存的服务器上运行。

另外,对于伸缩性,重要的是数据库。如果你能够扩展你的数据库,你就可以扩展你的应用程序。数据库比应用服务器更难扩展。增加另一个读取数据库的客户端很容易;但是,让数据库快速运行要难得多。

小结

  • 任何语言都可以伸缩;这取决于你使用多少服务器。
  • 扩展的真正问题是数据库而不是所使用的应用程序语言。
  • 如果你能够扩展你的数据,你就能扩展你的应用程序。

我应该一直使用它吗?

不。每种编程语言都有其擅长的领域。PHP 非常适合 Web 应用程序。你应该用它来构建网站和 API。

如果你正在构建一个系统应用程序,其中每毫秒都很重要,使用 Rust 或者 C。

如果你正在构建一个人工智能应用程序,Python 是一个好选项。

如果你正在构建一个 SaaS 应用程序,PHP 是一个好选项。

如果你正在构建一个安卓应用程序,Kotlin 是一个好选项。

如果你正在构建一个运行在多个平台上的应用程序,Java 是一个好选项。

小结

  • 不,每种语言都有其最佳用例。
  • PHP 的最佳用例是 Web 应用程序。
  • Go、Rust、C 适合系统应用程序。
  • Python 适合人工智能。
  • Kotlin 适合安卓应用程序。
  • Java 适合与平台无关的应用程序。

结论

很多关于 PHP 的说法都已经过时 10 年了。在我们看来,如果有人给你关于某个技术主题的过期 10 年的信息,那么这个人可能不是你想要信任的技术专家。

PHP 是创建 Web 应用程序的一门好编程语言,我们认为它是 Web 应用程序开发的最佳语言。

小结

  • 这些抱怨中很多都过期 10 年了。
  • 我们认为 PHP 是构建 Web 应用程序的最佳语言。

原文链接:

https://www.getparthenon.com/blog/php-isnt-that-like-really-bad/

分类
PHP编程

php的数据类型有哪些(php有几种数据类型)

1、整型(Integer )

整型仅包含整数,包括正数和负数,即没有小数部分或小数点的数字。它们可以是十进制(基数10),八进制(基数8)或十六进制(基数16)。默认基数为十进制(基数为10)。八进制整数可以用前导0声明,十六进制可以用前导0x声明。整数范围必须介于-2 ^ 31到2 ^ 31之间。

例子:

<?php

// 十进制整数

$deci1 = 50;

$deci2 = 654;

// 八进制整数

$octal1 = 07;

//十六进制

$octal = 0x45;

$sum = $deci1 + $deci2;

echo $sum;

?>

输出:

704

2、浮点型(Double or float)

可容纳包含小数或小数部分的数字,包括正数和负数。默认情况下,变量添加最小的小数位数。

例子:

<?php

$val1 = 50.85;

$val2 = 654.26;

$sum = $val1 + $val2;

echo $sum;

?>

输出:

705.11

3、字符串(String )

保存任何字母,包括偶数。这些在声明期间用双引号编写。字符串也可以在单引号中编写,但在打印变量时将以不同的方式处理。为了澄清这一点,请看下面的示例。

例子:

<?php

header(“content-type:text/html;charset=utf-8”);

$name = “欧阳克”;

echo “我的名字是 $name \n”;

echo ‘我的名字是 $name’;

?>

输出:

我的名字是 欧阳克

我的名字是 $name

4、空值(NULL)

这些是特殊类型的变量,只能包含一个值,即NULL。我们按照惯例用大写字母写,但要区分大小写。

例子:

<?php

$nm = NULL;

echo $nm; // 这将不会给出任何输出

?>

5、布尔型(Boolean)

只包含两个值,TRUE或FALSE。成功的事件将返回true,不成功的事件将返回false。在布尔值中,NULL类型值也被视为false。除了NULL, 0在布尔值中也被认为是FALSE。如果一个字符串是空的,那么它在布尔数据类型中也被认为是FALSE。

例子:

<?php

header(“content-type:text/html;charset=utf-8”);

if(TRUE)

echo “这个条件是 TRUE”;

if(FALSE)

echo “这个条件不是 TRUE,是FALSE”;

?>

输出:

这个条件是 TRUE

6、数组(array)

数组是一种复合数据类型,可以存储相同数据类型的多个值。下面是一个整数数组的例子。

<?php

header(“content-type:text/html;charset=utf-8”);

$intArray = array( 10, 20 , 30);

echo “第一个元素是: $intArray[0]\n”;

echo “第二个元素是: $intArray[1]\n”;

echo “第三个元素是: $intArray[2]\n”;

?>

输出:

第一个元素是: 10

第二个元素是: 20

第三个元素是: 30

7、对象(Object)

对象数据类型也可以用于存储数据。对象被定义为用户定义的类的实例,这些类可以同时包含值和函数。

在 PHP 中,对象必须声明。

首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。

然后我们在类中定义数据类型,然后在实例化的类中使用数据类型。

8、资源(Resources)

PHP中的Resources不是确切的数据类型。这些基本用于存储对某些函数调用或外部PHP资源的引用。例如,考虑一个数据库调用,这是一个外部资源。

分类
PHP编程

微软将放弃Windows对PHP的支持(php是微软公司开发的吗)

IT之家 7 月 12 日消息 据微软官方介绍,微软将在 Windows 上放弃对 PHP 的支持。从 Windows Vista 开始 Windows 就开始支持 PHP。

Microsoft PHP 项目经理 Dale Hirt 近日提供了以下信息。

我们知道,对于漏洞修复,当前的发布日期是 2 年,而对于安全修复,则是 1 年之后。这意味着 PHP 7.2 将在 11 月停止支持。PHP 7.3 仅在 11 月才进入安全修复模式。PHP 7.4 将继续进行一年的错误修复,然后再进行一年的安全修复。只要官方支持,我们致力于在 Windows 上针对 7.2、7.3 和 7.4 维护 PHP 的开发和构建。但是,我们不会以 8.0 及更高版本的任何能力支持 Windows 的 PHP。

IT之家了解到,如果要在 Windows 上运行最新的 PHP 版本,则需要使用 WSL 并在 Linux 环境中运行 PHP。

分类
网络相关源码

PHP和易语言通讯RSA和RC4加密源码

PHP和易语言通讯RSA和RC4加密源码

.版本 2 .支持库 spec .程序集 程序集1 .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 可以根据您的需要返回任意数值 .子程序 _临时子程序 .局部变量 data, 文本型 .局部变量 PuKey, 文本型 .局部变量 PiKey, 文本型 .局部变量 Pu_P, 整数型 .局部变量 enc, 文本型 .局部变量 Pi_P, 整数型 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 ' 调试输出 (RSA生成密钥 (1024, “PuKey.pem”, “PiKey.pem”)) data = “Hello World!(您好,世界!)!@#¥%……&*” PuKey = 到文本 (读入文件 (“PuKey.pem”)) PiKey = 到文本 (读入文件 (“PiKey.pem”)) ' 调试输出 (PuKey, PiKey) ' ------------------------------------------------- Pu_P = RSA设置公钥 (PuKey) enc = RSA公钥加密 (Pu_P, data) 调试输出 (enc) RSA释放指针 (Pu_P) ' ------------------------------------------------- Pi_P = RSA设置私钥 (PiKey) 调试输出 (编码_Utf8到Ansi (到字节集 (RSA私钥解密 (Pi_P, “UC24YXTE9eP5r6frENIntcHd7a5fJCwQwnLi3shWa65RvhHOgkzpk850Zdro+RLrxary0+q2TMfoTy0Hs0Sx85kDTZAUTqhs6eraMQzAnceCwTA03PuhaDUaWH9H3YdkLqX7Q13SwtMTlD9NL/0KZJGYi6S4QAemJv3hyc24ty4=”)))) RSA释放指针 (Pi_P)
分类
易语言视频教程

PHP+MySQL与易语言结合实例演示教程

第一课、初步了解PHP代码_转.mp4

第二课、简单的登录_转.mp4

第三课、帐号注册_转.mp4

第四课、验证登录cookie正确_转.mp4

第五课、文件信息的保存_转.mp4

第六课、文件读出_转.mp4

第七课、文件的审核_转.mp4

第八课、文件的举报_转.mp4

第九课、文件下载_转.mp4

第十课、总结_转.mp4

分类
易语言视频教程

1小时学会:php+mysql+易语言

1小时学会:php+mysql+易语言1

1小时学会:php+mysql+易语言2

1小时学会:php+mysql+易语言3

1小时学会:php+mysql+易语言4

分类
数据库类源码

PHP PDO数据中间件

用更流行通用和安全的PDO方式来操作数据,支持?模板转义方式操作数据。

数据通信依然动态加密,并且进行了签名,每个功能封包用一次即过期,保证通信的安全性。支持多线程并发操作。

比以前增加了更多,更丰富的使用例程,