Проблемы с моей попыткой реализовать UPSERT

У меня возникает эта проблема при проверке условия обновления таблицы в PostgreSQL. Он должен проверить, загружен ли пользователь один раз, и если да, добавьте +1 в acessos .

 <?php $result2 = pg_query("SELECT * from downloads WHERE (nome = $_POST[nome_download] AND email = $_POST[email_download])"); if (pg_num_rows($result2) == 0){ $result = pg_query("INSERT INTO downloads (nome, email, estado, arquivo, acessos) VALUES ('$_POST[nome_download]','$_POST[email_download]','$_POST[estado_download]','$_SESSION[nome_arquivo_download]','1')"); }else{ $arr[acessos] = $arr[acessos] + 1; $result = pg_query("UPDATE downloads SET acessos = $arr[acessos] WHERE (nome = $_POST[nome_download] AND email = $_POST[email_download])"); } if (!$result){ echo "Não foi possível realizar o cadastro. Tente fazer o download mais tarde."; } else { echo "soft_bd"; pg_close(); } ?> 

    Вы ссылаетесь на $arr но это не очевидно из вашего опубликованного кода, где это назначено. В любом случае, если вы хотите увеличить текущее значение acessos на 1, этот подход полностью небезопасен в многопользовательской среде .

    Вы также полностью открыты для SQL-инъекций . Вместо этого используйте подготовленные заявления.

    В Postgres 9.5 вы можете даже сделать это в одном заявлении с новой реализацией UPSERT INSERT ... ON CONFLICT ON ... DO UPDATE – при условии, что существует ограничение UNIQUE или PRIMARY KEY (nome, email) :

     $sql = 'INSERT INTO downloads AS d (nome, email, estado, arquivo, acessos) VALUES ($1, $2, $3, $4, 1) ON CONFLICT ON (nome, email) DO UPDATE SET acessos = EXCLUDED.acessos + 1'; 

    Для повторных вызовов вы можете использовать pg_prepare и pg_execute . Для одного вызова используйте pg_query_params :

     pg_query_params($sql, array($_POST[nome_download] , $_POST[email_download] , $_POST[estado_download] , $_SESSION[nome_arquivo_download]));