Heim  >  Artikel  >  Backend-Entwicklung  >  Die neueste Zusammenfassung der PHP-Interviewfragen 2018 (mit Antworten)

Die neueste Zusammenfassung der PHP-Interviewfragen 2018 (mit Antworten)

不言
不言nach vorne
2018-12-12 11:08:0410725Durchsuche

Dieser Artikel enthält die neueste Zusammenfassung der PHP-Interviewfragen (mit Antworten). Ich hoffe, dass er für Freunde in Not hilfreich ist.

Verwandte Empfehlungen: „Zusammenfassung der PHP-Interviewfragen 2019 (Sammlung)

1. Grundlagen der häufigen PHP-Prüfung

1. Was ist der Unterschied zwischen PHP, ASP und JSP?

Der vollständige Name von ASP ist Active Server Pages. Es handelt sich um eine serverseitige Entwicklungsumgebung, die zum Generieren und Ausführen dynamischer, interaktiver und leistungsstarker Webdienste verwendet werden kann Anwendungen Es kann nur auf Microsoft-Plattformen verwendet werden, aber die Portabilität ist nicht gut. ASP verwendet die Skriptsprachen VB Script und JScript (JavaScript) als eigene Entwicklungssprache. Die meisten der frühen inländischen Websites wurden damit entwickelt. Aufgrund der allgemeinen Umstellung von Microsoft gab ASP.NET jedoch das ASP-Webentwicklungsmodell auf, sodass es nun abgeschafft wurde.
PHP ist eine plattformübergreifende serverseitige eingebettete Skriptsprache. Es übernimmt viel Syntax aus den Sprachen C, Java und Perl und kombiniert PHP-eigene Funktionen, um Webentwicklern das schnelle Schreiben dynamisch generierter Seiten zu ermöglichen. Es kann in HTML eingebettet werden, wodurch es sich sehr gut für die Webentwicklung eignet und die meisten aktuellen Datenbanken unterstützt. Darüber hinaus ist PHP völlig kostenlos. Entwickler können es kostenlos von der offiziellen PHP-Website (http://www.php.net) herunterladen, ohne Geld auszugeben. Darüber hinaus können Entwickler den Quellcode ohne Einschränkungen erhalten und sogar die benötigten Funktionen hinzufügen, was zu einer hohen Entwicklungseffizienz und niedrigen Kosten führt.
JSP ist eine von Sun Company eingeführte Netzwerkprogrammiersprache. Sie läuft plattformübergreifend, bietet hohe Sicherheit und hohe Betriebseffizienz. Die Entwicklungssprache basiert hauptsächlich auf Java.
ASP, JSP und PHP bieten alle die Möglichkeit, eine Art Programmcode in HTML-Code zu mischen und ihn von der Sprach-Engine zu interpretieren und auszuführen. JSP-Code wird jedoch in Servlet kompiliert und von Java Virtual interpretiert und ausgeführt Dieser Kompilierungsvorgang funktioniert nur, wenn die JSP-Seite zum ersten Mal angefordert wird. In ASP-, PHP- und JSP-Umgebungen ist HTML-Code hauptsächlich für die Beschreibung des Anzeigestils von Informationen verantwortlich, während Programmcode für die Beschreibung der Verarbeitungslogik verwendet wird. Gewöhnliche HTML-Seiten sind nur auf den Webserver angewiesen, während ASP-, PHP- und JSP-Seiten zusätzliche Sprach-Engines benötigen, um Programmcode zu analysieren und auszuführen. Die Ausführungsergebnisse des Programmcodes werden wieder in den HTML-Code eingebettet und dann gemeinsam an den Browser gesendet. ASP, PHP und JSP sind alle Webserver-orientierte Technologien und der Client-Browser erfordert keine zusätzliche Softwareunterstützung.

2. In PHP ist der Unterschied zwischen in einfache und doppelte Anführungszeichen eingeschlossenen Zeichenfolgen ( ).

A. Einfache Anführungszeichen analysieren Escape-Zeichen wie rt, während doppelte Anführungszeichen nicht analysiert werden
B. Doppelte Anführungszeichen sind schnell, einfache Anführungszeichen sind langsam
C. Einfache Anführungszeichen sind schnell und doppelte Anführungszeichen sind langsam.
D. Doppelte Anführungszeichen analysieren Variablen, die mit $ beginnen, während einfache Anführungszeichen nicht analysiert werden
Referenzantwort: D.
Analyse: Doppelte Anführungszeichen können Variablen analysieren und Zeichen maskieren, die mit dem $-Symbol beginnen, während einfache Anführungszeichen keine Zeichen analysieren oder maskieren. Daher ist Option A falsch und Option D richtig.
Da in der Frage eindeutig angegeben ist, dass die Anführungszeichen Zeichenfolgen enthalten, ist es nicht erforderlich, die Variablen zu analysieren. In diesem Fall ist die Effizienz von doppelten und einfachen Anführungszeichen gleich. Beide Optionen B und C sind falsch.

3. Was ist der Unterschied zwischen objektorientiert und prozessorientiert?

Objektorientiert ist heute eine der gängigen Methoden der Softwareentwicklung. Sie fügt Daten und Operationen auf Daten als ein voneinander abhängiges Ganzes, also ein Objekt, zusammen. Abstrahieren Sie die gemeinsamen Merkmale ähnlicher Objekte, also Klassen. Die meisten Daten in der Klasse können nur von den Methoden dieser Klasse verarbeitet werden. Die Klasse bezieht sich über eine einfache externe Schnittstelle auf die Außenwelt, und Objekte kommunizieren über Nachrichten. Der Programmablauf wird während der Nutzung vom Benutzer bestimmt. Aus abstrakter Sicht haben Menschen beispielsweise spezielle Namen wie Größe, Gewicht, Alter, Blutgruppe usw. Menschen können arbeiten, aufrecht gehen, essen und ihren eigenen Verstand nutzen, um Werkzeuge herzustellen. Menschen sind nur eine Abstraktion Es handelt sich um eine nicht existierende Entität, aber alle Objekte mit den Eigenschaften und Methoden der menschlichen Gruppe werden Menschen genannt. Diese Objektperson ist eine tatsächlich existierende Entität, und jeder ist ein Objekt der menschlichen Gruppe.
Prozessorientiert ist eine ereignisorientierte Entwicklungsmethode, die eine sequenzielle Top-Down-Ausführung und schrittweise Verfeinerung bedeutet. Die Programmstruktur ist nach Funktionen in mehrere Grundmodule unterteilt, und diese Module bilden eine Baumstruktur Modul ist relativ einfach und relativ unabhängig in der Funktion. Jedes Modul besteht im Allgemeinen aus drei Grundstrukturen: Sequenz, Auswahl und Schleife. Die spezifische Methode der modularen Implementierung besteht in der Verwendung von Unterprogrammen und dem Programmablauf. Dies wird beim Schreiben des Programms festgelegt. Beim Backgammon besteht die prozessorientierte Designidee darin, zunächst die Schritte des Problems zu analysieren: Im ersten Schritt wird das Spiel gestartet; im dritten Schritt wird das Bild gezeichnet; Schritt: Beurteilen Sie den Gewinner oder verlieren Sie. Schritt 6: Zeichnen Sie das Bild. Schritt 8: Geben Sie das Endergebnis aus. Die Implementierung jedes der oben genannten Schritte mit separaten Funktionen ist eine prozessorientierte Entwicklungsmethode.
Konkret unterscheiden sich die beiden vor allem in den folgenden Aspekten.
1) Der Ausgangspunkt ist ein anderer. Objektorientiert ist die Verwendung herkömmlicher Denkmethoden zur Behandlung von Problemen in der objektiven Welt, wobei der Schwerpunkt auf der direkten Zuordnung der Schlüsselpunkte der Problemdomäne zu Objekten und den Schnittstellen zwischen Objekten liegt. Dies ist bei der prozessorientierten Methode nicht der Fall. Sie betont die Abstraktion und Modularisierung des Prozesses. Sie konstruiert oder behandelt objektive Weltprobleme mit dem Prozess als Zentrum.
2) Die hierarchischen logischen Beziehungen sind unterschiedlich. Die objektorientierte Methode verwendet Computerlogik, um die physische Existenz in der objektiven Welt zu simulieren, verwendet die Sammlungsklasse von Objekten als Grundeinheit für Verarbeitungsprobleme und macht die Computerwelt so nah wie möglich an der objektiven Welt, sodass die Verarbeitung möglich ist Die Lösung von Problemen ist klarer und direkter und orientiert sich an der Objektmethode. Sie nutzt die hierarchische Struktur von Klassen, um die Vererbung und Entwicklung zwischen Klassen widerzuspiegeln. Die Grundeinheit der prozessorientierten Methode zur Behandlung von Problemen ist ein Modul, das den Prozess klar und genau ausdrücken kann. Die hierarchische Struktur des Moduls wird verwendet, um die Beziehungen und Funktionen zwischen Modulen oder Modulen sowie die Probleme in der objektiven Welt zusammenzufassen werden in Prozesse abstrahiert, die von Computern verarbeitet werden können.
3) Die Datenverarbeitungsmethode unterscheidet sich von der Steuerungsprogrammmethode. Die objektorientierte Methode kapselt die Daten und den entsprechenden Code in ein Ganzes. Im Prinzip können andere Objekte ihre Daten nicht direkt ändern, dh die Änderung des Objekts kann nur durch die Aktivierung seiner eigenen Mitgliedsfunktionen abgeschlossen werden und aktiviert durch „ereignisgesteuertes“ Ausführen des Programms. Die prozessorientierte Methode verarbeitet Daten direkt über das Programm, und die Verarbeitungsergebnisse können nach Abschluss der Verarbeitung angezeigt werden. Bei der Steuerungsprogrammmethode wird das Programm je nach Entwurf aufgerufen oder zurückgegeben und kann nicht frei navigiert werden steuert, kontrolliert und ruft zwischen den einzelnen Modulen auf.
4) Analysedesign und Codierungskonvertierungsmethoden sind unterschiedlich. Die objektorientierte Methode ist ein reibungsloser Prozess über den gesamten Software-Lebenszyklus zwischen Analyse, Design und Codierung. Von der Analyse über den Entwurf bis hin zur Codierung wird eine konsistente Modelldarstellung verwendet, d. h. es wird eine nahtlose Verbindung erreicht. Der prozessorientierte Ansatz betont die regelkonforme Transformation zwischen Analyse, Design und Codierung und erreicht eine nahtlose Verbindung zwischen Analyse, Design und Codierung über den gesamten Softwarelebenszyklus.

