PHP - Как обновить некоторые значения в таблице postgresql - PullRequest
0 голосов
/ 22 мая 2018

Как обновить некоторые значения в таблице 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 голосов
/ 22 мая 2018

Вы знаете свои данные, и насколько безопасно предполагать, что столбец 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;?)

0 голосов
/ 22 мая 2018

лучшим решением было бы написать один триггер, который сообщит вам последнее обновленное значение этого coulmn & new value, чтобы вы могли обновлять его в зависимости от того, как ваши вставки и обновления подвержены SQL INJECTION

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...