【发布时间】:2016-12-04 08:11:09
【问题描述】:
我的数据库中有一个相当大的表,我想要一个函数,例如,执行 UPDATE 查询。
我以前在旧项目中所做的是传递所有列的所有值,并将它们插入到查询字符串中,如下例所示:
function updateUser($id, $name, $username){
$query = "UPDATE user SET name = '{$name}', username = '{$username}' WHERE id = '{$id}' ";
return mysqli_query($this->conn, $query);
}
也就是说,每一列都被改变了,即使是那些没有改变的。
但是,这次是大表,不想牺牲应用速度。
我要做的是进行一些比较,从而优化查询,然后才将其发送到数据库。
停留在之前的 UPDATE 查询示例中,这就是我想做的事情:
function updateUser($old_user, $new_user, $user_id){
$changed = false;
$oldFirstName = $old_user->getFirstName();
$newFirstName = $new_user->getFirstName();
if($oldFirstName == $newFirstName){
$firstNameQuery = "";
}else{
$firstNameQuery = " first_name = '".mysqli_escape_string($this->conn, $newFirstName)."',";
$changed = true;
}
$oldLastName = $old_user->getLastName();
$newLastName = $new_user->getLastName();
if($oldLastName == $newLastName){
$lastNameQuery = "";
}else{
$lastNameQuery = " last_name = '".mysqli_escape_string($this->conn, $newLastName)."',";
$changed = true;
}
$oldEmail = $old_user->getEmail();
$newEmail = $new_user->getEmail();
if($oldEmail == $newEmail){
$emailQuery = "";
}else{
$emailQuery = " email = '".mysqli_escape_string($this->conn, $newEmail)."',";
$changed = true;
}
if($changed){
$query = "UPDATE user SET {$firstNameQuery}{$lastNameQuery}{$emailQuery} WHERE user_id = {$user_id}";
return mysqli_query($this->conn, $query);
}else{
return 0;
}
}
尽管如您所见,随着表格的增长,该函数会变得更大,并且具有更多的比较和属性。
我的问题是:我这样做是否节省了大量时间,还是不值得?
【问题讨论】:
-
considerably big table=> 需要号码请... -
大约 20 到 25 列...
-
DB 不关心列,行才是最重要的。顺便说一句,看看How can I prevent SQL injection in PHP?,因为你的代码不安全
-
哦,我明白了。谢谢。在安全问题上,我认为
mysqli_escape_string()负责 SQL 注入,不是吗? -
当你读取一行时,你会得到所有的 col,这对数据库来说很容易,因为数据通常在驱动器上接近/在一起。当您必须读取每一行的非索引 col 时会发生不好的想法,因为 DB 必须读取并跳转到驱动器上的整个 db 文件中。对于注射,我没有看到您的
mysqli_escape_string(),所以是的,它是安全的,但是如果可以的话,请使用准备好的声明,因为您将所有安全性放在一条线上并且只需要牢记“永远不要在我的查询中添加$var"
标签: php mysql sql optimization