面试题1
面试题1
7、建立索引:
a.格式:
(普通索引)->
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))
(唯一索引)->
创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))
(主键)->
它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])
8、优化查询语句
a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";
8、PHP的意思(送1分)
答:PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
9、MYSQL取得当前时间的函数是?,格式化日期的函数是(2分) 答:now(),date()当前日期函数为 NOW();
格式化日期函数是:
SELECT DATE_FORMAT('2009-01-11 17:25:36',"%H:%i:%s %m/%d/%Y");
->17:25:36 01/11/2009
一、session和cookie的区别?原理?
区别:session存储在服务器端,cookie是存储在客户端。session安全性高,cookie的安全性弱。
session的工作原理
(1)当有Session启动时,服务器生成一个唯一值,称为SessionID(好像是通过取进程ID的方式取得的)。
(2)然后,服务器开辟一块内存,对应于该SessionID。
(3)服务器再将该SessionID写入浏览器的cookie(一些在网页的源代码中有所体现)。
(4)服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放该内存块。
(5)当浏览器连入IIS(服务器)时并请求的ASP(脚本语言)内用到Session时,IIS(服务器)就读浏览器Cookie中的
SessionID。
(6)然后,服务检查该SessionID所对应的内存是否有效。
(7)如果有效,就读出内存中的值。
(8)如果无效,就建立新的Session。
注意:
(1)在大浏览量的网站,Session并不保险,我们过去的网站就经常碰到存在Session中得值不正确(可能出现重复的
Session ID)。
(2)Session ID不能从硬盘上的Cookie文件获得,如果想在客户端获知自己的Session ID,只能通过Javascrīpt来读取。
cookie的原理
Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用
程序都可以读取 Cookie 包含的信息。 Cookie 的基本工作原理如果用户再次访问站点上的页面,当该用户输入
URLwww.*****.com时,浏览器就会在本地硬盘上查找与该 URL 相关联的 Cookie。如果该 Cookie 存在,浏览器就将它
与页面请求一起发送到您所在的站点。
二、MyIsAm和InnoDb的区别和用处?
区别:InnoDb保持了数据的完整性。
MyIsAm查询的时候访问速度快。
用处:涉及到事务的情况下用到innodb以及外部键等高级数据库功能。 innodb不支持FULLTEXT类型的索引
查询数据多的情况下用到myisam,myisam强调的是性能,执行速度比innodb快,
三、javascript在IE和Firefox上的区别?除了css外
答:也就是浏览器不能同时兼容。(一般情况下区别不是很大,)
例如:document.formname.item("itemname") 这样的语句,不能在 火狐下运行
(2)解决方法:改用 document.formname.elements["elementname"]
使用 window.event 无法在 mf 上运行
四、将$a=array(1,2,3,4,5);存储到memcache中
<?php
header('content-type:text/html;charset=utf-8');
$memcache = new Memcache;
$memcache->connect('127.0.0.1','11211');
$a=array(1,2,3,4,5);
$memcache->set('array', $a);
var_dump($memcache->get('array'));
五、电子邮箱地址
/^(?:w+.?)*w+@(?:w+.?)*w+$/
六、用dom解析xml
例如 原始的liu.xml
<?xml version="1.0" encoding="utf-8"?>
<people>
<good>
<one>liuYongKang</one>
<two>liuYongXian</two>
<three>liuYongYan</three>
</good>
<good>
<one>wangYan</one>
<two>wangLiHong</two>
<three>wangShaoGuo</three>
</good>
</people>
变为
<?xml version="1.0" encoding="utf-8"?>
<people>
<good>
<one>wangYan</one>
<two>wangLiHong</two>
<three>wangShaoGuo</three>
</good>
</people>
答案:php解析xml
$dom=new DOMDocument('1.0','utf-8');
$dom->load('liu.xml');
$book = $dom->documentElement;
$goods=$dom->getElementsByTagName("good")->item(0);
$oldchapter = $book->removeChild($goods);
echo $dom->saveXML();
七、jquery和javascript的区别?
jquery是对js的一个封装,使得原来js的操作更加的方便
如用js取 id 要写 document.getElementById("id")
jquery只要 $("#id")就可以了。
jquery对于DOM元素的选择,浏览器的监容,,等方面都极大的提高了js开发速度 JQUERY 是用JAVASCRIPT语言开
发的一套框架。
*********************************************************************************************************
*******************
1、数据库搜索引擎
InnoDB
MyISAM
Memory将数据存到内存中。存储速度快,一般用于存储session。
MRG_MyISAM
2、静态化和伪静态化的优缺点
伪静态化的实现简单,但是效率高。
静态化是使页面中的部分功能受到限制,页面不灵活,但是大大减轻了服务器的负担。
伪静态
1 打开 Apache 的配置文件 httpd.conf 。
2 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉
3 在 httpd.conf中添加:
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+\.html
RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+)\.html 1.php?__is_apache_rewrite=1&__rewrite_arg=2
</IfModule>
3、删除时确认
<a href="javascript:if(confirm("确实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a>
4、遍历文件夹下所有文件
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] = rec_scandir($dir . "/" . $file);
} else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
5、让一个页面每20秒钟刷新一次而不用Javascript?
<meta http-equiv="refresh" content="20″>
meta标签将页面转发到一个新的页面
<meta http-equiv="refresh" content="2;url=http://www.mianwww.com">
6、密码找回方案主要有以下几种:
1. 用户预设找回密码问题,并且提供找回密码答案。
2. 用户通过email 找回密码
采用第二种方案的前提是:
1. 注册用户必须提供正确的邮箱,否则将不能使用系统所提供的密码重设功能。
2. 必须由该用户通过邮箱确认。
7、HTML元素的ID和Name属性有什么区别?
ID是唯一的,而Name是可以重复的
*********************************************************************************************************
****************
图胜面试题
1、使用哪些工具进行版本控制?
答:cvs、svn、vss
2、优化MYSQL数据库的方法?
答: ①选取最适用的字段属性。
②是用连接(JOIN)来代替子查询(Sub-Queries)。
③是用联合(UNION)来代替手动创建的临时表。
④事务
⑤锁定表
⑥使用外键
⑦使用索引
⑧优化的查询语句
3、您是否用过模板引擎? 如果有您用的模板引擎的名字是?
答:使用过smarty。
4、对于大流量的网站,您采用什么样的方法来解决访问量问题?
答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,
程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量
图片放到另一台服务器上。以及生成静态页面,进一步减轻服务器负担。
5、include和require的区别是什么?
答:include是如果程序出现错误,会产生一个警告,但程序会继续执行。
require是如果程序出现错误,会产生一个致命错误,程序停止执行。
6、在HTTP 1.0中,状态码401的含义是(?);如果返回"找不到文件"的提示,则可用 header 函数,其语句为(?);(2分)
答:状态401代表未被授权,header("Location:www.xxx.php");
7、谈谈对mvc的认识
答:mvc是一种设计模式,即编程思想。由模型(model),视图(view),控制器(controller)完成的应用程序由模型发
出要实现的功能到 控制器,控制器接收组织功能传递给视图;
8、在PHP中error_reporting这个函数有什么作用?
答::设置错误级别与错误信息回报
9、get post的区别
答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.
10、数据类型占多少字节?
答:bigint 8
int 4
smallint 2
tinyint 1
11、索引的意思?什么时候用?
答:查询和搜索多的时候用索引。
12、验证邮箱
答:function check_email()
{
var email=$('#email').val();
var reg=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/i;
if(!reg.test(email))
{
$('#email_msg').html('邮箱输入错误');
return false;
}
else
{
$('#email_msg').html('可以注册');
}
return true;
}
13、修改session生存时间
答:将php.ini中的session.gc_maxlifetime设置为9999重启apache
或者 $lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
14、ajax分页
客户端通过每次传递当前页和每页显示的数据大小到服务器端,服务器端接受参数并按照分页算法,查询对应
的数据,并且返回Json 格式的字符串,客户端根据服务端返回的Json字符串,通过使用eval方法转换为对象并
存放到resopnseObj变量中,则我们可以通过 访 问responseObj访问查询的数据,最后使用javascript Dom中
对象的innerHTML的方法实现数据的显示
15、yii和tp的区别?
答:1、Yii是纯面向对象的的框架,TP提供了一系列单字母函数。
2、TP的各种基类仍旧是直接命名,如Think类。命名过程中可冲突。Yii则在框架的类都加上了C前缀(接口是I
前缀),有效地避 免了这个问题。
3、Yii还支持自定义autoload方法。
4、TP在应用初始化的时候执行session_start(),Yii则是你用到session的时候才打开session。
5、TP要求是config.php,而Yii则比较灵活,支持多配置文件。
16、请写一个函数验证电子邮件的格式是否正确 (2分)
答:function checkEmail($email)
{
$pregEmail = "/([a-z0-9]*[-_/.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[/.][a-z]{2,3}([/.][a-z]
{2})?/i";
return preg_match($pregEmail,$email);
}
17、Smarty优点
1. 速度快:相对其他模板引擎。
2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件
3 缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页
4. 插件技术:smarty可以自定义插件。
******************************************************
14、对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)
答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,程序功能规则,禁止外部的盗链,控制大
文件的下载,使用不 同主机分流主要流量
答:①最根本的是服务器硬件条件。服务器硬件设备如果太差,那不管怎么优化都是徒劳!
②对数据库进行优化。主要是减少对数据库的访问量。访问过多会造成服务器CPU过度消耗,导致服务器受访
能力 严重下降,解 决方法是前台使用静态或者动态缓存!
③防盗链。对于Apache服务器,主要是是用model_rewrite 模块通过对URL的正则,进行限制和重定向!
④控制大文件下载。不提供超过2MB的文件下载,或使用专门的下载服务器,或者上传到web2.0共享网站上。
⑤多主机 分流。将不同文件放置在不同的主机 ,提供镜像之类的文件下载方式。 // 内容来自js4j.com//
⑥是用专业 的流量分析软件 。如google流量分析。对网站进行精细的流量控制!
15、用PHP写出显示客户端IP与服务器IP的代码1分)
答:打印客户端IP:echo $_SERVER['REMOTE_ADDR']; 或者: getenv('REMOTE_ADDR');
打印服务器IP:echo gethostbyname("www.bolaiwu.com")
16、语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们? (2分)
答:require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require
include->include有返回值,而require没有(可能因为如此require的速度比include快)
注意:包含文件不存在或者语法错误的时候require是致命的,include不是
17、如何修改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);
###################################################
18、有一个网页地址, 比如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");
答:$src = 'http://www.163fly.com/index.php';
$file = 'D:\index.html';
①$content = file_get_contents($src);
$hfile = fopen($file,w);
$result = fwrite($hfile,$content);
②$opsrc = fopen($src,r);
$wfile = fopen($file,w);
$result = stream_copy_to_stream($opsrc,$wfile);
19、在HTTP 1.0中,状态码401的含义是(?);如果返回"找不到文件"的提示,则可用 header 函数,其语句为(?);(2
分)
答:状态401代表未被授权,header("Location:www.xxx.php"); 404是出错
12、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须?(1分)
答:heredoc的语法是用"<<<"加上自己定义成对的标签,在标签范围?的文字视为一个字符串
例子:
$str = <<<SHOW
my name is Jiang Qihui!
SHOW;
###答:<<<标识符
......
标识符;
结束标识符前不能有任何其它字符!
13、谈谈asp,php,jsp的优缺点(1分)
答:ASP全名Active Server Pages,是一个WEB服务器端的开发环境,利用它可以产生和运
行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VB Script(Java script
)作为自己的开发语言。
PHP是一种跨平台的服务器端的嵌入式脚本语言. 它大量地借用C,Java和Perl语言的语法
, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面.它支持目前绝大多数数
据库。还有一点,PHP是完全免费的,不用花钱,你可以从PHP官方站点(http://www.php.ne
t)自由下载。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。
JSP 是Sun公司推出的新一代站点开发语言,他完全解决了目前ASP,PHP的一个通病--
脚本级执行(据说PHP4 也已经在Zend 的支持下,实现编译运行).Sun 公司借助自己在Jav
a 上的不凡造诣,将Java 从Java 应用程序和 Java Applet 之外,又有新的硕果,就是Js
p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能强大的站点
程序。
三者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。
但JSP代码被编译成 Servlet 并由 Java 虚拟机解释执行,这种编译操作仅在对 JSP 页面的
第一次请求时发生。在 ASP 、PHP、JSP 环境下, HTML 代码主要负责描述信息的显示样式
,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 、PH
P、JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到
HTML 代码中,然后一起发送给浏览器。 ASP 、PHP、 JSP三者都是面向 Web 服务器的技术
,客户端浏览器不需要任何附加的软件支持。
14、谈谈对mvc的认识(1分)
答:由模型(model),视图(view),控制器(controller)完成的应用程序由模型发出要实现的功能到控制器,控制器接收
组织功能传递给视图;
15、写出发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)(2分)
答:SELECT * FROM `members` ORDER BY posts DESC limit 0,10;
16. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?(2分)
答:按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递则不需要复制值,对于性能提高很有好处。
17. 在PHP中error_reporting这个函数有什么作用? (1分) 答:设置错误级别与错误信息回报
*************############################***********************
填空题:
1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量【$_SERVER['PHP_SELF']】中;而链接到当前
页面的URL记录在预定义变量【$_SERVER['HTTP_REFERER']】中
2.执行程序段<?php echo 8%(-2) ?>将输出【0】。
3.在HTTP 1.0中,状态码 401 的含义是【401表示未授权】如果返回"找不到文件"的提示,则可用 header 函数,其
语句为【header("HTTP/1.0 404 Not Found");】。
4.数组函数 arsort 的作用是【arsort:对数组进行逆向排序并保持索引关系】;语句 error_reporting(2047)的作用是
【报告所有错误和警告】。
##########5.PEAR中的数据库连接字符串格式是leaves __【】。
6. 写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把scrīpt标记及其内容都去掉):【<?php $script="以下内
容不显示:<script language='javascript'>alert('cc');</script>"; echo preg_replace("/<script[^>].*?>.*?
</script>/si", "替换内容", $script); ?>】
##########7.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句____动态装载PHP模块,然后再用语句____
使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
LoadModule php5_module "c:/php/php5apache2.dll" , AddType application/x-httpd-php .php,
8. 语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是【在如何处理失败时,include()
产生一个警告而 require() 则导致一个致命错误;】;为了避免多次包含同一文件,可以用语句
【require_once||include_once】来代替它们。
##########9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是【】。
10.一个函数的参数不能是对变量的引用,除非在php.ini中把【allow_call_time_pass_reference boolean】设为on.
11.SQL 中LEFT JOIN的含义是【自然左外链接】。如果 tbl_user记录了学生的姓名(name)和学号(ID),tbl_score记录
了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和 考试成绩(score)以及考试科目(subject),要想打印出
各个学生姓名及对应的的各科总成绩,则可以用SQL语句【select A.id,sum(B.score) as sumscore from tbl_user A
left join tbl_score B on A.ID=B.ID group by A.id】。
12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须【结束标识符所在的行不能包含任何其它字符除";"】。
编程题:
13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
答:
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;
}
}
14.简述论坛中无限分类的实现原理。
答:
<?php
/*
数据表结构如下:
CREATE TABLE `category` (
`categoryID` smallint(5) unsigned NOT NULL auto_increment,
`categoryParentID` smallint(5) unsigned NOT NULL default '0',
`categoryName` varchar(50) NOT NULL default '',
PRIMARY KEY (`categoryID`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES
(0, '一级类别'),
(1, '二级类别'),
(1, '二级类别'),
(1, '二级类别'),
(2, '三级类别'),
(2, '333332'),
(2, '234234'),
(3, 'aqqqqqd'),
(4, '哈哈'),
(5, '66333666');
*/
//指定分类id变量$category_id,然后返回该分类的所有子类
//$default_category为默认的选中的分类
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
global $DB;
$sql = "SELECT * FROM category ORDER BY categoryID DESC";
$result = $DB->query( $sql );
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' => $rows[categoryID],
'parent' => $rows[categoryParentID], 'name' => $rows
[categoryName]);
}
if (!isset($category_array[$category_id]))
{
return "";
}
foreach($category_array[$category_id] AS $key => $category)
{
if ($category['id'] == $default_category)
{
echo "<option selected value=".$category['id']."";
}else
{
echo "<option value=".$category['id']."";
}
if ($level > 0)
{
echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "</option>\n";
}
else
{
echo ">" . $category['name'] . "</option>\n";
}
Get_Category($key, $level + 1, $default_category);
}
unset($category_array[$category_id]);
}
/*
函数返回的数组格式如下所示:
Array
(
[1] => Array ( [id] => 1 [name] =>一级类别 [level] => 0 [ParentID] => 0 )
[4] => Array ( [id] => 4 [name] =>二级类别 [level] => 1 [ParentID] => 1 )
[9] => Array ( [id] => 9 [name] =>哈哈 [level] => 2 [ParentID] => 4 )
[3] => Array ( [id] => 3 [name] =>二级类别 [level] => 1 [ParentID] => 1 )
[8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 )
[2] => Array ( [id] => 2 [name] =>二级类别 [level] => 1 [ParentID] => 1 )
[7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 )
[6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 )
[5] => Array ( [id] => 5 [name] =>三级类别 [level] => 2 [ParentID] => 2 )
[10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 )
)
*/
//指定分类id,然后返回数组
function Category_array($category_id = 0,$level=0)
{
global $DB;
$sql = "SELECT * FROM category ORDER BY categoryID DESC";
$result = $DB->query($sql);
while ($rows = $DB->fetch_array($result))
{
$category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows;
}
foreach ($category_array AS $key=>$val)
{
if ($key == $category_id)
{
foreach ($val AS $k=> $v)
{
$options[$k] =
array(
'id' => $v['categoryID'], 'name' => $v['categoryName'], 'level' => $level,
'ParentID'=>$v['categoryParentID']
);
$children = Category_array($k, $level+1);
if (count($children) > 0)
{
$options = $options + $children;
}
}
}
}
unset($category_array[$category_id]);
return $options;
}
?>
<?php
class cate
{
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
echo $category_id;
$arr = array(
'0' =>array(
'1' => array('id' => 1, 'parent' => 0, 'name' => '1111'),
'2' => array('id' => 2, 'parent' => 0, 'name' => '2222'),
'4' =>array('id' => 4, 'parent' => 0, 'name' => '4444')
),
'1' =>array(
'3' => array('id' => 3, 'parent' => 1, 'name' => '333333'),
'5' =>array('id' => 5, 'parent' => 1, 'name' => '555555')
),
'3' =>array(
'6' => array('id' => 6, 'parent' => 3, 'name' => '66666'),
'7' =>array('id' => 7, 'parent' => 3, 'name' => '77777')
),
'4' =>array(
'8' => array('id' => 8, 'parent' => 4, 'name' => '8888'),
'9' =>array('id' => 9, 'parent' => 4, 'name' => '9999')
)
);
if (!isset($arr[$category_id]))
{
return "";
}
foreach($arr[$category_id] AS $key => $cate)
{
if ($cate['id'] == $default_category)
{
$txt = "<option selected value=".$cate['id']."";
}else{
$txt = "<option value=".$cate['id']."";
}
if ($level > 0)
{
$txt1 = ">" . str_repeat( "-", $level ) . " " . $cate['name'] . "</option>\n";
}else{
$txt1 = ">" . $cate['name'] . "</option>\n";
}
$val = $txt.$txt1;
echo $val;
self::Get_Category($key, $level + 1, $default_category);
}
}
function getFlush($category_id = 0,$level = 0, $default_category = 0)
{
ob_start();
self::Get_Category($category_id ,$level, $default_category);
$out = ob_get_contents();
ob_end_clean();
return $out;
}
}
$id =$_GET['id'];
echo "<select>";
$c = new cate();
//$c->Get_Category();
$ttt= $c->getFlush($id,'0','3');
echo $ttt;
echo "</select>";
?>
###########################################################################7、优化MYSQL数据库的方法。
(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这
个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.
集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master
(3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没
有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) ... where article_id
= ? 就可以了,不要先select * ... where article_id = ?然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update ... set title = ? where article_id
= ?不要set content = ?(大文本)
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度
6.优化MySQL数据库的方法?
答:①选取最适用的字段属性。
②是用连接(JOIN)来代替子查询(Sub-Queries)。
③是用联合(UNION)来代替手动创建的临时表。
④事务
⑤锁定表
⑥使用外键
⑦使用索引
⑧优化的查询语句
上面8条优化的详细说明请点击该链接查看完全优化MySQL数据库性能的八大巧方法
###########################################################################8、谈谈事务处理
A给B的账户转账50美元的例子
###########################################################################9、apache+mysql+php实现最大负
载的方法
见7
1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的的前一页面
URL记录在预定义变量(2)中
<?php
//本页地址,SCRIPT_NAME也可以:php/test.php
echo $_SERVER['PHP_SELF']."<br />";
//链接到当前页面的前一页面的 URL 地址:
echo $_SERVER['HTTP_REFERER']."<br />";
//其它的见参考手册:语言参考》变量》预定义变量
//前执行脚本的绝对路径名:D:Inetpubwwwrootphp est.php
echo $_SERVER["SCRIPT_FILENAME"]."<br />";
//正在浏览当前页面用户的 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 />";
?>
2.执行程序段<?php echo 8%(-2) ?>将输出__。
<?php
//参考手册》语言参考》运算符》算术运算符》%为取模运算,输出0
echo 8%(-2)."<br />";
//取模 $a % $b 在 $a 为负值时的结果也是负值。输出-2
echo ((-8)%3)."<br />";
//输出2
echo (8%(-3))."<br />";
?>
########################################################################2 在PHP中error_reporting这个函数
有什么作用?
答:查看哪个PHPerror被记录
3 请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。
答:
/*
检查邮件地址是否为邮件地址,返回逻辑值
*/
function CheckMailAdr($str){
return(eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$str));
}
、、、、、、、、、、、、、、、、、、、、、、、、
<?php
if(isset($_POST['action']) && $_POST['action']=='submitted')
{
$email=$_POST['email'];
if(!preg_match("/^(?:w+.?)*w+@(?:w+.?)*w+$/",$email))
{
echo "电子邮件检测失败";
}
else
{
echo "电子邮件检测成功";
}
}
else
{
?>
<html>
<head><title>EMAIL检测</title>
<script type="text/javascript">
function checkEmail(sText)
{
var reg=/^(?:w+.?)*w+@(?:w+.?)*w+$/;
var email=document.getElementById(sText).value;
if(!reg.test(email))
{
alert("电子邮件检测失败");
}
else
{
alert("电子邮件格式正确");
}
}
</script>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
电子邮件:<input type="text" id="email" name="email" /><br />
<input type="hidden" name="action" value="submitted" />
<input type="button" name="button" value="客户端检测" onclick="checkEmail('email')" />
<input type="submit" name="submit" value="服务器端检测" />
</form>
</body>
</html>
<?php
}
?>
######################################################4 简述如何得到当前执行脚本路径,包括所得到参数。
<?php
echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
//echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
?>
说明:例如有一个脚本 www.domain.com,传给他的参数有参数1,参数2,参数3…。传递参数的方法有可能是GET有
可能是POST,那 么现在请写出类似:http://www.domain.com/script.php?参数1=值1&参数2=值2..... 的结果
关于前执行脚本路径感觉有点歧义:若 是得到该脚本在服务器上的绝对路径用
$_SERVER['APPL_PHYSICAL_PATH'].若是该脚本的URL则可以用获取获取所有参数:可以用以下方法:
//获取post的数据
while (list($var, $value) = each($HTTP_POST_VARS))
{
echo "$var = $value n";
}
//获取get方式的数据
while (list($var, $value) = each($HTTP_GET_VARS))
{
echo "$var = $value n";
}
19. 简述如何得到当前执行脚本路径,包括所得到参数。(2分)
答:$script_name = basename(__file__); print_r($script_name);
5 有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何
改善执行效率。(该函数必须自己实现,不能使用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);
?>
###############################################【Mysql部
分】#################################################
Mysql部分
1 创建poll表,用于记录单选投票用户的数据
字段包括 id[ Autoincreace ] , ip , time , iid(用户选则的选项,int型)
写出create上述table的完整sql语句
drop table if exists poll;
/*==============================================================*/
/* Table: poll */
/*==============================================================*/
create table poll
(
id int unsigned not null auto_increment,
ip varchar(15) not null,
time datetime not null,
iid int not null,
primary key (id)
)
2 写出将一个选择2号选项的ip为127.0.0.1的用户在当前时间的投票记录到数据库 答:insert into poll
(ip,time,iid) values('127.0.0.1',now(),2);
3 写出满足下边条件的SQL语句
item表的结构为 id(就是poll表中的iid) , descp(用户选择的选项的文字)
请查询并返回10条记录,包括ip和用户选择的选项的文字
4 现在因为投票人数太多,网站时常出现too many connection的错误,请提供解决方案
方法一:加大MySql的最大连接数
mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够的,当连接请求大于默认连接
数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些,编辑my.ini
修改 max_connections=1000
方法二,不用mysql数据库,改为直接写文件,详细方法参照问题5
若非要用 mysql,还可
方法三:由于用mysql语句调用数据库时,在每次之执行语句前,会做一个临时的变量用来打开数据库,所以你在使用
mysql语句的时候,记得在每次调用完mysql之后就关闭mysql临时变量
5 在成功解决连接数的问题后,发现程序运行缓慢,经查发现是mysql并发太多,表被锁定的现象严重,请提供解决
方案
对 于访问量大的,本来就不推荐使用数据库,可以考虑直接写到文本中,根据预测的访问量,先定义假若是100个文件
文件名依次为 1.txt,2.txt…100.txt,每有用户投票的时候,随机往其中的一个文件中写入投票信息。统计的时候,再
对所有文本文件中的数据进行分析。必 要的时候,再导入数据库
drop table if exists item;
/*==============================================================*/
/* Table: item */
/*==============================================================*/
create table item
(
id int not null,
descp varchar(200) not null,
primary key (id)
);
select A.ip,b.descp
from poll A,item B
where A.id=B.id
limit 10
6 因为用户实在太多,所以又分配给你两台服务器,你会如何来安排这3台服务器?
对于服务器分配,其实有好几种方案(建议采用LINUX主机),先列出一个解决方案。
1. 考虑到电信,网通(南北差异)互访问速度慢的问题,可以让电信的用户走电信的线,网通的走网通的线。大致可
以这样分配,国内南方用户(电信用户)拥有一台 服务器A;北方用户(网通用户)拥有一台服务器B。国外的用户也可
以考虑给一台服务器C。用户访问的时候,首先访问的是针对国外的服务器,那台机器是电信 网通的用户访问速度都差
不多的(可以考虑就租用香港或是什么地方的),经过服务器C判断后直接跳到相应的服务器。统计时三台机器的数据合
起来。
7 现在开始要求同一ip不能重复投票,请指出如何对数据表进行相应的修改
ALTER TABLE `phpinterview`.`poll` ADD unique INDEX `IX_poll_ip`(`ip`);
8. 原有数据已经有很多重复ip的数据了,所以我们把它导出为一个txt,格式和上边的poll一致,用TAB键间隔,请
写一段程序,删除ip有重复的记录,并统计每个投票选项的投票数
<?php
//读取文本并放入数组
$apoll = file("c:\1.txt");
//对每一行数据进行分割,从而获取了一个二维数组
for ($i=0;$i<count($apoll);$i++)
{
$poll[$i] = split(" ",$apoll[$i]);
}
//获取IP、出现的次数数据
$arrIP=array();
for($i=0;$i<count($poll);$i++)
{
$arrIP[$poll[$i][1]]=isset($arrIP[$poll[$i][1]])?$arrIP[$poll[$i][1]]+1:1;
}
//获取选项、投票个数
$arrRes=array();
for($i=0;$i<count($poll);$i++)
{
if($arrIP[$poll[$i][1]]==1)
{
$arrRes[$poll[$i][3]]=isset($arrRes[$poll[$i][3]])?$arrRes[$poll[$i][3]]+1:1;
}
}
var_dump($arrRes);
?>
mysql5.0测试版:
/*========================得到测试数据c: .txt=========*/
SELECT *
into outfile 'c: .txt'
FROM `testok`;
/*========================载入临时表=========*/
create TABLE phpinterview.testok(id int,ip varchar(15),time datetime,iid int);
LOAD DATA INFILE 'c: .txt'
into table testok;
/*=========================删除ip有重复的记录=========*/
delete A from testok A,(select