2012-06-21 5 views
0

J'ai un datatable avec des informations sur l'utilisateur et une colonne appelée 'Bits'. Il y a une fonction de transfert et je voudrais transférer x quantité de bits de l'utilisateur connecté à l'utilisateur qu'ils spécifient. J'ai la fonction suivante qui fonctionne, mais je voudrais savoir s'il y a une meilleure façon (plus simple, plus propre, plus rapide?) De faire tout cela, et éventuellement retourner la ligne de la première instruction SQL à la fin. Je ne suis pas un utilisateur avancé de MySQL par tous les moyens, mais je suis presque sûr qu'il y a une fonction qui me manque et qui pourrait rendre cela beaucoup plus facile.Mise à jour de deux lignes à ajouter et soustraire

function transferBits($toid, $amount) 
{ 
    global $loggedInUser, $db; 
    $fromid = $loggedInUser->user_id; 
    $sql = "INSERT INTO `dl_Transfers` SET From_ID = '".$db->sql_escape($fromid)."', 
     `To_ID`='".$db->sql_escape($toid)."', 
     `Bits`='".$db->sql_escape($amount)."', 
     `When`=Now()"; 
    $result = $db->sql_query($sql); 
    $sql2 = "UPDATE `dl_Users` SET Bits = Bits - '".$db->sql_escape($amount)."' WHERE `User_ID` = '".$db->sql_escape($fromid)."'"; 
    $result2 = $db->sql_query($sql2); 
    $sql3 = "UPDATE `dl_Users` SET Bits = Bits + '".$db->sql_escape($amount)."' WHERE `User_ID` = '".$db->sql_escape($toid)."'"; 
    $result3 = $db->sql_query($sql3); 
} 
+4

je regarderais certainement en faire cela en utilisant les transactions dans la base de données; Si votre code est interrompu à mi-chemin, vos totaux seront incohérents. – andrewsi

+1

@andrewsi qui est la beauté de la restauration: D –

Répondre

3

Je pense que vous pouvez frapper la mise à jour dans la requête unique en se joignant à l'ID d'enregistrement précédent de votre insert sur dl_Transfers:

UPDATE `dl_Transfers` r 
JOIN `dl_Users` f ON (r.From_ID = f.User_ID) 
JOIN `dl_Users` t ON (r.To_ID = t.User_ID) 
SET f.Bits = f.Bits - r.Bits, t.Bits = t.Bits + r.Bits 
WHERE r.Transfer_ID = ?; 

également que d'autres ont déclaré dans leurs commentaires, vous devez certainement utiliser les transactions ici.

+0

C'est une façon très pratique de le faire! – andrewsi

+0

J'ai essayé plusieurs méthodes différentes pour que cela fonctionne (et appris sur les transactions, ouais!) Mais je continue à venir avec une requête SQL d'erreur: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '?' à la ligne 1 – Danejir

+0

Ajout de "" autour du? le fait tourner sans erreur, mais il retourne # MySQL a renvoyé un ensemble de résultats vide (c'est-à-dire zéro rangée). Est-ce qu'il me manque quelque chose dans la déclaration de jointure que je dois changer? – Danejir

Questions connexes