update returning query postgres not example php postgresql if-statement prepared-statement upsert

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(); } ?>