Maison >développement back-end >tutoriel php >Le dernier résumé des questions d'entretien PHP 2018 (avec réponses)
Cet article vous présente le dernier résumé des questions d'entretien PHP 2018 (avec réponses). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Recommandations associées : "Résumé des questions d'entretien PHP 2019 (Collection) "
Bases des examens fréquents PHP
1. Quelle est la différence entre PHP, ASP et JSP ?
Le nom complet d'ASP est Active Server Pages. Il s'agit d'un environnement de développement côté serveur Web basé sur la plate-forme Windows. Il peut être utilisé pour générer et exécuter un service Web dynamique, interactif et hautes performances. applications. Il ne peut être utilisé que sur les plates-formes Microsoft, mais la portabilité n'est pas bonne. ASP utilise les langages de script VB Script et JScript (JavaScript) comme propre langage de développement. La plupart des premiers sites Web nationaux ont été développés à l’aide de ce logiciel. Cependant, en raison du changement global de Microsoft, ASP.NET a abandonné le modèle de développement Web ASP, celui-ci a donc été éliminé.
PHP est un langage de script intégré multiplateforme côté serveur. Il emprunte beaucoup de syntaxe aux langages C, Java et Perl et associe les propres fonctionnalités de PHP pour permettre aux développeurs Web d'écrire rapidement des pages générées dynamiquement. Il peut être intégré au format HTML, ce qui le rend très adapté au développement Web et prend en charge la plupart des bases de données actuelles. De plus, PHP est entièrement gratuit. Les développeurs peuvent le télécharger gratuitement depuis le site officiel de PHP (http://www.php.net) sans dépenser d'argent. De plus, les développeurs peuvent obtenir le code source sans restrictions et même ajouter les fonctionnalités dont ils ont besoin, ce qui se traduit par une efficacité de développement élevée et un faible coût.
JSP est un langage de programmation réseau lancé par Sun. Il fonctionne sur toutes les plates-formes, offre une sécurité élevée et une efficacité opérationnelle élevée. Son langage de développement est principalement basé sur Java.
ASP, JSP et PHP offrent tous la possibilité de mélanger une sorte de code de programme dans du code HTML, de l'interpréter et de l'exécuter par le moteur de langage. Cependant, le code JSP est compilé dans Servlet et interprété et exécuté par le virtuel Java. machine. Cette opération de compilation ne fonctionne que sur Se produit lorsque la page JSP est demandée pour la première fois. Dans les environnements ASP, PHP et JSP, le code HTML est principalement responsable de la description du style d'affichage des informations, tandis que le code du programme est utilisé pour décrire la logique de traitement. Les pages HTML ordinaires reposent uniquement sur le serveur Web, tandis que les pages ASP, PHP et JSP nécessitent des moteurs de langage supplémentaires pour analyser et exécuter le code du programme. Les résultats de l'exécution du code du programme sont réintégrés dans le code HTML puis envoyés ensemble au navigateur. ASP, PHP et JSP sont toutes des technologies orientées serveur Web et le navigateur client ne nécessite aucune prise en charge logicielle supplémentaire.
2. En PHP, la différence entre les chaînes entourées de guillemets simples et de guillemets doubles est ( ).
A. Les guillemets simples analysent les caractères d'échappement tels que rt, tandis que les guillemets doubles n'analysent pas
B. Les guillemets doubles sont rapides, les guillemets simples sont lents
C. Les guillemets simples sont rapides et les guillemets doubles sont lents
D. Les guillemets doubles analysent les variables commençant par $, tandis que les guillemets simples n'analysent pas
Réponse de référence : D.
Analyse : les guillemets doubles peuvent analyser les variables et les caractères d'échappement commençant par le symbole $, tandis que les guillemets simples n'analysent ni n'échappent les caractères. Par conséquent, l’option A est fausse et l’option D est correcte.
Pour les options B et C, puisque la question indique clairement que les guillemets contiennent des chaînes, il n'est pas nécessaire d'analyser les variables. Dans ce cas, l'efficacité des guillemets doubles et simples est la même. Les deux options B et C sont incorrectes.
3. Quelle est la différence entre orienté objet et orienté processus ?
L'orientation objet est aujourd'hui l'une des méthodes courantes de développement de logiciels. Elle rassemble les données et les opérations sur les données dans un tout interdépendant, c'est-à-dire un objet. Résumez les caractéristiques communes d'objets similaires, c'est-à-dire de classes. La plupart des données d'une classe ne peuvent être traitées que par les méthodes de cette classe. La classe se connecte au monde extérieur via une simple interface externe et les objets communiquent via des messages. Le déroulement du programme est déterminé par l'utilisateur lors de son utilisation. Par exemple, d'un point de vue abstrait, les êtres humains ont des noms spéciaux tels que la taille, le poids, l'âge, le groupe sanguin, etc. Les êtres humains peuvent travailler, marcher debout, manger et utiliser leur propre esprit pour créer des outils. une abstraction. C'est une entité inexistante, mais tous les objets ayant les attributs et les méthodes du groupe humain sont appelés personnes. Cet objet personne est une entité qui existe réellement, et tout le monde est un objet du groupe humain.
Orienté processus est une méthode de développement centrée sur les événements, ce qui signifie une exécution séquentielle descendante et un raffinement progressif. Sa structure de programme est divisée en plusieurs modules de base selon les fonctions, et ces modules forment une structure arborescente. Le module est relativement simple et relativement indépendant dans sa fonction.Chaque module est généralement composé de trois structures de base : séquence, sélection et boucle. La méthode spécifique de mise en œuvre modulaire consiste à utiliser des sous-programmes, et le déroulement du programme est décidé lors de l'écriture du programme. Par exemple, dans le backgammon, l'idée de conception orientée processus consiste à analyser d'abord les étapes du problème : la première étape, démarrer le jeu ; la deuxième étape, la pierre noire bouge en premier ; la troisième étape, dessiner l'image ; étape, jugez le gagnant ou perdez ; la cinquième étape, c'est le tour des Blancs ; Étape 6, dessinez l'image ; déterminez le gagnant ou perdez ; Étape 8, revenez à l'étape 2, affichez le résultat final ; La mise en œuvre de chacune des étapes ci-dessus avec des fonctions distinctes est une méthode de développement orientée processus.
Plus précisément, les deux diffèrent principalement sur les aspects suivants.
1) Le point de départ est différent. L'orientation objet consiste à utiliser des méthodes de pensée conventionnelles pour traiter des problèmes dans le monde objectif, en mettant l'accent sur la cartographie directe des points clés du domaine du problème avec les objets et les interfaces entre les objets. Ce n’est pas le cas de la méthode orientée processus. Elle met l’accent sur l’abstraction et la modularisation du processus. Elle construit ou traite des problèmes objectifs du monde avec le processus comme centre.
2) Les relations logiques hiérarchiques sont différentes. La méthode orientée objet utilise la logique informatique pour simuler l'existence physique dans le monde objectif, utilise la classe de collection d'objets comme unité de base pour le traitement des problèmes et rend le monde informatique aussi proche que possible du monde objectif, de sorte que le traitement des problèmes est plus clair et plus direct, et est orienté vers La méthode objet utilise la structure hiérarchique des classes pour refléter l'héritage et le développement entre les classes. L'unité de base de la méthode orientée processus pour traiter les problèmes est un module qui peut exprimer clairement et précisément le processus. La structure hiérarchique du module est utilisée pour résumer les relations et les fonctions entre les modules ou les modules, ainsi que les problèmes dans le monde objectif. sont résumés dans des processus qui peuvent être traités par des ordinateurs.
3) La méthode de traitement des données est différente de la méthode du programme de contrôle. La méthode orientée objet encapsule les données et le code correspondant dans un tout.En principe, les autres objets ne peuvent pas modifier directement ses données, c'est-à-dire que la modification de l'objet ne peut être complétée que par ses propres fonctions membres. Le programme de contrôle est activé. et activé via "événementiel" Exécutez le programme. La méthode orientée processus traite les données directement via le programme et les résultats du traitement peuvent être affichés une fois le traitement terminé. Dans la méthode du programme de contrôle, le programme est appelé ou renvoyé selon la conception et ne peut pas être parcouru librement. contrôles, contrôlés et appels entre chaque module avec appel.
4) Les méthodes de conception d'analyse et de conversion de codage sont différentes. La méthode orientée objet est un processus fluide tout au long du cycle de vie du logiciel entre l'analyse, la conception et le codage. De l'analyse à la conception en passant par le codage, une représentation de modèle cohérente est utilisée, c'est-à-dire qu'une connexion transparente est obtenue. L'approche orientée processus met l'accent sur la transformation entre l'analyse, la conception et le codage selon des règles, et réalise une connexion transparente entre l'analyse, la conception et le codage tout au long du cycle de vie du logiciel.
4. En PHP, la façon de personnaliser une classe est ( ).
A.
B.
C.
Réponse de référence : B.
Analyse : Pour définir une classe, utilisez le mot-clé class plus le nom de la classe pour la définir. Le format de définition est : class class name {}. Le format pour instancier une classe est : $object=new classname();.
[Vraie Question 11] La fonction pour obtenir le nom de la classe à laquelle appartient l'objet instancié est ( ).
A. get_class() B. get_object_vars()
C. get_class_methods() D. get_classname()
Réponse de référence : A.
Analyse : Pour l'option A, la fonction get_class() est utilisée pour renvoyer le nom de la classe d'un objet. L’option A est donc correcte.
Pour l'option B, la fonction get_object_vars() est utilisée pour obtenir les attributs de l'objet donné. L’option B est donc fausse.
Pour l'option C, la fonction get_class_methods() est utilisée pour obtenir le nom de la méthode de classe. L’option C est donc incorrecte.
Pour l’option D, une telle méthode n’existe pas en PHP. Par conséquent, l’option D est incorrecte.
5. Parmi les affirmations suivantes concernant PHP orienté objet, laquelle est incorrecte ( ).
B. Le nom de la classe peut être n'importe quelle balise légale qui n'est pas un mot réservé PHP, et les caractères chinois peuvent également être utilisés comme noms de classe PHP
C. Si un constructeur est défini dans une sous-classe PHP, lors de la création d'un objet de la sous-classe, le constructeur de sa classe parent sera implicitement appelé
D. La sérialisation d'un objet enregistrera toutes les variables de l'objet, mais les méthodes de l'objet ne seront pas enregistrées. Seul le nom de la classe sera enregistré
Réponse de référence : C.
Analyse : Le constructeur défini par la sous-classe remplacera le constructeur de la classe parent. Si vous souhaitez que le constructeur de la sous-classe soit exécuté ainsi que le constructeur de la classe parent, vous devez explicitement utiliser parent::__construct(. ); appeler. L’option C est donc incorrecte.
6. Dans la description suivante des classes abstraites PHP, la mauvaise est ( ). A. Les classes abstraites en PHP sont définies à l'aide du mot-clé abstrait
B. Une méthode sans corps de méthode est appelée une méthode abstraite, et la classe contenant la méthode abstraite doit être une classe abstraite
C. Il doit y avoir des méthodes abstraites dans les classes abstraites, sinon elles ne sont pas appelées classes abstraites
D. Les classes abstraites ne peuvent pas être instanciées, c'est-à-dire qu'elles ne peuvent pas être nouvelles dans des objets
Réponse de référence : C.
Analyse : Une classe abstraite peut être une classe vide, ce qui signifie qu'elle n'a pas nécessairement besoin d'avoir une méthode abstraite. Mais les méthodes abstraites ne peuvent exister que dans des classes abstraites. L’option C est donc incorrecte.
7. Qu'est-ce que le polymorphisme ? Le polymorphisme est un mécanisme important pour la réutilisation du code dans la programmation orientée objet. Cela signifie que lorsque la même opération est appliquée à différents objets, elle aura une sémantique différente, produisant ainsi des résultats différents. Par exemple, dans la même opération "+", 3+4 est utilisé pour ajouter des entiers, tandis que "3" + "4" réalise la concaténation de chaînes. D'une manière générale, il existe deux manières d'implémenter le polymorphisme : l'écrasement et la surcharge.
8. Quelle est la différence entre inclure et exiger ? Require et include ont des fonctions similaires : copiez tous les codes/textes/marques du fichier spécifié dans le fichier à l'aide de l'instruction require ou include. Généralement utilisé dans des scénarios où des données, des fichiers ou du code doivent être partagés. En plaçant le code ou les données qui doivent être partagés dans un fichier PHP distinct, référencez-le via require ou incluez-le dans les fichiers qui doivent être utilisés. require() et include() ne sont pas de vraies fonctions, par conséquent, les instructions require() et include() peuvent également ajouter des paramètres directement sans parenthèses.
9. La sortie du code suivant est ( ).
<?php define("x","5"); $x=x+10; echo x; ?>A. Erreur B. 5C. 10 D. 15
Réponse de référence : B.
Analyse : en PHP, la fonction de définition est utilisée pour définir une constante, et la valeur de la constante ne peut pas être modifiée une fois qu'elle a été définie. Dans ce problème, la valeur de x est toujours 5. L’option B est donc correcte.
10. Comment référencer des variables ? Vous pouvez ajouter un symbole & devant la variable pour référencer la variable. La référence de la variable équivaut à donner un alias à la variable. Le même contenu de variable est accessible via des noms différents, modifiant ainsi la valeur. d'une variable changera la valeur de l'autre variable. Une variable changera également.
[Vraie Question 54] Il y a le code suivant :
<?php $a="hello"; $b= &$a; unset($b); $b="world"; echo $a; ?>Le résultat d'exécution du programme est ( )
A. bonjour B. monde C. NULL D. unset
Réponse de référence : A.
Analyse : Le processus d'exécution de ce code est illustré dans la figure ci-dessous.
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. Comment prévenir divers problèmes de sécurité ?
Les problèmes de sécurité courants incluent principalement les aspects suivants :
1) Attaque par injection SQL. L'attaque dite par injection SQL signifie que l'attaquant insère des commandes SQL dans les champs des formulaires Web ou dans les chaînes de requête des requêtes de page pour inciter le serveur à exécuter des commandes SQL malveillantes. Dans certains formulaires, le contenu saisi par l'utilisateur est directement utilisé pour construire des commandes SQL dynamiques ou utilisé comme paramètres d'entrée pour des procédures stockées. De tels formulaires sont particulièrement vulnérables aux attaques par injection SQL. Par exemple, pour un site Web http://www.shuaiqi100.com/New..., l'identifiant est un paramètre de requête et une certaine information est affichée via l'identifiant. Dans le programme JSP, utilisez l'instruction SQL pour lire. les news : "select * from news où id = "+ id. S'il est exécuté normalement, il vous suffit de remplacer id par le paramètre 2. Cependant, lorsqu'un utilisateur illégal modifie le paramètre id par id=2 ; drop database news, puis exécutez En plus de lire les informations d'actualité correspondantes, l'instruction SQL exécutera également drop database news informations, mais cette dernière instruction est illégale.
Étant donné que les attaques par injection SQL utilisent des instructions SQL légales, cette attaque ne peut pas être contrôlée par les pare-feu, et comme elle est applicable à toute base de données basée sur le standard de langage SQL, elle est particulièrement dangereuse. Malgré cela, il existe actuellement de nombreuses méthodes pour empêcher les attaques par injection SQL. Plus précisément, il existe les méthodes suivantes : Utiliser des instructions et des paramètres préparés à envoyer au serveur de base de données pour analyse. Les paramètres seront traités comme des caractères ordinaires. Après avoir utilisé cette méthode, l’attaquant ne peut pas injecter du SQL malveillant. Alors, comment prévenir les attaques par injection SQL ? Voici quelques méthodes couramment utilisées :
① Les instructions et les paramètres préparés sont respectivement envoyés au serveur de base de données pour être analysés.
② Utilisez la fonction addlashes() pour échapper au contenu soumis.
③ L'activation de magic_quotes_gpc=on dans le fichier de configuration PHP convertira automatiquement l'instruction SQL interrogée par l'utilisateur, ce qui joue un rôle important dans la prévention de l'injection SQL.
④ Dans le fichier de configuration PHP, définissez register_globals sur off pour désactiver l'enregistrement des variables globales.
⑤ Dans le fichier de configuration PHP, activez le mode sans échec safe_mode=on;.
⑥ Essayez de ne pas omettre les petits guillemets et les guillemets simples lors de l'écriture d'instructions SQL.
⑦ Améliorez les compétences de dénomination des tables et des champs de la base de données. Nommez certains champs importants en fonction des caractéristiques du programme et donnez-leur des noms difficiles à deviner.
⑧ Contrôlez les messages d'erreur, désactivez la sortie des messages d'erreur, écrivez les messages d'erreur dans les fichiers journaux et n'exposez pas les messages d'erreur sur le site Web.
2) Problèmes de sécurité du fonctionnement de la base de données. Par exemple, les autorisations des utilisateurs ne sont pas restreintes et des opérations incorrectes telles que la mise à jour, la suppression et l'insertion provoquent des problèmes de sécurité du système.
La solution consiste à accorder différentes autorisations à différents utilisateurs, afin de garantir que seuls les utilisateurs disposant d'autorisations peuvent effectuer des opérations spécifiques.
3) Il n'y a aucune vérification de la méthode de requête http de l'utilisateur. Les utilisateurs malveillants peuvent simuler des requêtes http vers des sites Web pour provoquer des attaques malveillantes. Afin d'éviter de telles attaques, il est nécessaire de vérifier si la source d'accès dans la requête http de l'utilisateur est digne de confiance, de filtrer le référent dans l'en-tête http et d'autoriser uniquement l'accès à. sites dans ce domaine.
4) Il n'y a aucune vérification de l'unicité de la source du formulaire, et il ne peut pas identifier s'il s'agit d'une soumission de formulaire légal ou d'une soumission de formulaire falsifié par un pirate informatique.
Pour empêcher les pirates de falsifier les soumissions de formulaires, un jeton unique peut être utilisé. Le serveur utilise une certaine stratégie pour générer une chaîne aléatoire et l'enregistrer dans la session en tant que jeton. Ensuite, lorsque la page demandée est envoyée, le jeton est envoyé avec d'autres informations sous la forme d'un domaine caché, et le jeton est envoyé. envoyé sur la page de réception. Le token dans les informations reçues est comparé au token dans la Session Seulement s'ils sont cohérents, la demande sera traitée. Dans le cas contraire, la demande sera rejetée. est unique et empêche les pirates de falsifier les soumissions de formulaires.
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正确。
[Vraie question 204] PDO interagit avec la base de données en exécutant des requêtes SQL. Elle peut être divisée en de nombreuses stratégies différentes. La méthode à utiliser dépend de l'opération que vous souhaitez effectuer. Si vous envoyez une instruction DML à la base de données, la méthode la plus appropriée est ( ).
A. Utilisez la méthode exec() dans l'objet PDO
B. Utilisez la méthode query() dans l'objet PDO
C. Utilisez la méthode préparer() dans l'objet PDO et la méthode exécuter() dans l'objet PDOStatement pour combiner
D. Toutes les méthodes ci-dessus sont possibles
Réponse de référence : A.
Analyse : la méthode PDO->exec() est principalement destinée aux opérations qui ne renvoient pas de jeu de résultats, telles que INSERT, UPDATE, DELETE et d'autres opérations. Le résultat qu'elle renvoie est le nombre de colonnes affectées par le courant. opération. L’option A est donc correcte.
5. La fonction couramment utilisée pour parcourir les données dans la série de fonctions mysql de PHP est ( ).
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
Réponse de référence : D.
Analyse : les fonctions de la série mysql les plus couramment utilisées. Les fonctions de données de traversée couramment utilisées sont mysql_fetch_row, mysql_fetch_array et mysql_fetch_assoc, mais mysql_fetch_rows n'existe pas.
Donc, la réponse à cette question est D.
6. La syntaxe standard pour modifier les noms des champs de table est ( ).
A. modifier le nom de la table ajouter le type de mot de champ [premier|après]
B. modifier le champ de dépôt du nom de la table [premier|après]
C. modifier le nom de la table changer le nom d'origine nouveau nom nouveau type [premier|après]
D. modifier le nom de la table modifier le type de champ du nom d'origine [premier|après]
Réponse de référence : C.
Analyse : La syntaxe de modification des noms de champs de table : modifier le nom de la table, modifier le nom du champ d'origine, nouveau type de nom de champ ;.
Syntaxe de modification du type de champ : modifier le nom de la table, modifier le type de nom du champ ;.
Ajouter un champ : modifier le nom de la table, ajouter le type de nom de champ de colonne non nul (ou nul par défaut, l'ajout d'un nouveau champ n'est pas vide par défaut (la valeur par défaut est vide).
Supprimer un champ : modifier le nom de la table, supprimer la colonne, le nouveau nom du champ ;.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!