2010-06-20 6 views
1

J'ai besoin d'insérer des enregistrements, mais si les enregistrements existent, remplacez-les à la place. Voici ce que je suis actuellement en utilisant:mySQL comment mettre à jour et remplacer

$sessionDate = date("Y-m-d H:i:s"); 
    foreach($tmpVP as $sessionVP) { 
    $res = mysql_query("INSERT INTO sessions 
         (sessionID,sessionDate,sessionVS,sessionVP) 
         VALUES('$sessionID','$sessionDate','$sessionVS', 
         '$sessionVP')") ; 
    } 

Ce que je vraiment besoin est de mettre à jour les dossiers correspondant à sessionID, sessionVS et sessionVP et insérer de nouveaux enregistrements qui ne correspondent pas.

EDIT:

Tableau définition

CREATE TABLE `sessions` (
`ID` bigint(20) NOT NULL auto_increment, 
`sessionID` varchar(36) NOT NULL, 
`sessionDate` datetime NOT NULL, 
`sessionUser` bigint(20) NOT NULL, 
`sessionVS` varchar(255) NOT NULL, 
`sessionVP` bigint(20) NOT NULL, 
`reserved` int(11) NOT NULL, 
PRIMARY KEY (`ID`), 
KEY `ID` (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=88 DEFAULT CHARSET=utf8 

idSession, sessionVP et sessionVS ne sont pas uniques. Exemple:

sessionID     sessionDate   sessionUser sessionVS sessionVP 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53 0   111111 144268736 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53 0   111111 144268819 
0t1m58q9ktejuhqlrjqglcoia0 2010-06-20 09:20:53 0   111111 144268880 

Donc, si j'ai un nouveau record avec 0t1m58q9ktejuhqlrjqglcoia0, 111111 et `144268880' ai-je besoin de mettre à jour la ligne n ° 3 au lieu d'ajouter la ligne n ° 4.

+0

Comme Mark Byers l'a suggéré, vérifiez l'entrée désinfectée avec par ex. 'mysql_real_escape_string' – DrColossos

+0

Veuillez poster votre définition de table. 'SHOW CREATE TABLE sessions' –

Répondre

5

Tout d'abord, vous devez ajouter un index unique sur (sessionID, sessionVP, sessionVS). Vous pouvez le faire en utilisant la commande suivante:

CREATE UNIQUE INDEX ux_sessions_sessionid_sessionvs_sessionvp 
ON sessions (sessionID, sessionVS, sessionVP) 

Ensuite, il y a deux façons relativement simples à insérer ou mettre à jour MySQL. La première consiste à utiliser ON DUPLICATE UPDATE:

INSERT INTO sessions 
(sessionID,sessionDate,sessionVS,sessionVP) 
VALUES 
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP') 
ON DUPLICATE KEY UPDATE sessionDate = '$sessionDate' 

Il autre est d'utiliser REPLACE:

REPLACE INTO sessions 
(sessionID,sessionDate,sessionVS,sessionVP) 
VALUES 
('$sessionID', '$sessionDate', '$sessionVS', '$sessionVP') 

Le second est un peu plus concise, mais présente l'inconvénient qu'il provoque en interne une suppression suivie d'une insertion.

Il y a aussi quelques autres questions:

  • Vous n'avez pas à la fois un index de clé primaire et un index ordinaire sur ID. Supprimez l'index ordinaire car il est redondant.

  • Vous pouvez avoir une vulnérabilité SQL. Si vous n'avez pas encore validé l'entrée, vous pouvez envisager de vous protéger en utilisant mysql_real_escape_string ou intval selon le cas. Vous pouvez également envisager d'utiliser des paramètres de requête.

  • Vous ne vérifiez pas les conditions d'erreur. Pensez à utiliser trigger_error afin que si votre requête a une erreur, vous pouvez voir ce qu'est l'erreur. Voir le message d'erreur peut vous éviter beaucoup de temps de débogage.

    mysql_query("...") or trigger_error(mysql_error()); 
    
+0

Vous pouvez inclure les stipulations que REPLACE a (il supprime l'enregistrement et en insère un nouveau lors de la" mise à jour ") –

+0

@ d03boy: Merci, ajouté cela. –

+0

merci pour les conseils supplémentaires. Je les ai dans mon code, je ne les ai pas inclus dans mon échantillon. – user191688

0

Sur la base de la structure de votre table, je veux dire les clés primaires, vous pouvez utiliser

$res = mysql_query("REPLACE INTO sessions 
         (sessionID,sessionDate,sessionVS,sessionVP) 
         VALUES('$sessionID','$sessionDate','$sessionVS', 
         '$sessionVP')") ; 
1

Ajouter une clé unique sur (sessionID, sessionVS, sessionVP), puis utilisez REPLACE au lieu de INSERT (remplacer simplement le mot, la syntaxe est la même).

Questions connexes