2010-11-01 5 views
1

Так что это мой текущий код:Лучший способ сделать это?

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); 
    } 
} 

Это, предполагают, чтобы добавить новую страницу в DataTable. MySQL любезно предоставлен Филом Хантом от Store the order of something in MySQL

Я знаю, что вы можете использовать multiquery для выполнения того же самого, однако мне сказали, что подготовленный оператор лучше работает и обеспечивает безопасность. Есть ли другой способ сделать это? Как подготовленный многопроцессорный запрос?

Также, что делать с транзакциями? Я не совсем уверен в этом, я полагаю, что если, скажем так, заявление INSERT терпит неудачу, оно также отменяет утверждение UPDATE?

ПРИМЕЧАНИЕ. Функция arCheck закроет инструкцию.

+0

Когда вашим функциям требуется больше, чем скажем от 3 до 5 параметров, он учитывает запах кода. Возможно, вы захотите использовать массив для всех элементов контента. Другим запахом кода является непоследовательное использование фигурных скобок. Я бы посоветовал всегда их использовать. – markus

ответ

0

Подготовленные утверждения действительно быстрее для повторных запросов, по крайней мере, в большинстве случаев. Они также более безопасны, поскольку они автоматически избегают ввода значений, предотвращая атаки SQL-инъекций. Если вы хотите использовать их в PHP, вам понадобится MySQLi extension.

Вы, кажется, имеете правильную идею о транзакциях. С MySQLi существуют методы commit и rollback, в противном случае вы можете использовать mysql_query("COMMIT") или mysql_query("ROLLBACK").

+0

Так будет ли мой способ делать все хорошо? – Pwnna