2010-11-01 4 views
1

Donc ceci est mon code actuel:Une meilleure façon de le faire?

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

Il est supposé ajouter une nouvelle page à datatable. Le MySQL est une gracieuseté de Phil Hunt de Store the order of something in MySQL

Je sais que vous pouvez utiliser la requête multiple pour accomplir la même chose, mais on m'a dit que l'instruction préparée est meilleure en termes de performance et de sécurité. Y a-t-il une autre façon de faire cela? Comme une requête multi préparée?

En outre, que diriez-vous de faire des transactions? Je ne suis pas tout à fait sûr de ce que c'est, je suppose que c'est si, disons, l'instruction INSERT échoue, il annulera également l'instruction UPDATE?

REMARQUE: la fonction arCheck ferme l'instruction.

+0

Lorsque vos fonctions ont besoin de plus de 3 à 5 params, c'est une odeur de code. Vous pouvez utiliser un tableau pour tous les éléments de contenu différents. Une autre odeur de code est l'utilisation incohérente des accolades. Je conseillerais de toujours les utiliser. – markus

Répondre

0

Les instructions préparées sont en effet plus rapides pour les requêtes répétées, au moins dans la plupart des cas. Ils sont également plus sûrs car ils échappent automatiquement aux valeurs d'entrée, ce qui empêche les attaques par injection SQL. Si vous voulez les utiliser en PHP, vous aurez besoin du MySQLi extension.

Vous semblez avoir la bonne idée des transactions. Avec MySQLi il y a commit et rollback méthodes, sinon vous pouvez utiliser mysql_query("COMMIT") ou mysql_query("ROLLBACK").

+0

Donc, ma façon de faire serait-elle acceptable? – Pwnna

Questions connexes