php - returning - upsert on conflict
Problemas con mi intento de implementar un UPSERT (1)
Usted se refiere a $arr
pero no es evidente desde el código publicado que se le asignó. De cualquier manera, si desea aumentar el valor actual de acessos
en 1, este enfoque es completamente inseguro en un entorno multiusuario .
También está completamente abierto a la inyección de SQL . Use declaraciones preparadas en su lugar.
En Postgres 9.5 puede incluso hacer esto en una sola declaración con la nueva implementación de UPSERT INSERT ... ON CONFLICT ON ... DO UPDATE
- suponiendo que hay una restricción UNIQUE
o PRIMARY KEY
en (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'';
Para llamadas repetidas, puede usar pg_prepare
y pg_execute
. Para una sola llamada use pg_query_params
:
pg_query_params($sql, array($_POST[nome_download]
, $_POST[email_download]
, $_POST[estado_download]
, $_SESSION[nome_arquivo_download]));
Tengo este problema al verificar una condición para actualizar una tabla en PostgreSQL. Tiene que verificar si el usuario descarga esto una vez y si es así, agregue +1 en 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();
}
?>