У меня возникает эта проблема при проверке условия обновления таблицы в 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]));