Вставить или обновить несколько одинаковых имен, но разные идентификаторы в одной таблице - PullRequest
0 голосов
/ 28 октября 2018

Мне нужно вставить или обновить несколько строк с одинаковыми именами, но разными идентификаторами. Вот пример таблицы

order | event_name | event_id | sport_id
1     | EPL        | 46       | 1
2     | EPL        | 47       | 1
3     | EPL        | 48       | 1
4     | ISL        | 59       | 1

В приведенной выше таблице показано одно и то же EPL имя-события в трех строках, но с другим идентификатором события. Iнужно вставить или обновить все из них на основе другого event_id, но это вызывает повторяющуюся запись для event_name.

 $sql = "SELECT event_name FROM dbs_events where event_id = '$event_id '";
             $result = $conn->query($sql);

            if ($result->num_rows > 0) {
                $row = $result->fetch_assoc();
                $sql = "UPDATE dbs_events SET event_name = '$event_name', sport_id = '$sport_id' WHERE event_id = '$event_id' ";
            } else {   
                $sql = "INSERT INTO dbs_events (event_id, event_name, sport_id, event_sort_order) VALUES ('$event_id', '$event_name', '$sport_id', '$event_sort_order')";

            }

DUPLICATE KEY UPDATE или LAST_INSERT_ID (), кажется, не работает в этом случае, потому что мне нужно вставить предопределенныйзначение не приращение значения.

1 Ответ

0 голосов
/ 28 октября 2018

У вас есть дополнительный пробел между кавычками в условии Where вашего запроса Select: '$event_id '.Это приводит к тому, что ваш запрос не возвращает результата, даже если $event_id действительно существует.Вот почему ваше if условие всегда пытается выполнить Insert, что приводит к дублирующим ошибкам при вводе.

Рассмотрим это как урок, чтобы начать использовать вместо этого Подготовленные операторы .Кроме того, ваш запрос открыт для SQL-инъекций связанных атак.

Вместо этого попробуйте следующее (с использованием подготовленных операторов):

$sql = "SELECT event_name FROM dbs_events where event_id = ?";

// Prepare the SQL statement, bind the parameters and then execute
$stmt = $conn->prepare($sql);
$stmt->bind_param('i', $event_id);
$stmt->execute();

// Fetch the results now
$result = $stmt->get_result();

// Close the statement
$stmt->close();

if ($result->num_rows > 0) {
    $row = $result->fetch_assoc(); // I am not sure what you need this for

    // Preparing Update query statement; binding params and execute
    $sql = "UPDATE dbs_events
           SET event_name = ?, 
               sport_id = ? 
           WHERE event_id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('sii', $event_name, $sport_id, $event_id);
    $stmt->execute();
    $stmt->close();

} else {   

    // Preparing Insert query statement; binding params and execute
    $sql = "INSERT INTO dbs_events 
           (event_id, event_name, sport_id, event_sort_order) 
           VALUES            
           (?,?,?,?)";
            $stmt = $conn->prepare($sql);
    $stmt->bind_param('isii', $event_id, $event_name, $sport_id, $event_sort_order);
    $stmt->execute();
    $stmt->close();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...