更新表中的行值不起作用

时间:2018-02-11 17:14:09

标签: php mysql sql

如果数据存在,我正在尝试更新表的值。如果没有,请创建一个新的。

代码连接到数据库,然后通过html的post方法获取表单数据。将数据存储在变量中后,设置我想要的搜索。

拜托,我不知道错误在哪里,我花了整整3天才知道这个问题是什么。

这是我的代码:

<?php
session_start();
?>

<?php
$host_db = "host";
$user_db = "user";
$pass_db = "passwd";
$db_name = "database";
$tbl_name = "table";

$conexion = new mysqli($host_db, $user_db, $pass_db, $db_name);

if ($conexion->connect_error) {
    die("conexion error: " . $conexion->connect_error);
}

$data1=$_POST['data1'];
$data2=$_POST['data2'];
$data3=$_POST['data3'];


$search = "SELECT * FROM $tbl_name
WHERE data1 = '$data1' ";
$result = $conexion->query($search);

$count = mysqli_num_rows($result);
$row = mysqli_fetch_row($result);

if ($count == 1) {
    echo "exist";
    $id=$row['ID'];
    $query = "UPDATE $tbl_name
        SET data1 ='$data1',
        data2 ='$data2',
        data3 = '$data3',
        WHERE ID = '$id'";

    if ($conexion->query($query) === TRUE) {
        echo "updated data";
    }else {
    echo "error updating data";
    }
}else{
    echo "does not exist";
    $query = "INSERT INTO $tbl_name (data1, data2, data3)
       VALUES ('$data1', '$data2', '$data3')";
    if ($conexion->query($query) === TRUE) {
        echo "data saved";
    }else {
        echo "error saving data";
    }
}
mysqli_close($conexion);
?>

1 个答案:

答案 0 :(得分:0)

您想要on duplicate key update

INSERT INTO $tbl_name (data1, data2, data3)
    VALUES (?, ?, ?)
    ON DUPLICATE KEY UPDATE data1 = values(data1), data2 = values(data2), data3 = values(data3);

为此,您需要data1上的唯一索引或约束:

create unique index idx_t_data1 on $tbl_name(data1)

与您的方法相比,这有许多优点。首先,唯一索引使数据库负责数据完整性(data1的唯一性)。数据库将执行此操作以进行插入和更新,无论它们在何处完成。

其次,您的代码存在计时问题,因此如果两个线程试图在大约相同的时间插入相同的值,则可能会失败。

第三,?是参数的占位符。您无法参数化表名,但可以参数化值。这是一个好习惯 - MySQL可以缓存查询计划,以便查询运行得更快,它可以避免意外的语法错误,并且使代码不易受到SQL注入攻击。