4. In PHP ist die Möglichkeit, eine Klasse anzupassen ( ).

A.              
C.                                    
Referenzantwort: B.
Analyse: Um eine Klasse zu definieren, müssen Sie das Klassenschlüsselwort und den Klassennamen verwenden. Das Definitionsformat lautet: Klassenklassenname {}. Das Format zum Instanziieren einer Klasse ist: $object=new classname();.
[Echte Frage 11] Die Funktion zum Abrufen des Namens der Klasse, zu der das instanziierte Objekt gehört, ist ().
A. get_class()                     B. get_object_vars()
C. get_class_methods()             D. get_classname()
Referenzantwort: A.
Analyse: Für Option A wird die Funktion get_class() verwendet, um den Namen der Klasse eines Objekts zurückzugeben. Daher ist Option A richtig.
Für Option B wird die Funktion get_object_vars() verwendet, um die Attribute des angegebenen Objekts abzurufen. Daher ist Option B falsch.
Für Option C wird die Funktion get_class_methods() verwendet, um den Namen der Klassenmethode abzurufen. Daher ist Option C falsch.
Für Option D gibt es in PHP keine solche Methode. Daher ist Option D falsch.

5. Welche der folgenden Aussagen über objektorientiertes PHP ist falsch ( ).


A. Um eine Schnittstelle zu implementieren, verwenden Sie den Implements-Operator. Die Klasse muss alle in der Schnittstelle definierten Methoden implementieren, andernfalls wird ein schwerwiegender Fehler gemeldet

