我有几个问题。
规格:MySql数据库;服务器端语言 PHP 5.3.10
1)什么时候应该使用准备好的语句?
我正在构建一个有用户的网络应用程序。 我不断地检索/插入数据到数据库中。 我目前没有使用准备好的语句,我想知道这是否是错误的做事方式?
/**
* 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 次。或者让我们假设有多少...
您应该始终使用准备好的语句。这将防止任何 SQL 注入的机会(前提是准备工作正确)。我猜您也想知道何时可以使用常规查询来提高效率;硬件可以随时升级。注意二阶 SQL 注入(示例)。
除了“我为什么应该”这个问题之外,已经回答了,您的代码中还有一些内容需要更正。
global
关键字来访问它。所以,这个函数将会是这样的
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;
}