何时使用准备好的陈述?

时间:2013-01-26 08:48:18

标签: php mysql mysqli prepared-statement web-traffic

我几乎没有问题。

规范:MySql数据库;服务器端语言PHP 5.3.10

1)何时应该使用准备好的陈述?

我正在构建一个拥有用户的webapp。我正在不断地检索/插入数据库。我目前没有使用准备好的陈述,我想知道这是否是错误的做事方式?

/**
     * Register a new user into the database.  Please make sure to
     * hash the password.
     * @param type $fName First name of the user - String value.
     * @param type $lName Last name of the user - String value.
     * @param type $email Email address of the user - String value.
     * @param type $hashedPassword - String value.
     * @return boolean true if sucessful or false if failed.
     */
    function registerUser($fName, $lName, $email, $hashedPassword)
    {
        //Establish a connection.
        $mysqli = new $mysqli($GLOBALS['dbServer'], $GLOBALS['dbUserName'], $GLOBALS['dbPassword'], $GLOBALS['dbName']);

        //Check if connection failed.
        if($mysqli->connect_error)
        {
            die('Connect Error (' .$mysqli->connect_errno . ') '
                    .$mysqli->connect_error);
        }

        //Insert data into the table and check if the attempt was sucessful.
        if($mysqli->query("INSERT INTO user_info(email, password, fName, lName) VALUE  ('$email', '$hashedPassword', '$fName', '$lName')"))
        {
            return true;
        }
        return false;            
    }

这是将值插入数据库并确保其成功的正确方法吗?或者,我可以使用准备好的陈述,我想知道

2)我将如何使用预准备语句?为什么我(如果你建议我这样做)?

我预计每天会有大约20,000次访问该网站。或者假设这是多少......

2 个答案:

答案 0 :(得分:0)

您应该始终使用预准备语句。这样可以防止SQL注入的任何可能性(提供正确的准备)。我猜你也想知道什么时候可以使用常规查询来提高效率;硬件总是可以升级。注意二阶SQL注入(example)。

答案 1 :(得分:0)

除了“我为什么要”这个问题,which has been answered already之外,您的代码中还有一些内容需要纠正。

  1. 在每个功能中创建新的数据库连接是不可取的 在bootstrap文件中的某处创建它,然后使用global关键字来访问它。
  2. 在代码中间死亡是另一个禁忌。
  3. 将许多操作符填充到单行中并不好,但使代码难以阅读和支持。
  4. 与PDO不同,Mysqli在减少代码重复方面没有任何帮助,因此,程序员必须关心。
  5. 所以,这个功能就像

    function registerUser($fName, $lName, $email, $hashedPassword)
    {
        global $mysqli;
    
        //Insert data into the table and check if the attempt was sucessful.
        $sql = "INSERT INTO user_info(email, password, fName, lName) VALUES (?,?,?,?)";
        $sth = $mysqli->prepare($sql);
        foreach (func_get_args() as $i => $value) {
            $sth->bindValue($i+1, $value, PDO::PARAM_STR);
        }
        $mysqli->execute();
        return !$mysqli->error;
    }