B. Der Klassenname kann ein beliebiges legales Tag sein, das kein PHP-reserviertes Wort ist, und chinesische Zeichen können auch als PHP-Klassennamen verwendet werden

C. Wenn ein Konstruktor in einer PHP-Unterklasse definiert ist, wird beim Erstellen eines Objekts der Unterklasse der Konstruktor seiner übergeordneten Klasse implizit
D genannt. Durch die Serialisierung eines Objekts werden alle Variablen des Objekts gespeichert, die Methoden des Objekts werden jedoch nicht gespeichert. Nur der Name der Klasse wird gespeichert
Referenzantwort: C.
Analyse: Der von der Unterklasse definierte Konstruktor überschreibt den Konstruktor der übergeordneten Klasse. Wenn Sie möchten, dass sowohl der Konstruktor der untergeordneten Klasse als auch der Konstruktor der übergeordneten Klasse ausgeführt werden, müssen Sie explizit parent::__construct( verwenden. ); anrufen. Daher ist Option C falsch.

6. In der folgenden Beschreibung der abstrakten PHP-Klassen ist ( ).

A. Abstrakte Klassen in PHP werden mit dem abstrakten Schlüsselwort B definiert. Eine Methode ohne Methodenkörper wird als abstrakte Methode bezeichnet, und die Klasse, die die abstrakte Methode enthält, muss eine abstrakte Klasse sein
C. In abstrakten Klassen müssen abstrakte Methoden vorhanden sein, andernfalls werden sie nicht als abstrakte Klassen bezeichnet
D. Abstrakte Klassen können nicht instanziiert werden, das heißt, sie können nicht neu in Objekte eingefügt werden
Referenzantwort: C.
Analyse: Eine abstrakte Klasse kann eine leere Klasse sein, was bedeutet, dass sie nicht unbedingt über eine abstrakte Methode verfügen muss. Aber abstrakte Methoden können nur in abstrakten Klassen existieren. Daher ist Option C falsch.

