防止SQL注入
简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。
防止SQL注入漏洞可以用哪些函数?
- addslashes()
- mysql_escape_string()
SQL注入产生的原因:
程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入的方式:
-
开启配置文件中的
magic_quotes_gpc
和magic_quotes_runtime
设置, - 执行sql语句时使用
addslashes()
进行sql语句转换
Sql语句书写尽量不要省略双引号和单引号。 - 过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。
- 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
- Php配置文件中设置
register_globals
为off,关闭全局变量注册,控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。
算法:https://www.kancloud.cn/i281151/php_questions/198601
排序
//快速排序
public function quick_sort($arr) {
//先判断是否需要继续进行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//如果没有返回,说明数组内的元素个数 多余1个,需要排序
//选择一个标尺
//选择第一个元素
$base_num = $arr[0];
//遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$left_array = array();//小于标尺的
$right_array = array();//大于标尺的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左边数组
$left_array[] = $arr[$i];
} else {
//放入右边
$right_array[] = $arr[$i];
}
}
//再分别对 左边 和 右边的数组进行相同的排序处理方式
//递归调用这个函数,并记录结果
$left_array = $this->quick_sort($left_array);
$right_array = $this->quick_sort($right_array);
//合并左边 标尺 右边
return array_merge($left_array, array($base_num), $right_array);
}
public function bubble_sort($array){
//冒泡排序
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j--){
if ($array[$j]<$array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
echo(),print(),print_r()的区别?
- echo 和 print 不是一个函数,是一个语言结构;
- print(string $arg) 只有一个参数;
-
echo arg1,arg2
可以输出多个参数,返回 void ; - echo 和 print 只能打印出string,不能打印出结构;
- print_r能打印出结构。比如:
$arr = array("key"=>"value");
print_r($arr);
语句include和require的区别是什么?
- 在失败的时候:
- include 产生一个 warning ,而 require 直接产生错误中断;
- require 在运行前载入;
- include 在运行时载入;
- require_once 和 include_once 表示了只包含一次,可以避免重复包含同一文件。
- require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行
- include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去
- 注意:包含文件不存在或者语法错误的时候require是致命的,而include不是
下面哪项没有将john添加到users数组中?
- (a) $users[] = 'john';
- (b) array_add($users,'john');
- (c) array_push($users,'john');
- (d) $users ||= 'john';
- 答案为bd,php 里面无 array_add 函数,d项为语法错误的表达。
HTTP协议中几个状态码的含义。
- 200 : 请求成功,请求的数据随之返回。
- 301 : 永久性重定向。资源(网页等)被永久转义到其他URL
- 302 : 暂时行重定向。
- 401 : 当前请求需要用户验证。
- 403 : 服务器拒绝执行请求,即没有权限。
- 404 : 请求失败,请求的数据在服务器上未发现。请求的资源(网页等)不存在
- 500 : 服务器错误。一般服务器端程序执行错误。
- 503 : 服务器临时维护或过载。这个状态时临时性的。
- 505 - 内部服务器错误
写出一些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复制一个对象时候调用。
MySQL存储引擎 MyISAM 和 InnoDB 的区别。
- a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
- b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
- c. InnoDB不支持FULLTEXT类型的索引.
- d. InnoDB中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可.
- e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
- f. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
- g. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
- h. MyISAM支持表锁,InnoDB支持行锁。
说出一些MySQL优化方法?
- 索引。
- 缓存。
- 避免join
- 静态页面
- 选取最适用的字段属性:字段长度和非空
- 优化查询语句
- 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
- 选择合适的表字段数据类型和存储引擎,适当的添加索引
- mysql库主从读写分离。
- 找规律分表,减少单表中的数据量提高查询速度。
- 添加缓存机制,比如memcached,apc等。
- 不经常改动的页面,生成静态页面。
- 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.
- 优化查询语句
- 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";```
- 1、选取最适用的字段属性
- MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
- 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。
- 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
- 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。
说下php中empty()和isset()的区别。
- isset 用于检测变量是否被设置,使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE 。
- empty 如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE 。
- 如果变量为 0 ,则empty()会返回TRUE,isset()会返回TRUE;
- 如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE;
- 如果变量未定义,则empty()会返回TRUE,isset()会返回FLASE。
- 注意:isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。
当要 判断一个变量是否已经声明的时候 可以使用 isset 函数;
当要 判断一个变量是否已经赋予数据且不为空 可以用 empty函数; - 当要 判断 一个变量 存在且不为空 先 isset 函数 再用 empty 函数;
表单中 get与post提交方法的区别?
- get是发送请求HTTP协议通过url参数传递进行接收,
- 而post是实体数据,可以通过表单提交大量信息。
请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确
<?php
/* http://www.manongjc.com/article/1524.html */
$email=$_POST['email'];
if(!preg_match(‘/^[\w.]+@([\w.]+).[a-z]{2,6}$/i’,$email)) {
echo "电子邮件检测失败";
}else{
echo "电子邮件检测成功";
}
?>
session与cookie的区别?
- 两者最大的区别就是session存储在服务器端,而cookie是在客户端。
- session安全性更高,而cookie安全性弱
- session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放.
- cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短.
session有什么用?怎么使用?
session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份
访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了
管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。
使用session的步骤:
- 启动session:使用session_start()函数来启动。
- 注册会话:直接给$_SESSION数组添加元素即可。
- 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。
- 删除会话:
1.可以使用unset删除单个session;
2.使用$_SESSION=array()的方式,一次注销所有的会话变量;
3.使用session_destroy()函数来彻底销毁session。
cookie有什么用?怎么使用?
- 记录用户访问的部分信息
- 在页面间传递变量
- 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。
创建cookie:setcookie(string cookiename , string value , int expire);
读取cookie:通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。
删除cookie:有两种方法
1.手工删除方法:右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除
2.setcookie()方法:跟设置cookie的方法一样,不过此时讲cookie的值设置为空,有效时间为0或小于当前时间戳。
题9:数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
简述下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
<?php
$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
答案: 1
int和string类型强制转换造成的,0==="a"
0 == 0 肯定是true啊
PHP是弱类型
$tmp = 0 === "a"? 1: 2;
echo $tmp; 这样就是2
什么是MVC?
答案:MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。
- Model:数据信息存取层。数据结构层
- View:view层负责将应用的数据以特定的方式展现在界面上。
- Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MYSQL取得当前时间的函数是?,格式化日期的函数是
答案:now(),dateformat()
在页面中引用CSS有几种方式?
在页面中使用CSS有3中方式:
- 引用外部CSS文件
- 内部定义Style样式
- 内联样式
假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。
答案:
/** http://www.manongjc.com/article/1524.html */
function go2b(){
window.location = “b.html”;
window.close();
}
setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()
用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分)
$a = date(“Y-m-d H:i:s”, strtotime(“-1 day”));
print_r($a);
如何实现字符串翻转?(3分)
英文:
strrev($a)
中文或其他文字:
中文:GB2312, 代码是使用GB2312编码
<?php
function reverse($str)
{
$ret = “”;
len=mbstrwidth(str,”GB2312″);
for(i=0;i< len;i++)
{
arr[]=mbsubstr(str, $i, 1, “GB2312″);
}
return implode(“”, array_reverse($arr));
}
print_r(reverse(“你好”));
对于大流量的网站,您采用什么样的方法来解决访问量问题?(4分)
- 有效使用缓存,增加缓存命中率
- 使用负载均衡
- 对静态文件使用CDN进行存储和加速
- 想法减少数据库的使用
- 查看出现统计的瓶颈在哪里
- 数据库读写分离,优化数据表
- 使用不同主机分流主要流量
如何修改SESSION的生存时间. (1分)
session_set_cookie_params
一般有三年以上php开发经验去百度、腾讯面试,常会接触的面试题小总结一下:
- 简单做一下自我介绍,? 然后谈一下近三年来你的得意之作?
- 面试官看过你的简历,会问一些你做的项目的用户量、pv、吞吐量、相关难点和解决方法等
- 数据库设计经验,为什么进行分表? 分库?
一般多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?可以举例说明 - web开发方面会遇到哪些缓存? 分别如何优化?
- 给你256M的内存,对10G的文件进行排序(文件每行1个数字),如何实现?
对10G的文件进行查找如何实现?
统计10G文件每个关键字出现的次数如何实现? - 假如你现在是12306火车订票的设计师,你该如何设计满足全国人民订票?
- 假如有1亿用户的访问量,你的服务器架构是怎样的? 用户信息的存储方案如何设计?
- 如果你是技术组长,所带团队任务进度无法完成你该如何解决?
如果在进度排满的前提下插入任务,你该如何保证总进度不延期?
如果有的工程师今天预定任务没有完成,你该如何解决? - 从你的经验方面谈一下如何构建高性能web站点? 需要哪些环节? 步骤? 每个步骤需要注意什么如何优化等?
- 为什么要对数据库进行主从分离?
- 如何处理多服务器共享session?
- 一个10G的表,你用php程序统计某个字段出现的次数,思路是?
- 会告诉你一个nginx日志例子,用你认为最佳的编程语言统计一下http响应时间超过1秒的前10个url?
- 给你一个mysql配置文件,用你认为最佳的编程语言解析该文件?
- 给你两个路径a和b,写一个算法或思路计算a和b差距几层并显示a和b的交集?
- 给你一个url,在nginx配置一下rewrite指定到某个具体路径?
- 一个php文件的解释过程是? 一般加速php有哪些? 提高php整体性能会用到哪些技术?
- session和cookie生存周期区别? 存储位置区别?
- chrome号称为多线程的,所以多线程和多进程的区别为?
- php在2011年底出现hash碰撞,hash碰撞原理为? 如何进行修复?
- web不安全因素有哪些? 分别如何防范?
- 假如两个单链表相交,写一个最优算法计算交点位置,说思路也可以?
- 假如你是技术组长? 如何提高团队效率?
- nginx负载均衡有哪些? 如果其中一台服务器挂掉,报警机制如何实现?
- 不优化前提下,apache一般最大连接数为? nginx一般最大连接数为? mysql 每秒insert ? select ? update ? delete?
- mysql 数据类型有哪些 ? 分别占用多少存储空间 ?
- nginx设置缓存js、css、图片等信息,缓存的实现原理是?
- 如何提高缓存命中率? 如何对缓存进行颗粒化?
- php的内存回收机制是?
- 我的所有问题都问完了,你有什么问题问我没有?
1、双引号和单引号的区别
双引号解释变量,单引号不解释变量
双引号里插入单引号,其中单引号里如果有变量的话,变量解释
- 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
- 双引号解释转义字符,单引号不解释转义字符,但是解释'\和\
能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)
HTTP中POST、GET、PUT、DELETE方式的区别
- HTTP定义了与服务器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,与其比不可少的URL的全称是资源描述符
- 我们可以这样理解:url描述了一个网络上资源,而post、get、put、delegate就是对这个资源进行增、删、改、查的操作!
php程序中如何设置当前页面的编码为utf-8?
header(“content-type:text/html;charset=utf-8”);
php中,如何跳转到blog/view.php页面,请用函数实现?
header(“location:blog/view.php”);
===是什么运算?
- 是php比较运算符中的一种,表示恒等,说明两个变量不只是数值上相等,而且两者的数据类型也相等。
- 如果$a !== $b,那么说明两个变量要么数值不等,要么就是数据类型不相同。
说出数组涉及到的常用函数。
- array -- 声明一个数组
- count -- 计算数组中的单元数目或对象中的属性个数
- array_push()将一个或多个元素插入数组的末尾(入栈)
- array_column()返回输入数组中某个单一列的值;
- array_combine()通过合并两个数组来创建一个新数组;
- array_reverse()以相反的顺序返回数组
- array_unique()删除数组中的重复值;
- in_array()检查数组中是否存在指定的值
- foreach -- 遍历数组
- list -- 遍历数组
- explode -- 将字符串转成数组
- implode -- 将数组转成一个新字符串
- array_merge -- 合并一个或多个数组
- is_array -- 检查是否是数组
- print_r -- 输出数组
- sort -- 数组排序
- array_keys -- 返回数组中所有的键名
- array_values -- 返回数组中所有的值
- key -- 从关联数组中取得键名
GD库是做什么用的? (1分)
动态的开放的图片处理库
下面哪个函数可以打开一个文件,以对文件进行读和写操作?(1分) c
(a) fget() (b) file_open() (c) fopen() (d) open_file()
MySQL存储引擎中,innodb和myisam的区别
MyISAM 和 InnoDB 讲解
- InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。
- 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
- MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,
- 而InnoDB提供事务支持已经外部键等高级数据库功能。
函数内部 static 和 global 关键字的作用
- static 是静态变量,在局部函数中存在且只初始化一次,使用过后再次使用会使用上次执行的结果; 作为计数,程序内部缓存,单例模式中都有用到。
- global 关键字,引用全局变量,wordpress中大量用到,如面向过程开发。
- static 静态方法,是类的成员方法,但不需要实例化类可直接使用
- $GLOBAL 在函数内使用具有全局作用域的变量,如$GLOBAL['a']
子类重写父类的 protected 方法有什么限制?或者说有什么要遵守的规则?
用例子说明,以 Laravel 框架中的控制器作为说明
- final修饰的类方法不可被子类重写
- PHP是否重写父类方法只会根据方法名是否一致判断(5.3以后重写父类方法参数个数必须一致)
- 重写时访问级别只可以等于或者宽松于父类 不可提升访问级别
什么是 CSRF 攻击 ?XSS 攻击?如何防范?
-
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。
讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。 - CSRF防范:
- 合理规范api请求方式,GET,POST
- 对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。
XSS,跨站脚本攻击。
防范:不相信任何输入,过滤输入。
了解XSS攻击吗?如何防止?
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
PHP处理字符串的常用函数?(重点看函数的‘参数’和‘返回值’)
- trim()移除字符串两侧的空白字符和其他字符;
- substr_replace()把字符串的一部分替换为另一个字符串;
- substr_count()计算子串在字符串中出现的次数;
- substr()返回字符串的一部分;
- strtolower()把字符串转换为小写字母;
- strtoupper()把字符串转换为大写字母;
- strtr()转换字符串中特定的字符;
- strrchr()查找字符串在另一个字符串中最后一次出现;
- strstr()查找字符串在另一字符串中的第一次出现(对大小写敏感);
- strrev()反转字符串;
- strlen()返回字符串的长度;
- str_replace()替换字符串中的一些字符(对大小写敏感);
- print()输出一个或多个字符串;
- explode()把字符串打散为数组;
- is_string()检测变量是否是字符串;
- strip_tags()从一个字符串中去除HTML标签;
- mb_substr()用来截中文与英文的函数
PHP处理时间的常用函数?(重点看函数的‘参数’和‘返回值’)
- date_default_timezone_get()返回默认时区
- date_default_timezone_set()设置默认时区。
- date()格式化本地时间/日期。
- getdate()返回日期/时间信息。
- gettimeofday()返回当前时间信息。
- microtime()返回当前时间的微秒数。
- mktime()返回一个日期的 Unix时间戳。
- strtotime()将任何英文文本的日期或时间描述解析为 Unix时间戳。
- time()返回当前时间的 Unix时间戳。
什么是事务?及其特性?
- MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务特性:
(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务。事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
或者这样理解:
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
什么是锁?
答:数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
基本锁类型:锁包括行级锁和表级锁
索引的作用?和它的优点缺点是什么?
- 索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
- 索引可以是唯一的,创建索引允许指定单个列或者是多个列。
- 缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
什么是基本表?什么是视图?
- 基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。
- 视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表
主键、外键和索引的区别?
主键、外键和索引的区别
定义:
主键--唯一标识一条记录,不能有重复的,不允许为空
外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引--该字段没有重复值,但可以有一个空值
作用:
主键--用来保证数据完整性
外键--用来和其他表建立联系用的
索引--是提高查询排序的速度
个数:
主键--主键只能有一个
外键--一个表可以有多个外键
索引--一个表可以有多个唯一索引
数组[‘a’, ‘b’, ‘c’] 转换成字符串 ‘abc’
echo implode(‘’,[‘a’, ‘b’, ‘c’]);
echo join([‘a’, ‘b’, ‘c’],'');
获取字符串’aAbB’中A首次出现的位置
- $str=‘aAbB’;
- echo strpos($str,"A");
数组内置的排序方法有哪些?
- sort($array); //数组升序排序
- rsort($array); //数组降序排序
- asort($array); //根据值,以升序对关联数组进行排序
- ksort($array); //根据建,以升序对关联数组进行排序
- arsort($array); //根据值,以降序对关联数组进行排序
- krsort($array); // 根据键,以降序对关联数组进行排序
用PHP打印出前一天的时间格式是2017-3-22 22:21:21
$a = date("Y-m-d H:i:s", strtotime("-1 days"));
求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
// 方法一:
用DateTime类
$day1 = '2003-09-16';
$day2 = '2011-11-23';
$d1 = new dateTime($day1);
$d2 = new dateTime($day2);
echo $d1->diff($d2)->days;
// 方法二,用时间戳计算
echo (strtotime($day2) - strtotime($day1))/(24*3600);
array实操
- $array = array(1, 1, 1, 54, 3,4, 3,4, 3, 14, 3,4, 3,7,8,9,12,45,66,5,7,8,9,2,45);
- $array2 = array_count_values($array); // 统计数组中所有值出现的次数,
- arsort($array2); // 按照键值对关联数组进行降序排序,
- $first = reset($array2);
- $first_key = key($array2);
- echo("数组中数字{$first_key}重复次数最多,为:{$first}次");
- exit;
Apache与Nginx的优缺点比较
1、nginx相对于apache的优点:
- 轻量级,比apache 占用更少的内存及资源。高度模块化的设计,编写模块相对简单
- 抗并发,nginx 处理请求是异步非阻塞,多个连接(万级别)可以对应一个进程,
- 而apache 则是阻塞型的,是同步多进程模型,一个连接对应一个进程,在高并发下nginx 能保持低资源低消耗高性能
- nginx处理静态文件好,Nginx 静态处理性能比 Apache 高 3倍以上
2、apache 相对于nginx 的优点:
apache 的rewrite 比nginx 的rewrite 强大 ,模块非常多,基本想到的都可以找到 ,比较稳定,少bug ,nginx 的bug 相对较多
3:原因:这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的 Squid、Memcached都采用的是epoll网络I/O模型。 处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。
MySQL 增删改查数据
- 增:
$sql = "INSERT INTO w3cschool_tbl ". "(w3cschool_title,w3cschool_author, submission_date) ". "VALUES ". "('$w3cschool_title','$w3cschool_author','$submission_date')";
- 删:
$sql = 'DELETE FROM w3cschool_tbl WHERE w3cschool_id=3';
- 改:
$sql = 'UPDATE w3cschool_tbl SET w3cschool_title="Learning JAVA" WHERE w3cschool_id=3';
- 查:
$sql = 'SELECT w3cschool_id, w3cschool_title, w3cschool_author, submission_date FROM w3cschool_tbl';
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
$sql = 'SELECT a.w3cschool_id, a.w3cschool_author, b.w3cschool_count FROM w3cschool_tbl a INNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author';
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
- 排序:
$sql = 'SELECT w3cschool_id, w3cschool_title, w3cschool_author, submission_date FROM w3cschool_tbl ORDER BY w3cschool_author DESC';
- 分组:
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
- 分页:limit是mysql的语法:
select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录
n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录