更好的方法吗?

时间:2010-11-01 03:17:21

标签: php mysql

所以这是我目前的代码:

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功能将关闭语句。

1 个答案:

答案 0 :(得分:0)

对于重复查询,准备好的语句确实更快,至少在大多数情况下。它们也更安全,因为它们会自动转义输入值,从而防止SQL注入攻击。如果你想在PHP中使用它们,你需要MySQLi extension

您似乎对交易有正确的想法。使用MySQLi有commitrollback方法,否则您可以使用mysql_query("COMMIT")mysql_query("ROLLBACK")