7. Was ist Polymorphismus?

Polymorphismus ist ein wichtiger Mechanismus für die Wiederverwendung von Code in der objektorientierten Programmierung. Dies bedeutet, dass dieselbe Operation, wenn sie auf verschiedene Objekte angewendet wird, eine unterschiedliche Semantik aufweist und somit unterschiedliche Ergebnisse liefert. Beispielsweise wird in derselben „+“-Operation 3+4 zum Addieren von Ganzzahlen verwendet, während „3“ + „4“ die Verkettung von Zeichenfolgen realisiert. Im Allgemeinen gibt es zwei Möglichkeiten, Polymorphismus zu implementieren: Überschreiben und Überladen.

8. Was ist der Unterschied zwischen include und require?

Require und include haben ähnliche Funktionen: Kopieren Sie den gesamten Code/Text/Marken in der angegebenen Datei mit der require- oder include-Anweisung in die Datei. Wird normalerweise in Szenarien verwendet, in denen Daten, Dateien oder Code gemeinsam genutzt werden müssen. Indem Sie den Code oder die Daten, die geteilt werden müssen, in einer separaten PHP-Datei ablegen, referenzieren Sie sie über „require“ oder fügen Sie sie in die Dateien ein, die verwendet werden müssen. require() und include() sind keine echten Funktionen, daher können die Anweisungen require() und include() auch Parameter direkt ohne Klammern hinzufügen.

9. Die Ausgabe des folgenden Codes ist ( ).

<?php
    define("x","5"); 
    $x=x+10; 
    echo x; 
?>
A. Fehler             B. 5 C. 10 Tage 15

Referenzantwort: B.

Analyse: In PHP wird die Definitionsfunktion zum Definieren einer Konstante verwendet, und der Wert der Konstante kann nach dem Festlegen nicht mehr geändert werden. In diesem Problem ist der Wert von x immer 5. Daher ist Option B richtig.

10. Wie referenziere ich Variablen?

Sie können vor der Variablen ein &-Symbol hinzufügen, um auf die Variable zu verweisen. Der Verweis auf die Variable entspricht der Angabe eines Alias ​​für die Variable, wodurch der Wert geändert wird Der Wert einer Variablen ändert sich auch.

[Echte Frage 54] Es gibt den folgenden Code:

<?php
    $a="hello";
    $b= &$a;
    unset($b);
    $b="world";
    echo $a;
?>
Das laufende Ergebnis des Programms ist ( )

A. Hallo B. Welt C. NULL D. nicht gesetzt

