Php 我尝试执行UPSERT时遇到的问题

Php 我尝试执行UPSERT时遇到的问题,php,postgresql,if-statement,prepared-statement,upsert,Php,Postgresql,If Statement,Prepared Statement,Upsert,在PostgreSQL中检查更新表的条件时,我遇到了这个问题。它必须检查用户是否下载一次,如果是,则在acessos中添加+1 <?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("INSE

在PostgreSQL中检查更新表的条件时,我遇到了这个问题。它必须检查用户是否下载一次,如果是,则在
acessos
中添加+1

<?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中,您甚至可以在单个语句中使用新的来执行此操作-假设
唯一的
主键
约束
(nome,email)

$sql='作为d插入下载(nome、电子邮件、estado、arquivo、acessos)
价值($1、$2、$3、$4、1)
关于冲突(名称、电子邮件)是否更新
设置acessos=EXCLUDED.acessos+1';
对于重复呼叫,可以使用和。对于单个呼叫,请使用:

pg_query_参数($sql,数组($_POST[nome_下载]
,$发布[电子邮件下载]
,$\帖子[下载]
,$(下载);;

您提到了
$arr
,但从您发布的代码中看不出分配的位置。无论哪种方式,如果您想将
acessos
的当前值增加1,这种方法在多用户环境中是完全不安全的

您还完全可以使用SQL注入。使用事先准备好的语句

Postgres 9.5中,您甚至可以在单个语句中使用新的来执行此操作-假设
唯一的
主键
约束
(nome,email)

$sql='作为d插入下载(nome、电子邮件、estado、arquivo、acessos)
价值($1、$2、$3、$4、1)
关于冲突(名称、电子邮件)是否更新
设置acessos=EXCLUDED.acessos+1';
对于重复呼叫,可以使用和。对于单个呼叫,请使用:

pg_query_参数($sql,数组($_POST[nome_下载]
,$发布[电子邮件下载]
,$\帖子[下载]
,$(下载);;

我不确定它为什么不起作用。如果用户多次下载,我就不能在PostgreSQL中插入相同的数据。你也有SQL注入的问题。永远不要将用户输入粘贴到SQL语句中。另外,pg_num_rows可以返回-1您是否验证了Select语句返回了您期望的行数?我对PHP一无所知,但我会删除不必要的
Select
。运行
update
作为第一条语句。如果未更新任何行,则运行insert。或者,如果只有少数用户多次下载某个内容,则首先运行insert,捕获唯一密钥错误并进行更新。哪个更快,取决于更新和插入哪个更频繁。如果你可以升级到Postgres 9.5,你可以使用
insert。。在冲突更新中
以事务安全的方式完成所有这些,我使用if(!$result2)时遇到了相同的问题。但我会查一查的,@ChrisF。谢谢我不知道为什么它不起作用。如果用户多次下载,我就不能在PostgreSQL中插入相同的数据。你也有SQL注入的问题。永远不要将用户输入粘贴到SQL语句中。另外,pg_num_rows可以返回-1您是否验证了Select语句返回了您期望的行数?我对PHP一无所知,但我会删除不必要的
Select
。运行
update
作为第一条语句。如果未更新任何行,则运行insert。或者,如果只有少数用户多次下载某个内容,则首先运行insert,捕获唯一密钥错误并进行更新。哪个更快,取决于更新和插入哪个更频繁。如果你可以升级到Postgres 9.5,你可以使用
insert。。在冲突更新中
以事务安全的方式完成所有这些,我使用if(!$result2)时遇到了相同的问题。但我会查一查的,@ChrisF。谢谢按照你的建议做,现在一切都正常了。谢谢大家!按照你的建议做,现在一切都正常了。谢谢大家!