聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

一道不错的笔试题

2013-08-05 19:31 浏览: 1073222 次 我要评论(0 条) 字号:

一道PHP笔试题

最近用的一道笔试题,推荐给大家。

问题

请找出下面代码中的问题,修复并优化。


<?php
//批量注册用户,每次>100个。
//注册新用户,要求用户名与email不能与以前的重复。
$mysqli = new Mysqli($host, $user, $pass);
for ($i=0; $i<count($_POST['user_info']); $i++) {
$info = $_POST['user_info'][$i];

$re_1 = $mysqli->query("SELECT * FROM `demo` WHERE `uname`=$info['uname']");
$re_2 = $mysqli->query("SELECT * FROM `demo` WHERE `email`=$info['email']");

if (!$re_1 || !$re_2) {
$mysqli->query("INSERT INTO `demo` (`uname`, `email`) VALUES('$info['email']', '$info['uname']')");
}
}

答案

  • 基础:应该把count提到循环外。
  • 基础:在字符串中拼装数组时候应该用 { 与 } 括起来。
  • 基础:!$re_1 || $re_2应该是!$re_1 && !$re_2或者!($re_1 || $re_2)。
  • 基础:insert语句的values部分两个字段顺序错了。
  • 性能:uname与email两个语句应该拼装成一个OR语句。
  • 性能:应该把所有SELECT拼装一个Sql,然后去除冲突的,再把剩余的通过批量插入的方式通过一条Sql插入。
  • 性能:for应该该用foreach。
  • 安全:参数没有过滤,但回答htmlspecialcharsaddslashes而非mysqli->real_escape_string的减分。
  • 其它:query前没有USE database之类的操作,没有SET NAMES,能回答上来的比较细心。
  • 其它:没有错误处理。

一般如果都能回答上来的话应该就是可以毕业的phper了,之后再在面试中交流经验等方面。

我现在面试中都会出笔试,一般非常少,也很简单,就一道或两道。很多时候这比面试更能反映问题。即便经验超级丰富,但没人想要也不想要一个连基本语法都没掌握的人。

如果大家有更好的经验,还望分享一二。

EOF

2013-06-25



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复