Referenzantwort: A.
Analyse: Der Ausführungsprozess dieses Codes ist in der folgenden Abbildung dargestellt.

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. Wie kann man verschiedenen Sicherheitsproblemen vorbeugen?
Zu den häufigsten Sicherheitsproblemen gehören hauptsächlich die folgenden Aspekte:
1) SQL-Injection-Angriff. Beim sogenannten SQL-Injection-Angriff fügt der Angreifer SQL-Befehle in die Felder von Webformularen oder die Abfragezeichenfolgen von Seitenanfragen ein, um den Server zur Ausführung bösartiger SQL-Befehle zu verleiten. In einigen Formularen wird der vom Benutzer eingegebene Inhalt direkt zum Erstellen dynamischer SQL-Befehle oder als Eingabeparameter für gespeicherte Prozeduren verwendet. Solche Formulare sind besonders anfällig für SQL-Injection-Angriffe. Beispielsweise ist die ID für eine Website http://www.shuaiqi100.com/New... ein Abfrageparameter, und eine bestimmte Information wird über die ID angezeigt. Verwenden Sie zum Lesen die SQL-Anweisung im JSP-Programm die Nachrichten: „select * from news where id = „+ id“. Bei normaler Ausführung müssen Sie id nur durch Parameter 2 ersetzen. Es gibt jedoch kein Problem, wenn ein illegaler Benutzer den Parameter von id in id=2 ändert. Datenbanknachrichten löschen und dann ausführen Zusätzlich zum Lesen der entsprechenden Nachrichteninformationen führt die SQL-Anweisung auch Datenbanknachrichteninformationen löschen aus, die letztere Anweisung ist jedoch illegal.
Da SQL-Injection-Angriffe legale SQL-Anweisungen verwenden, kann dieser Angriff nicht von Firewalls überprüft werden, und da er auf jede Datenbank anwendbar ist, die auf dem SQL-Sprachstandard basiert, ist er besonders schädlich. Dennoch gibt es derzeit viele Methoden, um SQL-Injection-Angriffe zu verhindern. Insbesondere gibt es die folgenden Methoden: Verwenden Sie vorbereitete Anweisungen und Parameter, die zum Parsen an den Datenbankserver gesendet werden. Nach Verwendung dieser Methode kann der Angreifer kein schädliches SQL mehr einschleusen. Wie kann man also SQL-Injection-Angriffe verhindern? Hier sind einige häufig verwendete Methoden:
① Die vorbereiteten Anweisungen und Parameter werden jeweils zum Parsen an den Datenbankserver gesendet.
② Verwenden Sie die Funktion addslashes(), um den übermittelten Inhalt zu maskieren.
③ Durch Aktivieren von magic_quotes_gpc=on in der PHP-Konfigurationsdatei wird die vom Benutzer abgefragte SQL-Anweisung automatisch konvertiert, was eine wichtige Rolle bei der Verhinderung von SQL-Injection spielt.
④ Setzen Sie in der PHP-Konfigurationsdatei register_globals auf off, um die globale Variablenregistrierung zu deaktivieren.
⑤ Aktivieren Sie in der PHP-Konfigurationsdatei den abgesicherten Modus „safe_mode=on;“.
⑥ Versuchen Sie, beim Schreiben von SQL-Anweisungen keine kleinen und einfachen Anführungszeichen wegzulassen.
⑦ Verbessern Sie die Benennungsfähigkeiten von Datenbanktabellen und -feldern. Benennen Sie einige wichtige Felder entsprechend den Merkmalen des Programms und geben Sie ihnen Namen, die schwer zu erraten sind.
⑧ Kontrollieren Sie Fehlermeldungen, deaktivieren Sie die Ausgabe von Fehlermeldungen, schreiben Sie Fehlermeldungen in Protokolldateien und veröffentlichen Sie Fehlermeldungen nicht auf der Website.
2) Sicherheitsprobleme beim Datenbankbetrieb. Beispielsweise sind Benutzerberechtigungen nicht eingeschränkt und Fehlbedienungen wie Aktualisieren, Löschen und Einfügen führen zu Systemsicherheitsproblemen.
Die Lösung besteht darin, verschiedenen Benutzern unterschiedliche Berechtigungen zu erteilen, um sicherzustellen, dass nur Benutzer mit Berechtigungen bestimmte Vorgänge ausführen können.
3) Es gibt keine Überprüfung der HTTP-Anfragemethode des Benutzers. Böswillige Benutzer können HTTP-Anfragen an Websites simulieren, um böswillige Angriffe auszulösen. Um solche Angriffe zu verhindern, muss überprüft werden, ob die Zugriffsquelle in der HTTP-Anfrage des Benutzers vertrauenswürdig ist, der Referrer im HTTP-Header gefiltert und nur der Zugriff zugelassen werden Websites in dieser Domain.
4) Es gibt keine Überprüfung der Einzigartigkeit der Formularquelle und es kann nicht festgestellt werden, ob es sich um eine legale Formularübermittlung oder eine von einem Hacker gefälschte Formularübermittlung handelt.
Um Hacker daran zu hindern, Formularübermittlungen zu fälschen, kann ein Einmal-Token verwendet werden. Der Server verwendet eine bestimmte Strategie, um eine zufällige Zeichenfolge zu generieren und diese in der Sitzung als Token zu speichern. Wenn die angeforderte Seite gesendet wird, wird das Token zusammen mit anderen Informationen in Form einer versteckten Domäne gesendet Die auf der Empfangsseite gesendeten Token werden nur dann mit den Token in der Sitzung verglichen, wenn sie übereinstimmen. Andernfalls wird die Anfrage abgelehnt ist einzigartig und verhindert, dass Hacker Formulareinsendungen fälschen.

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正确。

