Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加或更新MySQL_Mysql_Insert Update - Fatal编程技术网

添加或更新MySQL

添加或更新MySQL,mysql,insert-update,Mysql,Insert Update,我不知道如何在我的特定表格上继续执行以下操作 假设我有以下表param,有3列tck,标签,值tck是我的主键 数据每天都有一次。我想更新现有tck的值,如果发送的数据包含新的tck,我想将其添加到表中 我希望我足够清楚。。。谢谢你的帮助 我使用的代码如下所示: <?php try { $bdd = new PDO('mysql:host='.$_ENV['localhost'].';dbname=eip_tasks','root'); } catch(Exception $e)

我不知道如何在我的特定表格上继续执行以下操作

假设我有以下
表param
,有3列
tck
标签
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(); 
}


?>

您要执行的操作称为向上插入或合并。MySQL确实支持它

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

使用重复键上的
语法
更新行而不是
插入
(如果存在
tck
):

更新:也不要忘记绑定
:label
。作为您的注释,要删除表中而不在源中的数据,您应该将源
tck
值推送到数组中,然后在
不在数组中的位置运行删除查询:

$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'])
    );
}
我发现准备和绑定
tck
值很有用,但对于小型解决方案,您可以将数组值转换为
int
,以防止在这种情况下注入sql:

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

它工作得很好,但是我必须做什么才能删除表中的数据,而不再是源中的数据?我是说完全同步。。。我够清楚了吗?@Henri我补充了更多的信息。它不起作用,我无法确定为什么?从源中删除数据时,该行保留在表中…抱歉,没有错误,也没有异常。。。我将用我粘贴的代码编辑我的问题
if(count($sourceTck) > 0){
    $sourceTckClause = implode("," , array_map('intval', $sourceTck));
    $bdd->query("DELETE FROM param WHERE tck NOT IN ($sourceTckClause)");
}