PHP - 如何更新postgresql表中的某些值

时间:2018-05-22 09:27:45

标签: postgresql php insert

如何更新postgresql表中的某些值?

我有一个包含大量列的大型数据库,在此列中有很多值。我想仅在值不再是最新时更新。但由于尺寸的原因,我不知道哪一个需要更新。我的代码只是更新所有值,但由于需要很长时间才能获得大量数据。有没有办法指定,以确定需要更新哪些值。

我虽然可以处理这个主体==>例如,如果更改了列排序中的值,则行的其余部分将自动更新。通过这种方式,它不必搜索每列中的任何更改。

$host = "localhost";
$username = "postgres";
$password = "password";
$dbname = "dbtest";   
$dbh = new PDO("pgsql:dbname=$dbname; host=$host", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($dbh->connect_error) {
    die("Connection failed: " . $dbh->connect_error);
}

# Query used to insert data
# $sql = "INSERT INTO test (id,sort,full, lm, gs, sp, gan, pac, gsyn, type, searchterm, inter, pat, go) VALUES ('".$id."','".$name ."','".$full_name."','".$lm ."','".$genesymbol ."','".$specie ."','".$geneacc ."','".$placc ."','".$genesyno ."','".$type ."','".$searchterm ."','".$intera ."','".$path ."','".$geneon ."')";

# Query used to update
UPDATE species SET sort ='".$name ."', full_name='".$full_name."' , lm='".$lm ."', gs='".$genesymbol ."', sp='".$specie ."', gan='".$geneacc ."', pac='".$placc ."', gsyn='".$genesyno ."', type='".$type ."', searchterm='".$searchterm ."', inter='".$intera ."', pat='".$path ."', go='".$geneon ."' WHERE id = '".$id."' ";

    if ($dbh->query($sql) === TRUE) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . $dbh->error;
}
$conn->close();

2 个答案:

答案 0 :(得分:1)

您知道自己的数据,以及如果任何列发生更改,sort列会有所不同,这是多么安全。

如果你是对的,那么你的UPDATE语句应如下所示(为了便于阅读,添加了换行符):

$sql = "UPDATE species SET sort ='".$name ."', full_name='".$full_name
      ."' , lm='".$lm ."', gs='".$genesymbol ."', sp='".$specie
      ."', gan='".$geneacc ."', pac='".$placc ."', gsyn='".$genesyno
      ."', type='".$type ."', searchterm='".$searchterm
      ."', inter='".$intera ."', pat='".$path ."', go='".$geneon
      ."' WHERE id = '".$id."' AND sort <> '".$name ."' ";

正如其他人所指出的那样,如果数据是用户输入的话,该语句很容易受到SQL注入攻击;参数化查询会更安全,以避免用户形成输入以破坏系统的可能性。 (示例 - 如果$name' + sort;delete species;会怎么样?)

答案 1 :(得分:0)

最佳解决方案是编写一个触发器,告诉您该库存的最新更新值。新值,以便您可以更新 顺便说一句,你的插入和更新很容易出现SQL INJECTION