程序员面试必备PHP基础面试题 – 第十九天

2022-08-03 14:24:55 浏览数 (1)

一、需要设置一个有效期为31天,的memcache值,请补充下面的代码

代码语言:javascript复制
<?php
$memcache_obj=new memcache
$memcache_obj->connect(‘memcache_host,11211’);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>

答案:31243600

二、请对语句select * from tableExample where ((a and b) and c or (((a and b ) and (c and d)))进行优化的语句。

代码语言:javascript复制
答案:select * from tableExample where (a and b and c) or  (a and b and c and d);

三、_____函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的。

答案:debug_backtrace()

四、现在请你设计一个留言板系统,请简要的写出你设计的其中分页算法的思路.

答案:1.可以通过count(*)来得到记录总条数

2.将总条数除以每页显示条数取整得到分页数

3.点击下一页的链接进行传值,将传值拼装成where条件

4.显示相应数据

或者

一个简单的数据库的增删改查的留言版,分页的设计思路,即是每次进行查询所发送的参数不同,从数据库中得到不同数据,在sql语句中用limit动态设置偏移量。偏移量可以通过判断和叠加的方式而改变。而总页数可以是,返回的总行数除以每页显示的条数之后取整。如果是一个文件写入的留言版,则可以将取出的内容拆分成数组,后设置偏移量取出不同的元素。

五、数据库中的事务是什么?

答:事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成, 事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

六、优化MYSQL数据库的方法。

答: 1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM

2、使用连接(JOIN)来代替子查询:

代码语言:javascript复制
a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL

3、使用联合(UNION)来代替手动创建的临时表

代码语言:javascript复制
a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`

4、事务处理:

a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败

代码语言:javascript复制
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");

5、锁定表,优化事务处理:

a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前,不会有其它的访问来对 inventory 进行插入、更新或者删除的操作

代码语言:javascript复制
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id);
mysql_query("UNLOCK TABLES");

6、使用外键,优化锁定表

a.把customerinfo里的customerid映射到orderinfo里的customerid,任何一条没有合法的customerid的记录不会写到orderinfo里

代码语言:javascript复制
CREATE TABLE customerinfo
(
  customerid INT NOT NULL,
  PRIMARY KEY(customerid)
)TYPE = INNODB;
CREATE TABLE orderinfo
(
  orderid INT NOT NULL,
  customerid INT NOT NULL,
  PRIMARY KEY(customerid,orderid),
  FOREIGN KEY (customerid) REFERENCES customerinfo
  (customerid) ON DELETE CASCADE
)TYPE = INNODB;

注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB;

7、建立索引:

a.格式:(普通索引)

创建:CREATE INDEX <索引名> ON tablename (索引字段)

修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)

创建表指定索引:CREATE TABLE tablename([...],INDEX索引名[1])

(唯一索引)

创建:CREATE UNIQUE <索引名> ON tablename (索引字段)

修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)

创建表指定索引:CREATE TABLE tablename([...],UNIQUE索引名[2])

(主键) 它是唯一索引,一般在创建表的格式为:

CREATA TABLE tablename ([...],PRIMARY KEY[索引字段])

8、优化查询语句

a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作

例子1:

代码语言:javascript复制
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)

例子2:

代码语言:javascript复制
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)

例子3:

代码语言:javascript复制
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";

选取最适用的字段属性 尽量减少字段的长度 设置为not null

使用join代替子查询

使用union代替手动创建临时表

使用并优化事物处理

使用外键

使用索引

优化查询语句

0 人点赞