sql - обновление без переопределения существующей информации - PullRequest
0 голосов
/ 16 апреля 2009

У меня есть следующий условный код, который вставит новую запись, если запись с соответствующим именем пользователя не существует, и обновит запись, если она существует. Это отлично работает.

Однако, на данный момент, если я вставлю новую запись и введу только имя и фамилию, и, возможно, сведения об адресе, оставив пустыми данные телефона, это нормально. Если я затем захочу обновить запись только записью по телефону, имя и адрес будут заменены ничем.

Что я хотел бы знать, так это возможность простого заполнения моей php html-формы для обновления информации содержимым поля, которое я буду обновлять? Я использую

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

Чтобы получить пользовательский ввод, который затем передается в функцию javascript, которая затем передается обратно в приведенный ниже код php. Если это невозможно, есть ли простой способ поработать над магией sql / php, чтобы обновить только поле, соответствующее вводу пользователя, которое не является пустым?

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

Ответы [ 2 ]

1 голос
/ 16 апреля 2009

Вам просто нужно построить оператор обновления и динамически привязать параметр. например,

$userQuery = "UPDATE ";

if (!empty($firstname)) {
  $userQuery += "firstname = ?,";
}

...    

if (!empty($firstname)) {
  $bindArgs[] = $firstname;
}
...

, поэтому ваш запрос не будет обновлять столбцы, которые не должны изменяться.

0 голосов
/ 16 апреля 2009

В целом, обратите внимание, что:

  • Целесообразно указывать имена столбцов в INSERT ... VALUES, потому что в противном случае, если кто-то добавит столбец, вы будете раздражены, а если кто-то поменяет порядок столбцов, вы будете сбиты с толку.

  • Существует условие состязания между вашим выбором и вашим обновлением ... другой процесс может вставить / удалить строку, пока вы все еще думаете, что приведет к сбою вставки / обновления. Рассмотрим либо:

    • INSERT ... ON DUPLICATE KEY UPDATE ...
    • ЗАМЕНИТЬ В ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...