이 기사는 2018년 PHP 면접 질문에 대한 최신 요약(답변 포함)을 제공합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
관련 추천: "2019 PHP 면접 문제 요약(모음)"
1. PHP 수시 기초
1. PHP, ASP, JSP의 차이점은 무엇인가요?
Active Server Pages의 전체 이름인 ASP는 Windows 플랫폼을 기반으로 하는 웹 서버측 개발 환경으로, 동적이며 대화형인 고성능 웹 서비스 응용 프로그램을 생성하고 실행하는 데만 사용할 수 있습니다. Microsoft 플랫폼에서 사용되며 이식성이 좋지 않습니다. ASP는 자체 개발 언어로 스크립팅 언어인 VB Script와 JScript(JavaScript)를 사용합니다. 국내 초창기 웹사이트 대부분이 이를 이용해 개발됐다. 그러나 Microsoft의 전반적인 변화로 인해 ASP.NET은 ASP 웹 개발 모델을 포기하여 현재는 제거되었습니다.
PHP는 크로스 플랫폼 서버 측 임베디드 스크립팅 언어입니다. C, Java 및 Perl 언어에서 많은 구문을 차용하고 PHP 자체 기능을 결합하여 웹 개발자가 동적으로 생성된 페이지를 빠르게 작성할 수 있도록 합니다. HTML에 포함될 수 있어 웹 개발에 매우 적합하며 대부분의 최신 데이터베이스를 지원합니다. 또한, PHP는 완전 무료입니다. 개발자는 PHP 공식 사이트(http://www.php.net)에서 비용을 들이지 않고도 무료로 다운로드할 수 있습니다. 또한 개발자는 제한 없이 소스 코드를 얻을 수 있고, 필요한 기능을 추가할 수도 있어 개발 효율성이 높고 비용이 저렴합니다.
JSP는 Sun에서 출시한 네트워크 프로그래밍 언어로, 크로스 플랫폼에서 실행되며 높은 보안성과 높은 운영 효율성을 제공합니다. 개발 언어는 주로 Java를 기반으로 합니다.
ASP, JSP, PHP는 모두 HTML 코드에 일종의 프로그램 코드를 혼합하여 이를 해석하고 언어 엔진에 의해 실행하는 기능을 제공합니다. 그러나 JSP 코드는 서블릿으로 컴파일되어 Java 가상 머신에 의해 해석되고 실행됩니다. 이 컴파일 작업은 JSP 페이지에만 사용됩니다. ASP, PHP 및 JSP 환경에서 HTML 코드는 주로 정보의 표시 스타일을 설명하는 역할을 담당하고 프로그램 코드는 처리 논리를 설명하는 데 사용됩니다. 일반 HTML 페이지는 웹 서버에만 의존하는 반면 ASP, PHP 및 JSP 페이지는 프로그램 코드를 분석하고 실행하기 위해 추가 언어 엔진이 필요합니다. 프로그램 코드의 실행 결과는 HTML 코드에 다시 삽입되어 브라우저로 함께 전송됩니다. ASP, PHP, JSP는 모두 웹 서버 지향 기술이며 클라이언트 브라우저에는 추가적인 소프트웨어 지원이 필요하지 않습니다.
2. PHP에서 작은따옴표와 큰따옴표로 묶인 문자열의 차이는 ( )입니다.
A. 작은따옴표는 rt와 같은 이스케이프 문자를 구문 분석하는 반면, 큰따옴표는
B를 구문 분석하지 않습니다. 큰따옴표는 빠르고 작은따옴표는 느립니다
C. 작은따옴표는 빠르고 큰따옴표는 느립니다. 큰따옴표는 $로 시작하는 변수를 구문 분석하는 반면, 작은따옴표는 구문 분석하지 않습니다.
참고 답변: D.
분석: 큰따옴표는 $ 기호로 시작하는 변수와 이스케이프 문자를 구문 분석할 수 있지만, 작은따옴표는 문자를 구문 분석하거나 이스케이프하지 않습니다. 따라서 선택지 A는 틀렸고 선택지 D는 맞다.
옵션 B와 C의 경우 질문에 따옴표에 문자열이 포함되어 있음이 명시되어 있으므로 변수를 구문 분석할 필요가 없습니다. 이 경우 큰따옴표와 작은따옴표의 효율성은 동일합니다. 옵션 B와 C가 모두 올바르지 않습니다.
3. 객체지향과 프로세스지향의 차이점은 무엇인가요?
객체 지향은 오늘날 소프트웨어 개발의 주류 방법 중 하나입니다. 데이터와 데이터에 대한 작업을 상호 의존적인 전체, 즉 객체로 통합합니다. 유사한 객체, 즉 클래스의 공통 기능을 추상화합니다. 클래스에 있는 대부분의 데이터는 이 클래스의 메서드로만 처리할 수 있습니다. 클래스는 간단한 외부 인터페이스를 통해 외부 세계와 연결되고, 객체는 메시지를 통해 소통합니다. 프로그램 흐름은 사용 중에 사용자에 의해 결정됩니다. 예를 들어 추상적인 관점에서 인간은 키, 몸무게, 나이, 혈액형 등과 같은 특별한 이름을 가지고 있습니다. 인간은 일하고, 똑바로 걷고, 먹고, 자신의 마음을 사용하여 도구를 만들 수 있습니다. 존재하지 않는 실체이지만 인간 집단의 속성과 방식을 지닌 모든 객체를 사람이라 한다. 이 객체 사람은 실제로 존재하는 실체이고, 모든 사람은 인간 집단의 객체이다.
프로세스 중심은 하향식 순차적 실행과 점진적인 개선을 의미하는 이벤트 중심 개발 방식입니다. 프로그램 구조는 기능에 따라 여러 기본 모듈로 나누어져 있으며, 각 모듈 간의 관계는 다음과 같습니다. 각 모듈은 일반적으로 순서, 선택 및 루프의 세 가지 기본 구조로 구성됩니다. 모듈 구현의 구체적인 방법은 서브루틴을 사용하는 것이며 프로그램 흐름은 절차 중에 작성되었습니다. 예를 들어, 주사위 놀이에서 프로세스 중심의 디자인 아이디어는 먼저 문제의 단계를 분석하는 것입니다. 첫 번째 단계에서는 게임을 시작하고, 세 번째 단계에서는 검은 돌이 먼저 움직이며, 네 번째 단계에서는 그림을 그립니다. 단계, 승자 여부를 판단합니다. 다섯 번째 단계는 흰색입니다. 단계 6, 그림 그리기 단계 8, 단계 9로 돌아가서 최종 결과를 출력합니다. 위의 각 단계를 별도의 기능으로 구현하는 것이 프로세스 중심의 개발 방법입니다.
구체적으로 두 가지는 주로 다음과 같은 측면에서 다릅니다.
1) 출발점이 다릅니다. 객체지향은 객관적인 세계의 문제를 다루기 위해 전통적인 사고방식을 사용하는 것이며, 문제 영역의 핵심 사항을 객체에 직접 매핑하고 객체 간의 인터페이스를 강조하는 것을 강조합니다. 프로세스 지향 방법은 프로세스의 추상화와 모듈화를 강조합니다. 프로세스를 중심으로 객관적인 세계 문제를 구성하거나 처리합니다.
2) 계층적 논리적 관계가 다릅니다. 객체지향 방법은 컴퓨터 논리를 사용하여 객관적 세계에서의 물리적 존재를 시뮬레이션하고, 객체의 컬렉션 클래스를 문제 처리의 기본 단위로 사용하며, 컴퓨터 세계를 가능한 한 객관적 세계에 가깝게 만들어 처리가 이루어지도록 합니다. 문제의 해결 방법은 더 명확하고 직접적이며 다음을 지향합니다. 객체 메서드는 클래스 간의 상속과 개발을 반영하기 위해 클래스의 계층 구조를 사용합니다. 문제를 다루는 프로세스 중심 방법의 기본 단위는 프로세스를 명확하고 정확하게 표현할 수 있는 모듈입니다. 모듈의 계층 구조는 모듈이나 모듈 간의 관계와 기능, 그리고 객관적인 세계의 문제를 요약하는 데 사용됩니다. 컴퓨터가 처리할 수 있는 프로세스로 추상화됩니다.
3) 데이터 처리 방식은 제어 프로그램 방식과 다릅니다. 객체 지향 방법은 데이터와 해당 코드를 전체적으로 캡슐화합니다. 원칙적으로 다른 객체는 해당 데이터를 직접 수정할 수 없습니다. 즉, 객체 수정은 자체 멤버 함수를 통해서만 완료될 수 있습니다. "이벤트 중심"을 통해 활성화되고 프로그램을 실행합니다. 프로세스 중심 방식은 프로그램을 통해 직접 데이터를 처리하며, 처리가 완료된 후 처리 결과를 표시할 수 있으며, 제어 프로그램 방식에서는 설계에 따라 프로그램을 호출하거나 반환하며 자유롭게 탐색할 수 없습니다. 호출되면서 각 모듈 간의 제어, 제어 및 호출이 수행됩니다.
4) 분석 설계와 코딩 변환 방법이 다릅니다. 객체지향 방식은 분석, 설계, 코딩까지 소프트웨어 라이프사이클 전반에 걸쳐 원활한 프로세스를 수행하며, 일관된 모델이 사용됩니다. 즉, 원활한 연결이 이루어집니다. 프로세스 중심 접근 방식은 규칙에 따른 분석, 설계 및 코딩 간의 변환을 강조하고 소프트웨어 수명주기 전반에 걸쳐 분석, 설계 및 코딩 간의 원활한 연결을 달성합니다.
4. PHP에서 클래스를 커스터마이징하는 방법은 ( )입니다.
아.
B.
C.
D.
참고 답변: B.
분석: 클래스를 정의하려면 클래스 키워드와 클래스 이름을 사용하여 정의합니다. 클래스 클래스 이름 {}. 클래스를 인스턴스화하는 형식은 $object=new classname();입니다.
【실제 문제 11】인스턴스화된 객체가 속한 클래스의 이름을 구하는 함수는 ( )입니다.
아. get_class() B. get_object_vars()
C. get_class_methods() D. get_classname()
참고 답변: A.
분석: 옵션 A의 경우 get_class() 함수를 사용하여 객체의 클래스 이름을 반환합니다. 따라서 선택지 A가 맞습니다.
옵션 B의 경우, get_object_vars() 함수는 주어진 객체의 속성을 가져오는 데 사용됩니다. 따라서 선택 B는 틀렸습니다.
옵션 C의 경우 get_class_methods() 함수를 사용하여 클래스 메서드의 이름을 가져옵니다. 따라서 선택지 C는 올바르지 않습니다.
옵션 D의 경우 PHP에는 그러한 방법이 없습니다. 따라서 옵션 D가 올바르지 않습니다.
5. PHP 객체 지향에 대한 다음 설명 중 틀린 것은 무엇입니까? ( )
A. 인터페이스를 구현하려면 Implements 연산자를 사용하세요. 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 그렇지 않으면 치명적인 오류가 보고됩니다
B. 클래스 이름은 PHP 예약어가 아닌 합법적인 태그라면 모두 가능하며, 한자도 PHP 클래스 이름으로 사용할 수 있습니다
C. 생성자가 PHP 하위 클래스에 정의된 경우 하위 클래스의 객체가 생성되면 해당 상위 클래스의 생성자가 암시적으로
D로 호출됩니다. 객체를 직렬화하면 객체의 모든 변수가 저장되지만 객체의 메서드는 저장되지 않고 클래스 이름만 저장됩니다. C.
분석: 하위 클래스에 의해 정의된 생성자는 상위 클래스의 생성자를 재정의합니다. 상위 클래스의 생성자뿐만 아니라 하위 클래스의 생성자도 실행하려면 parent::__construct();를 명시적으로 사용해야 합니다. 그것을 호출합니다. 따라서 선택지 C는 올바르지 않습니다.
6. 다음 PHP 추상 클래스 설명에서 잘못된 것은 ( )입니다. 아. PHP의 추상 클래스는 추상 키워드
B를 사용하여 정의됩니다. 메소드 본문이 없는 메소드를 추상 메소드라고 하며, 추상 메소드를 포함하는 클래스는 추상 클래스
C여야 합니다. 추상 클래스에는 추상 메서드가 있어야 합니다. 그렇지 않으면 추상 클래스라고 부르지 않습니다
D. 추상 클래스는 인스턴스화할 수 없습니다. 즉, 객체에 새로 추가될 수 없습니다.
참조 답변: C.
분석: 추상 클래스는 빈 클래스일 수 있습니다. 즉, 추상 메서드가 반드시 필요하지는 않습니다. 그러나 추상 메소드는 추상 클래스에만 존재할 수 있습니다. 따라서 선택지 C는 올바르지 않습니다.
7. 다형성이란 무엇인가요? 다형성은 객체 지향 프로그래밍에서 코드 재사용을 위한 중요한 메커니즘입니다. 즉, 동일한 작업이 다른 객체에 적용될 때 의미 체계가 달라져 결과가 달라집니다. 예를 들어, 동일한 "+" 연산에서 3+4는 정수를 추가하는 데 사용되는 반면 "3" + "4"는 문자열 연결을 실현합니다. 일반적으로 다형성을 구현하는 방법에는 덮어쓰기와 오버로딩이라는 두 가지 방법이 있습니다.
8. 포함과 요구의 차이점은 무엇인가요? require 및 include에는 유사한 기능이 있습니다. require 또는 include 문을 사용하여 지정된 파일의 모든 코드/텍스트/마크를 파일에 복사합니다. 일반적으로 데이터, 파일 또는 코드를 공유해야 하는 시나리오에서 사용됩니다. 공유해야 하는 코드나 데이터를 별도의 PHP 파일에 넣어서 require를 통해 참조하거나 사용해야 하는 파일에 include합니다. require() 및 include()는 실제 함수가 아니므로 require() 및 include() 문은 괄호 없이 직접 매개 변수를 추가할 수도 있습니다.
9. 다음 코드의 출력은 ( )입니다.
<?php define("x","5"); $x=x+10; echo x; ?>A. 오류 B. 5C. 10 디. 15
참고 답변:B.
분석: PHP에서는 정의 함수를 사용하여 상수를 정의하며, 상수 값은 설정된 후에 변경할 수 없습니다. 이 문제에서 x의 값은 항상 5입니다. 따라서 선택 B가 맞습니다.
10. 변수를 참조하는 방법은 무엇입니까? 변수 앞에 & 기호를 추가하여 변수를 참조할 수 있습니다. 이는 변수에 개별 이름을 부여하는 것과 동일하므로 하나의 변수 값을 변경하는 것입니다. 다른 변수에도 영향을 미칩니다.
[실제 문제 54]에는 다음 코드가 있습니다.
<?php $a="hello"; $b= &$a; unset($b); $b="world"; echo $a; ?>프로그램의 실행 결과는 ( )
A입니다. 안녕 B. 세계 C. 널디. unset
참고 답변: A.
분석: 이 코드의 실행 과정은 아래 그림과 같습니다.
1)首先执行$b= &$a后,a和b引用同一个字符串变量“hello”。
2)接着执行unset($b),这个函数可以断开这个引用关系。此时由于a仍然指向字符串“hello”,也就是说,这个字符串仍然被a使用,因此这个字符串不会被回收。
3)接着执行$b="world",此时,b指向一个新的字符串“world”,这并不会影响a的值。因此输出结果为hello。
2、PHP常考进阶
11、请写一个函数验证电子邮件的格式是否正确。
参考答案:
function checkEmail($email) { $pregEmail= "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i"; return preg_match($pregEmail,$email); }
分析:首尾两个斜杠/是正则表达式的限定符,这是Perl正则的标准,而PHP与Perl有相同的正则的规范。两个斜杠之间表示的是正则内容,后面的i表示忽略大小写。
这个正则表达式表示的含义如下:
1)必须以([0-9A-Za-z\-_\.]+)开头,也就是说,邮件地址以多个字母、数组、“-”或“.”开头。
2)紧接着是字符“@”。
3)然后接着是多个字母或数字的字符串,接着是一个字符“.”,接着是两个或三个字母;然后接下来一部分可有可无的:一个“.”后面跟着两个字母。
4)邮件的结束符是满足3)的字符串。
12、以下可以匹配中国居民身份证号码的正则表达式是( )。
A.d{15} B.d{18}
C.d D.(^d{15}$)|(^\d{18}$)|(^d{17}(d|X|x)$)
参考答案:D。
分析:d表示0~9任意数字。
13、【真题96】 一个函数的参数不能是对变量的引用,除非在php.ini中把( )设为on。
参考答案:allow_call_time_pass_reference。
分析:在PHP函数调用的时候,基本数据类型默认会使用值传递,而不是引用传递。allow_call_time_pass_reference 选项的作用为是否启用在函数调用时强制参数被按照引用传递。如果把allow_call_time_pass_reference 配置为on,那么在函数调用的时候会默认使用引用传值。但是不推荐使用这种方法,原因是该方法在未来的版本中很可能不再支持。如果想使用引用传递,那么推荐在函数调用的时候显式地使用&进行引用传递。
14、文件读操作
读取文件前,通常会判断文件能否读取,例如,是否有读权限,可以使用is_readable函数;示例代码如下:
<?php $file = "test.txt"; if(is_readable($file) == false) { echo "can not read\n"; } else{ echo "can read \n"; } ?>
当然也需要判断文件是否存在,可以使用file_exists()函数。示例代码如下:
<?php $file = "test.txt"; if(file_exists($file) == false) { echo "file not exist\n"; } else{ } echo "file is exists \n"; ?>
读取文件的方法有很多种,此处列举最常用的按行读取方法,示例代码如下:
<?php $file = "test.txt"; $fp = fopen($file,"r"); while(!feof($fp)){ echo fgets($fp,1024); } fclose($fp); ?>
需要注意的是,读取文件的length参数是可选项,如果忽略,则将继续从流中读取数据直到行结束。指定最大行的长度在利用资源上更为有效。此外,还有fread、file_get_contents等读取文件的方法,此处不再赘述。
15、什么是异常处理与错误处理?
当运行的程序发生异常被抛出时,程序不会继续执行异常处后面的代码,PHP 会尝试查找匹配的“catch”代码块。如果异常没有被捕获,那么将会发生严重的错误,程序会终止或者不受控制地执行。示例代码如下:
<?php function GetNum($num) { if($num > 10) { throw new Exception("Exception ocur"); } return true; } GetNum(100); ?>
程序的运行结果为
Uncaught exception 'Exception' with message 'Exception ocur'
从这个例子可以看出,如果不对异常进行处理,那么当程序有异常抛出的时候就会结束执行。而对于对象方法的异常处理,还有另外一种处理方法,下面介绍在PHP中当调用一些不存在的对象方法时的异常处理,从而保证程序正常运行。这主要是通过__call方法来实现的。
方法声明为__call($funname,$arr_value),当被调用方法不存在的时候会默认调用这个方法。
示例代码如下:
class My { function __call($n,$v) { echo "错误的方法名:".$n; echo "错误的参数:".$v; } }
16、什么是内存管理?
内存管理主要是指程序运行时对计算机内存资源的分配、使用和释放等技术,内存管理的目标是高效、快速地分配内存同时及时地释放和回收内存资源。内存管理主要包括是否有足够的内存供程序使用,从内存池中获取可用内存,使用后及时销毁并重新分配给其他程序使用。
在PHP开发过程中,如果遇到大数组等操作,那么可能会造成内存溢出等问题。一些常见的处理方法如下:
1)通过ini_set('memory_limit','64M')方法重置php可以使用的内存大小,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置。注:在safe_mode(安全模式)下,ini_set会失效。
2)另一方面可以对数组进行分批处理,及时销毁无用的变量,尽量减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。同时对于数据库、文件操作完要及时关闭,对象使用完要及时调用析构函数等。
3)及时使用unset()函数释放变量,使用时需要注意以下两点:
① unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。
② 只有当指向该变量的所有变量都销毁后,才能成功释放内存。
17、与MySQL一样,Redis在使用过程中,也会碰到很多的问题,适当的技巧和优化将大大提高Redis的使用性能,提高服务的质量。现将常见的一些问题总结如下:
1.停止使用keys *操作
keys*操作执行速度将会变慢。因为keys命令的时间复杂度是O(n),其中n是要返回的keys的个数,由此可见这个命令的复杂度就取决于数据量的大小了。当数据量比较大时,在这个操作执行期间,其他任何命令在实例中都无法执行,严重影响了性能。
可以使用scan命令来代替,scan命令通过增量迭代的方式来扫描数据库。
2.定位Redis速度降低的原因
使用INFO commandstats命令来查看所有命令的统计情况,如命令执行了多少次,执行命令所耗费的毫秒数等信息。
18、Memcache的特征和特性
Memcache的特征如下:
1)协议简单。
2)基于libevent的事件处理。
3)内置内存存储方式。
4)Memcached不互相通信的分布式。
Memcache的特性如下:
(1)单个item 最大的数据为1MB。
(2)单进程最大的使用内存为2GB,需要更多内存时可开多个端口。
(3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。
(4)键长最大为250字节。
19、下面可以用于服务器共享session的方式有( )。
A.利用NFS共享Session数据 B.基于数据库的Session共享
C.基于Cookie的Session共享 D.使用类似BIG-IP的负载设备来实现资源共享
参考答案:A、B、C、D。
分析:共享Session的方式主要有以下几种:
1)基于NFS的Session共享。NFS(Network File System)最早由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其他服务器的本地session目录即可。
2)基于数据库的Session共享。
3)基于Cookie的Session共享。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。
4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的key + value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前能达到2000/s平均查询,并且服务器CPU消耗依然不到10%。
所以,本题的答案为A、B、C、D。
20. 다양한 안전 문제를 예방하는 방법은?
일반적인 보안 문제는 주로 다음과 같은 측면을 포함합니다:
1) SQL 주입 공격. 소위 SQL 주입 공격은 공격자가 웹 양식의 필드나 페이지 요청의 쿼리 문자열에 SQL 명령을 삽입하여 서버를 속여 악성 SQL 명령을 실행하도록 하는 것을 의미합니다. 일부 형식에서는 사용자가 입력한 내용이 동적 SQL 명령을 구성하는 데 직접 사용되거나 저장 프로시저의 입력 매개 변수로 사용됩니다. 이러한 형식은 특히 SQL 삽입 공격에 취약합니다. 예를 들어, http://www.shuaiqi100.com/New... 웹사이트의 경우 id는 쿼리 매개변수이고, JSP 프로그램에서 특정 정보는 id를 통해 얻어지고 표시됩니다. 뉴스를 읽는 데 사용됩니다: "select * from news where id = "+ id. 정상적으로 실행되면 id를 2번 매개변수로 바꾸면 됩니다. 그러나 불법 사용자가 id의 매개변수를 id로 변경하는 경우에는 문제가 없습니다. =2; 데이터베이스 뉴스 삭제 후 실행 해당 뉴스 정보를 읽는 것 외에도 SQL 문은 데이터베이스 뉴스 정보 삭제도 실행하지만 후자의 문은 불법입니다.
SQL 인젝션 공격은 적법한 SQL 문을 사용하기 때문에 방화벽으로 점검할 수 없으며, SQL 언어 표준을 기반으로 하는 모든 데이터베이스에 적용 가능하기 때문에 특히 유해합니다. 그럼에도 불구하고 현재 SQL 주입 공격을 방지하는 방법은 다양합니다. 특히 다음과 같은 방법이 있습니다. 구문 분석을 위해 데이터베이스 서버로 전송되는 준비된 문과 매개 변수를 사용합니다. 이 방법을 사용한 후에는 공격자가 악성 SQL을 주입할 수 없습니다. 그렇다면 SQL 주입 공격을 방지하는 방법은 무엇입니까? 일반적으로 사용되는 몇 가지 방법은 다음과 같습니다.
① 준비된 문과 매개 변수는 각각 구문 분석을 위해 데이터베이스 서버로 전송됩니다.
② 제출된 콘텐츠를 탈출하려면 addlashes() 함수를 사용하세요.
3 PHP 구성 파일에서 Magic_quotes_gpc=on을 켜면 사용자가 쿼리한 SQL 문이 자동으로 변환되는데, 이는 SQL 삽입 방지에 중요한 역할을 합니다.
4 전역 변수 등록을 끄려면 PHP 구성 파일에서 Register_globals를 off로 설정하세요.
⑤ PHP 구성 파일에서 안전 모드 safe_mode=on;을 켜세요.
⑥ SQL 문을 작성할 때 작은따옴표와 작은따옴표를 생략하지 마세요.
⑦ 데이터베이스 테이블 및 필드의 명명 기술을 향상시킵니다. 프로그램의 특성에 따라 중요한 필드 이름을 지정하고 추측하기 어려운 이름을 지정합니다.
⑧ 오류 메시지를 제어하고, 오류 메시지 출력을 끄고, 로그 파일에 오류 메시지를 기록하고, 웹사이트에 오류 메시지를 노출하지 않습니다.
2) 데이터베이스 운영 보안 문제. 예를 들어, 사용자 권한이 제한되지 않으며 업데이트, 삭제, 삽입 등의 잘못된 조작으로 인해 시스템 보안 문제가 발생합니다.
해결책은 권한이 있는 사용자만 특정 작업을 수행할 수 있도록 다양한 사용자에게 서로 다른 권한을 부여하는 것입니다.
3) 사용자 http 요청에는 인증 방법이 없습니다. 악의적인 사용자는 웹사이트에 대한 http 요청을 시뮬레이션하여 악의적인 공격을 일으킬 수 있습니다. 이러한 공격을 방지하려면 사용자의 http 요청에 대한 액세스 소스를 신뢰할 수 있는지 확인하고 http 헤더에서 리퍼러를 필터링하여 해당 웹사이트에 대한 액세스만 허용해야 합니다. 이 도메인의 사이트.
4) 양식 소스의 고유성에 대한 검증이 없으며, 합법적인 양식 제출인지, 해커가 위조한 양식 제출인지 식별할 수 없습니다.
해커가 양식 제출을 위조하는 것을 방지하기 위해 일회성 토큰 토큰을 사용할 수 있습니다. 서버는 특정 전략을 사용하여 임의의 문자열을 생성하여 Session에 토큰으로 저장한 다음 요청한 페이지가 전송되면 해당 토큰을 다른 정보와 함께 숨겨진 도메인 형태로 전송하며 토큰은 다음과 같습니다. 수신된 정보의 토큰은 세션의 토큰과 비교되며, 일치하는 경우에만 요청이 처리됩니다. 이렇게 하면 양식의 소스가 거부됩니다. 고유하며 해커가 양식 제출을 위조하는 것을 방지합니다.
21、PHP的开发框架有哪些?
CodeIgniter是一个轻量级的PHP开发框架,具有快速开发、灵活性高等优点,它特别适合互联网公司的快速迭代场景,因此很受欢迎,据说腾讯、去哪儿网等应用场景都使用了这个框架。CodeIgniter具有动态实例化、松耦合、组件单一性等很多优点。动态实例化是指组件的导入和函数在执行时才会生效。松耦合是指系统模块之间的关联依赖很少,确保系统具有很好的重用性和灵活性。框架内的类和功能都是高度自治的,具有非常好的组件单一性。
在CodeIgniter中,模型代表数据结构,包含取出、插入、更新数据库的这些功能。视图通常是一个网页,但是在CodeIgniter中,一个视图也可以是一个页面片段,如头部、顶部HTML代码片段。它还可以是一个RSS页面,或其他任一页面。控制器相当于一个指挥者,或者说是一个“中介”,它负责联系视图和模型,以及其他任何处理HTTP请求和产生网页的资源。
Zend Framework是完全基于PHP语言的针对Web应用开发的框架,与众多的其他PHP开发框架相比,Zend Framework是一个PHP“官方”的框架,它由Zend公司负责开发和维护。Zend Framework同样基于MVC模式,Zend Framework采用了ORM(Object Relational Mapping,对象关系映射)思路,这是一种为了解决面向对象编程与关系数据库存在的互不匹配现象的技术。简单地说,这种技术将数据库中的一个表映射为程序中的一个对象,表中的字段映射为对象的属性,然后通过提供的方法完成对数据库的操作。就这一点而言,Zend Framework很相似于现在流行的非PHP的开发框架Ruby on Rails。
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,其遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
此外,还有FleaPHP、CakePHP等很多优秀的框架,此处就不一一列举,它们本质上都是基于MVC的架构,下面着重介绍一下在互联网公司使用比较广泛的CI框架。
3、PHP+mysql
1、问题:设教务管理系统中有三个基本表:
学生信息表S(SNO, SNAME, AGE, SEX),其属性分别表示学号、学生姓名、年龄和性别。
选课信息表SC(SNO, CNO, SCGRADE),其属性分别表示学号、课程号和成绩。
课程信息表C(CNO, CNAME, CTEACHER),其属性分别表示课程号、课程名称和任课老师姓名。
1)把SC表中每门课程的平均成绩插入另外一个已经存在的表SC_C(CNO, CNAME, AVG_GRADE)中,其中AVG_GRADE表示的是每门课程的平均成绩。
INSERT INTO SC_C(CNO, CNAME, AVG_GRADE)
SELECT SC.CNO, C.CNAME, AVG(SCGRADE) FROM SC, C WHERE SC.CNO = C.CNO GROUP BY SC.CNO
2)规定女同学选修何昊老师的课程成绩都应该在80分以上(包含80分)。
ALERT TABLE SC, S, C
ADD CONSTRAINT GRADE CHECK(SCGRADE>=80)
WHERE SC.CNO=C.CNO AND SC.SNO=S.SNO AND C.CTEACHER='何昊' AND S.SEX=
"女"
3)从SC表中把何昊老师的女学生选课记录删除。
DELETE FROM SC WHERE CNO=(SELECT CNO FROM C WHERE C.CTEACHER ='何昊') AND SNO IN (SELECT SNO FROM S WHERE SEX='女')
4)找出没有选修过“何昊”老师讲授课程的所有学生姓名。
SELECT SNAME FROM S
WHERE NOT EXISTS(
SELECT * FROM SC,C WHERE SC.CNO=C.CNO AND CNAME='何昊' AND SC.SNO=S.SNO)
5)列出有两门以上(含两门)不及格课程(成绩小于60)的学生姓名及其平均成绩。
SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,( SELECT SNO FROM SC WHERE SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2)A WHERE S.SNO=A.SNO AND SC.SNO = A.SNO GROUP BY S.SNO,S.SNAME
6)列出既学过“1”号课程,又学过“2”号课程的所有学生姓名。
SELECT S.SNO,S.SNAME
FROM S,(SELECT SC.SNO FROM SC,C
WHERE SC.CNO=C.CNO AND C.CNAME IN('1','2')
GROUP BY SNO HAVING COUNT(DISTINCT CNO)=2
)SC WHERE S.SNO=SC.SNO
7)列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号。
SELECT S.SNO,S.SNAME
FROM S,(
SELECT SC1.SNO
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME='1'
AND SC2.CNO=C2.CNO AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO
8)列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩。
SELECT S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]
FROM S,( SELECT SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME='1'
AND SC2.CNO=C2.CNO AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO
2、UNION和UNION ALL有什么区别?
UNION在进行表求并集后会去掉重复的元素,所以会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
而UNION ALL只是简单地将两个结果合并后就返回。因此,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据。
从上面的对比可以看出,在执行查询操作的时候,UNION ALL要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据,那么最好使用UNION ALL。例如,如下有两个学生表Table1和Table2。
Table1
C1 C2
1 1
2 2
3 3
Table2
C1 C2
3 3
4 4
1 1
select from Table1 union select from Table2 的查询结果为
C1 C2
1 1
2 2
3 3
4 4
select from Table1 union all select from Table2 的查询结果为
C1 C2
1 1
2 2
3 3
3 3
4 4
1 1
3、什么是数据库三级封锁协议?
众所周知,基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁)。所谓X锁是事务T对数据A加上X锁时,只允许事务T读取和修改数据A。所谓S锁是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁。若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,但不能加X锁,从而可以读取A,但不能更新A。
在运用X锁和S锁对数据对象加锁时,还需要约定一些规则,例如,何时申请X锁或S锁、持锁时间、何时释放等,称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。一般使用三级封锁协议,也称为三级加锁协议。该协议是为了保证正确的调度事务的并发操作。三级加锁协议是事务在对数据库对象加锁、解锁时必须遵守的一种规则。下面分别介绍这三级封锁协议。
一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。
二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
4、以下关于mysql_pconnect的说法中,正确的是( )。
A.与数据库进行多连接 B.与mysql_connect功能相同
C.与@mysql_connect功能相同 D.与数据库建立持久连接
参考答案:D。
分析:mysql_pconnect()函数打开一个到 MySQL 服务器的持久连接。
mysql_pconnect()和mysql_connect()非常相似,虽然只多了一个p,但它们有两个主要区别:当连接的时候本函数将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接。其次,当脚本执行完毕后到SQL服务器的连接不会被关闭,此连接将保持打开以备以后使用(mysql_close()不会关闭由mysql_pconnect()建立的连接)。所以,选项D正确。
【실제 질문 204】 PDO는 SQL 쿼리를 실행하여 데이터베이스와 상호 작용합니다. 어떤 방법을 사용할지는 수행하려는 작업에 따라 다릅니다. DML문을 데이터베이스에 보내는 경우 가장 적절한 방법은 ( )이다.
아. PDO 개체
B에서 exec() 메서드를 사용하세요. PDO 객체에서 query() 메소드를 사용하세요
C. PDO 객체의 prepare() 메소드와 PDOStatement 객체의 Execute() 메소드를 사용하여
D를 결합합니다. 위의 방법 모두 가능합니다
참고답변 : A.
분석: PDO->exec() 메서드는 주로 INSERT, UPDATE, DELETE 및 기타 작업과 같이 결과 집합을 반환하지 않는 작업에 사용됩니다. 반환되는 결과는 현재 작업의 영향을 받는 열 수입니다. 따라서 선택지 A가 맞습니다.
5. PHP의 mysql 함수 시리즈에서 데이터를 탐색하는 데 일반적으로 사용되는 함수는 ( )입니다.
아. mysql_fetch_row, mysql_fetch_assoc, mysql_affetced_rows
B. mysql_fecth_row, mysql_fecth_assoc, mysql_affetced_rows
C. mysql_fetch_rows, mysql_fetch_array, mysql_fetch_assoc
D. mysql_fecth_row, mysql_fecth_array, mysql_fecth_assoc
참고 답변: D.
분석: 가장 일반적으로 사용되는 mysql 시리즈 함수에는 mysql_fetch_row, mysql_fetch_array 및 mysql_fetch_assoc가 포함되지만 mysql_fetch_rows는 존재하지 않습니다.
그래서 이 질문의 답은 D입니다.
6. 테이블 필드 이름을 변경하는 표준 구문은 ( )입니다.
아. 테이블 변경 테이블 이름 필드 추가 단어 유형 [first|after]
B. 테이블 테이블 이름 드롭 필드 변경 [첫 번째|이후]
C. 테이블 변경 테이블 이름 변경 원래 이름 새 이름 새 유형 [첫 번째|이후]
D. 테이블 변경 테이블 이름 수정 원래 이름 필드 유형 [first|after]
참조 답변: C.
분석: 테이블 필드 이름 수정을 위한 구문: 테이블 테이블 이름 변경 원래 필드 이름 변경 새 필드 이름 유형;.
필드 유형 수정 구문: 테이블 테이블 이름 변경 필드 이름 유형 수정;.
필드 추가: 테이블 테이블 이름 추가 열 필드 이름 유형이 null이 아닙니다(또는 기본 null). 새 필드를 추가하는 것은 기본적으로 비어 있지 않습니다(기본값은 비어 있음).
필드 삭제: 테이블 테이블 이름 변경 열 새 필드 이름 삭제;.
위 내용은 2018PHP 면접 질문 최신 요약(답변 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!