php面试题

作者: 幼稚园靓仔 | 来源:发表于2017-12-05 23:18 被阅读0次

    防止SQL注入

    简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。

    防止SQL注入漏洞可以用哪些函数?

    • addslashes()
    • mysql_escape_string()

    SQL注入产生的原因:

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

    防止SQL注入的方式:

    • 开启配置文件中的magic_quotes_gpcmagic_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优化方法?

    1. 索引。
    2. 缓存。
    3. 避免join
    4. 静态页面
    5. 选取最适用的字段属性:字段长度和非空
    6. 优化查询语句
    • 设计良好的数据库结构,允许部分数据冗余,尽量避免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的步骤:

    1. 启动session:使用session_start()函数来启动。
    2. 注册会话:直接给$_SESSION数组添加元素即可。
    3. 使用会话:判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。
    4. 删除会话:

    1.可以使用unset删除单个session;

    2.使用$_SESSION=array()的方式,一次注销所有的会话变量;

    3.使用session_destroy()函数来彻底销毁session。

    cookie有什么用?怎么使用?

    1. 记录用户访问的部分信息
    1. 在页面间传递变量
    2. 将所查看的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分)

    1. 有效使用缓存,增加缓存命中率
    2. 使用负载均衡
    3. 对静态文件使用CDN进行存储和加速
    4. 想法减少数据库的使用
    5. 查看出现统计的瓶颈在哪里
    6. 数据库读写分离,优化数据表
    7. 使用不同主机分流主要流量

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

    session_set_cookie_params

    一般有三年以上php开发经验去百度、腾讯面试,常会接触的面试题小总结一下:

    1. 简单做一下自我介绍,? 然后谈一下近三年来你的得意之作?
    2. 面试官看过你的简历,会问一些你做的项目的用户量、pv、吞吐量、相关难点和解决方法等
    3. 数据库设计经验,为什么进行分表? 分库?
      一般多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?可以举例说明
    4. web开发方面会遇到哪些缓存? 分别如何优化?
    5. 给你256M的内存,对10G的文件进行排序(文件每行1个数字),如何实现?
      对10G的文件进行查找如何实现?
      统计10G文件每个关键字出现的次数如何实现?
    6. 假如你现在是12306火车订票的设计师,你该如何设计满足全国人民订票?
    7. 假如有1亿用户的访问量,你的服务器架构是怎样的? 用户信息的存储方案如何设计?
    8. 如果你是技术组长,所带团队任务进度无法完成你该如何解决?
      如果在进度排满的前提下插入任务,你该如何保证总进度不延期?
      如果有的工程师今天预定任务没有完成,你该如何解决?
    9. 从你的经验方面谈一下如何构建高性能web站点? 需要哪些环节? 步骤? 每个步骤需要注意什么如何优化等?
    10. 为什么要对数据库进行主从分离?
    11. 如何处理多服务器共享session?
    12. 一个10G的表,你用php程序统计某个字段出现的次数,思路是?
    13. 会告诉你一个nginx日志例子,用你认为最佳的编程语言统计一下http响应时间超过1秒的前10个url?
    14. 给你一个mysql配置文件,用你认为最佳的编程语言解析该文件?
    15. 给你两个路径a和b,写一个算法或思路计算a和b差距几层并显示a和b的交集?
    16. 给你一个url,在nginx配置一下rewrite指定到某个具体路径?
    17. 一个php文件的解释过程是? 一般加速php有哪些? 提高php整体性能会用到哪些技术?
    18. session和cookie生存周期区别? 存储位置区别?
    19. chrome号称为多线程的,所以多线程和多进程的区别为?
    20. php在2011年底出现hash碰撞,hash碰撞原理为? 如何进行修复?
    21. web不安全因素有哪些? 分别如何防范?
    22. 假如两个单链表相交,写一个最优算法计算交点位置,说思路也可以?
    23. 假如你是技术组长? 如何提高团队效率?
    24. nginx负载均衡有哪些? 如果其中一台服务器挂掉,报警机制如何实现?
    25. 不优化前提下,apache一般最大连接数为? nginx一般最大连接数为? mysql 每秒insert ? select ? update ? delete?
    26. mysql 数据类型有哪些 ? 分别占用多少存储空间 ?
    27. nginx设置缓存js、css、图片等信息,缓存的实现原理是?
    28. 如何提高缓存命中率? 如何对缓存进行颗粒化?
    29. php的内存回收机制是?
    30. 我的所有问题都问完了,你有什么问题问我没有?

    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防范:
    1. 合理规范api请求方式,GET,POST
    1. 对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条记录

    相关文章

      网友评论

        本文标题:php面试题

        本文链接:https://www.haomeiwen.com/subject/nwvhixtx.html