2009-04-16 6 views
0

J'ai le code conditionnel suivant, qui insérera un nouvel enregistrement si un enregistrement avec le nom d'utilisateur approprié n'existe pas, et mettra à jour l'enregistrement s'il existe. Cela fonctionne bien.sql - mise à jour sans surcharger les informations existantes

Cependant, à l'heure actuelle, si j'insère un nouvel enregistrement, et que j'insère le prénom et le nom, et peut-être des détails d'adresse avec des informations téléphoniques vides, c'est correct. Si je souhaite ensuite mettre à jour l'enregistrement avec seulement l'enregistrement téléphonique, le nom et l'adresse sont remplacés par rien.

Ce que je voudrais savoir, c'est s'il est possible d'avoir un moyen facile de remplir mon formulaire php html pour mettre à jour les informations, avec le contenu du champ que je vais mettre à jour? J'utilise

<input type="text" name="uniquename" /> 

Pour obtenir l'entrée d'utilisateur, qui est ensuite transmis à une fonction javascript qui est ensuite repassé au code php ci-dessous. Si ce n'est pas possible, existe-t-il un moyen facile de travailler un peu de magie sql/php, pour mettre à jour uniquement un champ correspondant à l'utilisateur qui n'est pas vide?

$usernameQuery = "select username from USERS where username = '" . $con->escape_string($username) . "'"; 

$xblah = $con->query($usernameQuery); 
    while ($row = mysqli_fetch_assoc($xblah)) 
    { 
    $checkUsername = $row['username']; 
    } 

if ($checkUsername == null) { 

$userQuery = "INSERT INTO USERS VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 
if ($userInfo = $con->prepare($userQuery)) { 
    $userInfo->bind_param("ssssssssssssssssssss", $username, $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $comments); 
    $userInfo->execute(); 
    $userInfo->close(); 
    echo "true"; 
} else { 
echo "false"; 
} 
print_r($con->error); 
} 

else if ($checkUsername == $username) { 

$userQuery = "UPDATE USERS SET firstname = ?, lastname = ?, flaggedauctions = ?, lastauction = ?, street1 = ?, city1 = ?, postcode1 = ?, street2 = ?, city2 = ?, postcode2 = ?, phone = ?, mobilephone = ?, fax = ?, email = ?, website = ?, bank = ?, banknumber = ?, accoutnumber = ? WHERE username = ?"; 
if ($userInfo = $con->prepare($userQuery)) { 
    $userInfo->bind_param("sssssssssssssssssss", $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $username); 
    $userInfo->execute(); 
    $userInfo->close(); 
    echo "true"; 
} else { 
echo "false"; 
} 
print_r($con->error); 
} 

Répondre

1

Vous avez juste à construire votre instruction de mise à jour et à lier les paramètres dynamiquement. par exemple. Ainsi, votre requête ne mettra pas à jour les colonnes qui ne sont pas censées changer.

+0

Hmm, merci. Que se passe-t-il avec bindArgs? –

+0

Ma compétence PHP est un peu rouillée mais je pense que vous pouvez passer $ bindArgs dans la fonction bind_param. Je crois que vous pouvez passer des tableaux dans la fonction d'arguments de nombre variable en PHP. – oscarkuo

+0

donc ils sont deux solutions distinctes? Je voudrais juste avoir des bindARgs pour chaque variable? –

0

Plus généralement, notez que:

  • Il est sage de spécifier vos noms de colonnes dans INSERT ... VALUES car sinon si quelqu'un ajoute une colonne que vous serez ennuyé et si quelqu'un réordonne les colonnes » Je vais être confus.

  • Il y a une condition de course entre votre sélection et votre mise à jour ... un autre processus pourrait insérer/supprimer une ligne alors que vous pensez toujours, ce qui provoque votre insertion/mise à jour à l'échec Considérez soit:

    • INSERT ... ON DUPLICATE KEY UPDATE ...
    • REPLACE INTO ...
+0

comment insérer sur dupliquer ou remplacer fixer la condition de course? –

Questions connexes