所以这是我目前的代码:
function addPage($uniquename, $ordernum, $title, $author, $content, $privilege, $description=NULL, $keywords=NULL){
if (!$description) $description = NULL;
if (!$keywords) $keywords = NULL;
//UPDATE `table` SET `ordernum` = `ordernum` + 1 WHERE `ordernum` >= 2
$query = "UPDATE ".$this->prefix."page SET ordernum = ordernum+1 WHERE ordernum >= ?";
if ($stmt = $this->db->prepare($query)){
$stmt->bind_param("i", $ordernum);
$stmt->execute();
if (!arCheck($stmt)) return false;
} else {
$this->stmtError("addPage", $stmt->error);
}
$query = "INSERT INTO ".$this->prefix."page VALUES (LCASE(?), ?, ?, ?, ?, ?, ?, ?)";
if ($stmt = $this->db->prepare($query)){
$stmt->bind_param("sisisssi", $uniquename, $ordernum, $title, $author, $content, $description, $keywords, $privilege);
$stmt->execute();
return arCheck($stmt);
} else {
$this->stmtError("addPage", $stmt->error);
}
}
假设向数据表添加新页面。 MySQL来自Store the order of something in MySQL
的Phil Hunt我知道你可以使用multiquery来完成同样的事情,但我被告知准备好的声明在性能和安全性方面更好。还有另一种方法吗?像准备好的多查询?
另外,做交易怎么样?我不完全确定那是什么,我认为,如果INSERT语句失败,它也将撤消UPDATE语句吗?
注意:arCheck功能将关闭语句。
答案 0 :(得分:0)
对于重复查询,准备好的语句确实更快,至少在大多数情况下。它们也更安全,因为它们会自动转义输入值,从而防止SQL注入攻击。如果你想在PHP中使用它们,你需要MySQLi extension。
您似乎对交易有正确的想法。使用MySQLi有commit
和rollback
方法,否则您可以使用mysql_query("COMMIT")
或mysql_query("ROLLBACK")
。