[Echte Frage 204] PDO interagiert mit der Datenbank, indem es SQL-Abfragen ausführt. Welche Methode verwendet werden soll, hängt davon ab, welche Operation Sie ausführen möchten. Wenn Sie eine DML-Anweisung an die Datenbank senden, ist () die am besten geeignete Methode.
A. Verwenden Sie die Methode exec() im PDO-Objekt
B. Verwenden Sie die Methode query() im PDO-Objekt
C. Verwenden Sie die Methode „prepare()“ im PDO-Objekt und die Methode „execute()“ im PDOStatement-Objekt, um
D zu kombinieren. Alle oben genannten Methoden sind möglich
Referenzantwort: A.
Analyse: Die PDO->exec()-Methode ist hauptsächlich für Vorgänge gedacht, die keine Ergebnismenge zurückgeben, wie z. B. INSERT, UPDATE, DELETE und andere Vorgänge. Das zurückgegebene Ergebnis ist die Anzahl der vom Strom betroffenen Spalten Betrieb. Daher ist Option A richtig.

5. Die häufig verwendete Funktion zum Durchlaufen von Daten in der MySQL-Funktionsreihe ist ().
A. 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
Referenzantwort: D.
Analyse: Die am häufigsten verwendeten Funktionen der MySQL-Serie sind mysql_fetch_row, mysql_fetch_array und mysql_fetch_assoc, mysql_fetch_rows existiert jedoch nicht.
Die Antwort auf diese Frage lautet also D.

6. Die Standardsyntax zum Ändern von Tabellenfeldnamen ist ( ).
A. Tabelle ändern Tabellenname Feld hinzufügen Worttyp [zuerst|nachher]
B. Tabelle ändern Tabellenname Drop-Feld [zuerst|nachher]
C. Tabelle ändern Tabellenname ursprünglichen Namen ändern neuer Name neuer Typ [first|after]
D. Tabelle ändern, Tabellenname ändern, ursprünglichen Namen ändern, Feldtyp [zuerst|nachher]
Referenzantwort: C.
Analyse: Die Syntax zum Ändern von Tabellenfeldnamen: Tabelle ändern, Tabellenname ändern, ursprünglichen Feldnamen ändern, neuer Feldnamentyp;.
Syntax zum Ändern des Feldtyps: Tabelle ändern, Tabellennamen ändern, Feldnamentyp ändern;.
Fügen Sie ein Feld hinzu: Ändern Sie den Tabellennamen und fügen Sie den Feldnamentyp nicht null hinzu (oder standardmäßig null). Das Hinzufügen eines neuen Felds ist standardmäßig nicht leer (standardmäßig ist es leer).
Ein Feld löschen: Tabelle ändern, Tabellennamen löschen, Spalte löschen, neuer Feldname;.


Das obige ist der detaillierte Inhalt vonDie neueste Zusammenfassung der PHP-Interviewfragen 2018 (mit Antworten). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Was ist Sitzung?Nächster Artikel:Was ist Sitzung?