2016-05-25 4 views
0

У меня есть INSERT .. ON DUPLICATE KEY, который просто не обновляется, вместо этого вставляет новую строку. У меня есть 2 уникальных ключа, но все же это просто вставка новых строк. Я пробовал уникальные ключи на нескольких строках, чтобы увидеть, была ли эта проблема, но все еще получала ту же проблему.INSERT ... ON DUPLICATE KEY или UPDATE ... SET

Так что мне было интересно использовать UPDATE table SET ... быть более подходящим или я должен придерживаться INSERT .. ON DUPLICATE.

У меня есть таблица продуктов, в которой я хочу, чтобы мои администраторы могли изменять/обновлять, когда захотят. На данный момент у меня есть INSERT .. ON DUPLICATE, но это дает мне бесконечные проблемы.

У меня есть уникальный ключ как для первичного ключа (я знаю, что он не нужен, только для целей тестирования), так и название ресторана, поскольку логически я думал, что если уникальный ключ в названии ресторана не работает. Возможно, сделав идентификатор ресторана и название ресторана уникальным ключом, функция будет обновлять строку, а не вставлять новую. Но все еще не работает, это мое последнее средство, поскольку я не могу понять проблему.

UPDATE

Новая строка только вставляется, если я изменить название ресторана, если я ничего менять обновление таблицы.

if (isset($_POST['Save-dets'])) { 
     $r_id = mysqli_real_escape_string($dbc, $_POST['Resturant_ID']); 
     $r_name = mysqli_real_escape_string($dbc, $_POST['rest_name']); 
     $r_desc = mysqli_real_escape_string($dbc, $_POST['Desc']); 

    $insert_rest = "INSERT INTO Rest_Details 
    (Resturant_ID 
    , Resturant_name 
    , Resturant_des) 
    VALUES 
    (? 
    , ? 
    , ? 
) 
ON DUPLICATE KEY 
UPDATE Resturant_ID = ? 
    , Resturant_name    = ? 
    , Resturant_des  = ?"; 

     $run_query = $dbc->prepare($insert_rest); 
     $run_query->bind_param($c, 'ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc); 


     if (!$run_query->execute($run_query)) 


     if ($execute) { 
      echo "<script> alert('Addrrss Saved')</script>"; 

    } else { 
     echo mysqli_error($dbc); 
    } 
    } 

CREATE TABLE `Rest_Details` (
`Resturant_ID` bigint(255) NOT NULL AUTO_INCREMENT, 
`Resturant_name` varchar(100) NOT NULL, 
`Resturant_des` varchar(200) NOT NULL, 
PRIMARY KEY (`Resturant_ID`), 
UNIQUE KEY `Resturant_ID` (`Resturant_ID`,`Resturant_name`), 
) ENGINE=InnoDB AUTO_INCREMENT=243 DEFAULT CHARSET=utf8 

Ваше мнение по этому вопросу было бы очень полезно.

+0

Какова ценность '$ r_id'? –

+0

@JonStirling ресторан id. В этом конкретном ресторане 3 – user6362696

+1

Хорошо, неважно, измените ли вы линию привязки, чтобы использовать 'ississ' вместо' ssssss'? И вы должны удалить «Resturant_ID =?», Поскольку он избыточен. –

ответ

0

Пожалуйста, проверьте использование в

$run_query->bind_param($c, 'ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc); 

Вы смешиваете параметры стиля объектно-ориентированных с функциональными параметрами стиля - см http://php.net/manual/en/mysqli-stmt.bind-param.php

На основании в документации он будет либо

$run_query->bind_param('ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc); 

или

mysqli_stmt_bind_param($c, 'ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc); 
+0

Вы добрались до меня, я буквально просто изменил это, прежде чем видеть ваш ответ. Теперь поняли, что все остальное меняется хорошо, но если я попытаюсь изменить название ресторана, когда я знаю, что строка вставлена – user6362696