2010-06-23 5 views
2

$ url = mysql_real_escape_string ($ _ POST ['url']); $ shoutcast_url = mysql_real_escape_string ($ _ POST ['shoutcast_url']); $ nom_site = mysql_real_escape_string ($ _ POST ["nom_site"]); $ site_subtitle = mysql_real_escape_string ($ _ POST ['site_subtitle']); $ email_suffix = mysql_real_escape_string ($ _ POST ['email_suffix']); $ logo_name = mysql_real_escape_string ($ _ POST ['logo_name']); $ twitter_username = mysql_real_escape_string ($ _ POST ['twitter_username']);Beaucoup de 'If statement', ou une requête mysql redondante?

avec toutes ces options dans un formulaire, ils sont pré-remplis (par la base de données), mais les utilisateurs peuvent choisir de les changer, ce qui met à jour la base de données d'origine. Serait-il mieux pour moi de mettre à jour toutes les colonnes malgré la possibilité que certaines lignes n'aient pas été mises à jour, ou simplement de faire un if ($ original_db_entry = $ possible_new_entry) sur chacune (qui serait une requête en soi)?

Merci

Répondre

6

Je dirais que cela n'a pas vraiment d'importance de toute façon - la taille de la requête que vous envoyez au serveur est ici peu pertinent, et il n'y a pas d'information « dernière mise à jour » pour les colonnes qui Par ailleurs, ce que j'aime faire quand je travaille avec de telles charges de données est de créer un tableau temporaire.

$fields = array("url", "shoutcast_url", "site_name", "site_subtitle" , ....); 

foreach ($fields as $field) 
$$field = mysql_real_escape_string($_POST[$field]); 

la seule chose à être au courant ici est que vous devez faire attention à ne pas mettre les noms de variables dans $fields qui écrasera les variables existantes.

Mise à jour: Col. Shrapnel fait le point correct et valide que l'utilisation de variables variables n'est pas une bonne pratique. Alors que je pense qu'il est parfaitement acceptable d'utiliser des variables variables dans le cadre d'une fonction, il est en effet préférable de ne pas les utiliser du tout. La meilleure façon de désinfecter tous les champs entrants et les ont sous une forme utilisable serait:

$sanitized_data = array(); 
$fields = array("url", "shoutcast_url", "site_name", "site_subtitle" , ....); 

foreach ($fields as $field) 
$sanizited_data[$field] = mysql_real_escape_string($_POST[$field]); 

Cela vous laissera avec un tableau que vous pouvez travailler avec:

$sanitized_data["url"] = .... 
$sanitized_data["shoutcast_url"] = .... 
+0

C'est une bonne idée; mais qu'en est-il des deux dollars? – Sam

+1

@Sam le '$$ field' définit' $ url', '$ shoutcast_url',' $ site_name' .... Quelle que soit la chaîne dans le tableau que la boucle actuelle traverse. Le code définit exactement les variables comme le fait votre bloc de code, avec juste moins de lignes. –

+1

+1 pour la suggestion "variable variable" – DrColossos

1

Il suffit de lancer une seule requête met à jour toutes les colonnes:

UPDATE table SET col1='a', col2='b', col3='c' WHERE id = '5' 
0

Oui, vous pouvez mettre à jour tous les champs.
Une fonction simple pour produire instruction SET:

function dbSet($fields) { 
    $set=''; 
    foreach ($fields as $field) { 
    if (isset($_POST[$field])) { 
     $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', "; 
    } 
    } 
    return substr($set, 0, -2); 
} 

et utilisation:

$fields = explode(" ","name surname lastname address zip fax phone"); 
$query = "UPDATE $table SET ".dbSet($fields)." WHERE id=$id"; 
+0

Cela ne fonctionnera pas pour les cases à cocher. Si vous désactivez une case à cocher, la modification sera perdue et le champ restera inchangé. –

+0

@Pekka Oui, mais vous n'avez toujours pas besoin de variables variables pour les cases à cocher –

+0

@Col qu'est-ce que cela a à voir avec le problème à portée de main? –

1

Je vous recommande d'exécuter UPDATE avec toutes les valeurs de la colonne. Ce serait moins coûteux que d'essayer de confirmer que la valeur est différente de ce qui est actuellement dans la base de données. Et cette confirmation ne serait pas pertinente de toute façon, car les valeurs dans la base de données pourraient changer instantanément après que vous les ayez vérifiées si quelqu'un d'autre les met à jour.

Si vous émettez une MISE À JOUR par rapport à MySQL et que les valeurs sont identiques aux valeurs déjà présentes dans la base de données, l'UPDATE sera un no-op. Autrement dit, MySQL signale zéro lignes affectées. MySQL sait ne pas faire de travail inutile pendant une mise à jour.

Si une seule colonne change, MySQL a besoin de travailler. Il ne modifie que les colonnes qui sont différentes, mais il crée toujours une nouvelle version de ligne (en supposant que vous utilisez InnoDB).

Et bien sûr, il y a une petite quantité de travail nécessaire pour envoyer l'instruction UPDATE au serveur MySQL afin qu'il puisse comparer avec la ligne existante. Mais généralement, cela ne prend que quelques centièmes de milliseconde sur un serveur moderne.