zoukankan      html  css  js  c++  java
  • 一道php笔试题

    原文地址: http://www.walu.cc/php/a-bishiti.md

    问题:

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

    <?php
    //批量注册用户,每次>100个。
    //注册新用户,要求用户名与email不能与以前的重复。
    $mysqli= newMysqli($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,能回答上来的比较细心。
    • 其它:没有错误处理。
  • 相关阅读:
    11.2~11.8 每周总结
    11.30~11.6 每周总结
    架构之美 图书笔记 03
    每周总结 10.26-11.1
    每周总结 10.19-10.25
    每周总结 10.12-10.18
    [Tips] centos下docker服务开机自启动
    [Notes] Linux内网穿透
    [Tips] python 文件读写
    [Tips] python 文件读写
  • 原文地址:https://www.cnblogs.com/idlo/p/9660995.html
Copyright © 2011-2022 走看看