2013-09-20 3 views
2

Я не знаю, как приступить к выполнению следующего действия в моей конкретной таблице.Добавить или обновить MySQL

Скажем, у меня есть следующие table param, с 3-мя колоннами tck, label, value. tck - мой основной ключ.

Данные поступают один раз в день. Я хотел бы обновить значение существующего tck, и если отправленные данные содержат новый tck, я хотел бы добавить его в таблицу ...

Надеюсь, я достаточно ясен ... Спасибо для вашей помощи.

код я использую следующий:

<?php try { 
    $bdd = new PDO('mysql:host='.$_ENV['localhost'].';dbname=eip_tasks','root'); } catch(Exception $e) { 
    die('Erreur : '.$e->getMessage()); } 

$data = $_POST['field1']; 

$phpArray = json_decode($data, true); foreach ($phpArray as $u) { 
     //$req = $bdd->prepare('INSERT INTO param (tck, label, value) VALUES(:tck, :label, :value)'); 
     $req = $bdd->prepare('UPDATE param SET value=:value WHERE tck=:tck'); 
     $req->execute(array(
      ':tck'=>$u['tck'], 
      ':value'=>$u['value'] 
     )); } ?> 

Вот код, я использую в настоящее время:

<?php 
try 
{ 
    $bdd = new PDO('mysql:host='.$_ENV['localhost'].';dbname=eip_tasks','root'); 
} 
catch(Exception $e) 
{ 
    die('Erreur : '.$e->getMessage()); 
} 

$data = $_POST['field1']; 
$phpArray = json_decode($data, true); 

$sourceTck = array(); 
foreach ($phpArray as $u) {array_push($sourceTck, $u['tck']); 
    $req = $bdd->prepare("INSERT INTO param (tck, label, value) VALUES (:tck, :label, :value) ON DUPLICATE KEY UPDATE value=:value"); 
    $req->execute(
     array(
      ':tck'=>$u['tck'], 
      ':label'=>$u['label'], 
      ':value'=>$u['value'] 
     ) 
    ); 
} 

if(count($sourceTck) > 0){ 
    $sourceTckClause = implode("," , $sourceTck); 
    $req = $bdd->prepare("DELETE FROM param WHERE tck NOT IN ($sourceTckClause)"); 
    $req->execute(); 
} 


?> 
+1

[в основном, 'INSERT ... ON DUPLICATE KEY UPDATE ...' запросов] (http://stackoverflow.com/a/1361368/112968) – knittl

ответ

0

То, что вы хотите сделать, это называется upsert или слияние , MySQL это поддерживает.

INSERT INTO param VALUES (:tck, :label, :value) 
ON DUPLICATE KEY UPDATE value = :value 
-- change :label as well? , label = :label 
1

Используйте ON DUPLICATE KEY синтаксис update строки вместо insert (если tck был существовать):

$req = $bdd->prepare(" 
    INSERT INTO param (tck, label, value) 
     VALUES 
    (:tck, :label, :value) 
    ON DUPLICATE KEY UPDATE value=:value 
"); 

Update: Также не забудьте связать :label. Как ваш комментарий, чтобы удалить данные, которые будут находиться в таблице, а не в источнике, Вы должны нажать исходные tck значения в массив, а затем запустить запрос на удаление, где NOT IN ваш массив:

$sourceTck = array(); 
foreach ($phpArray as $u) { 
    array_push($sourceTck, $u['tck']); 
    $req = $bdd->prepare(" 
     INSERT INTO param (tck, label, value) 
      VALUES 
     (:tck, :label, :value) 
     ON DUPLICATE KEY UPDATE value=:value 
    "); 
    $req->execute(
     array(':tck'=>$u['tck'], ':label'=>$u['label'], ':value'=>$u['value']) 
    ); 
} 

я нашел this answer полезно подготовить и связать tck значения, но для небольшого решения, вы можете преобразовать массив значений в int, чтобы предотвратить SQL инъекции в этом случае:

if(count($sourceTck) > 0){ 
    $sourceTckClause = implode("," , array_map('intval', $sourceTck)); 
    $bdd->query("DELETE FROM param WHERE tck NOT IN ($sourceTckClause)"); 
} 
+0

Это wo rks отлично, но что мне нужно сделать, чтобы удалить данные, которые будут в таблице, а не в источнике больше? Я имею в виду полную синхронизацию ... Я достаточно ясно? – Henri

+0

@Henri Я добавил дополнительную информацию. – hallaji

+0

Не работает, и я не могу определить, почему ...? Когда данные удаляются из источника, линия остается в таблице ... – Henri

Смежные вопросы