指南

作者: Captain_tu | 来源:发表于2018-05-09 18:17 被阅读36次
  1. WEB开发中数据提交方式有几种?有什么区别?

Get与post两种方式

区别:
1. Get从服务器获取数据,post向服务器传送数据
2. Get传值在url中可见,post在url中不可见
3. Get传值一般在2KB以内,post传值大小可以在php.ini中进行设置
4. get安全性低,post安全性较高,执行效率却比Post高
建议:
1. get式安全性较Post式要差些包含机密信息建议用Post数据提交式;
2. 做数据查询建议用Get式;做数据添加、修改或删除建议用Post方式;
  1. SQL注入

常用的SQL注入方式

  1. 使用单引号及or关键字

     SELECT * FROM Users WHERE Username='$username' AND Password='$password'
    

使用username=1′or′1′=′1 password=1’or’1’=’1
变成了SELECT * FROM Users WHERE Username='1' OR '1'='1' AND Password='1' OR '1'='1'

  1. 使用括号

     SELECT * FROM Users WHERE (( Username = '$username' ) AND ( Password = MD5('$password')))
    

使用username=1′or′1′=′1′))/∗ password = foo
变成了SELECT * FROM Users WHERE ((Username='1' or '1'='1'))/*') AND (Password = MD5('$password')))

  1. Union查询SQL注入

     SELECT Name, Phone, Address FROM Users WHERE Id=$id
    

使用 $id =1 UNION ALL SELECT creditCardNumber,1,1 FROM CreditCarTable
变成了
SELECT Name, Phone,Address FROM Users WHERE Id=1 UNION ALL SELECT creaditCardNumber,1,1 FROM CreditCarTable

解决方案
  1. 使用预备义语句和参数化查询
    使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。

    使用PDO

     $stmt = $pdo->prepare('SELECT * FROM t_admin WHERE admin_name = :name'); 
     $stmt->execute(array('name' => $name));
     foreach ($stmt as $row) { 
         // do something with $row 
     }
    
  2. 对用户传递的参数进行处理
    常用的PHP函数:

    addslashes
     #在预定义字符之前添加反斜杠
     $a = 'Hello, I am "wang xin yao", who are u?';
     var_dump(addslashes($a));
     #'Hello, I am \"wang xin yao\", who are u?'
     #默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()
    
    get_magic_quotes_gpc
     #判断是否启用了魔术引号
     if (get_magic_quotes_gpc()) {
         $lastname = stripslashes($_POST['lastname']);
     }
     else {
         $lastname = $_POST['lastname'];
     }
    
    一些方法php5以后不推荐使用了,php7直接废除了,比如mysql_real_escape_string
  3. 使用正则过滤常用的字符

     $str = str_replace("*", "", $str);
     $str = str_replace("%", "", $str);
    

Print、echo、print_r有什么区别?

  1. echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
  2. print 是打印字符串, print_r 则是打印复合类型 如数组 对象

什么是事务?及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

  1. 原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
  2. 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
  3. 隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务
  4. 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

说说对SQL语句优化有哪些方法?

  1. 用EXISTS替代IN、用NOT EXISTS替代NOT IN
  2. 避免在索引列上使用计算
  3. 避免在索引列上使用IS NULL和IS NOT NULL
  4. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
  5. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
  6. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

如何进行数据库优化

  1. 选择正确的存储引擎

  2. 优化字段的数据类型
    记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。

  3. 为搜索字段添加索引
    索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。

  4. 避免使用Select *从数据库里读出越多的数据

  5. 使用 ENUM 而不是 VARCHAR
    ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

  6. 尽可能的使用 NOT NULL
    除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。

  7. 分库分表
    垂直拆分,水平拆分

char和varchar的区别?

char是一种固定长度的类型,varchar则是一种可变长度的类型

Mysql 的存储引擎,myisam和innodb的区别。

  • MyISAM 是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;适合小数据,小并发
  • innodb是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。

数据表类型有哪些

MyISAM、InnoDB、HEAP、BOB,ARCHIVE,CS

对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题?

  1. 确认服务器是否能支撑当前访问量。
  2. 优化数据库访问。
  3. 禁止外部访问链接(盗链), 比如图片盗链。
  4. 控制文件下载。
  5. 使用不同主机分流。
  6. 使用浏览统计软件,了解访问量,有针对性的进行优化。

相关文章

网友评论

      本文标题:指南

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