【发布时间】:2016-04-07 10:02:26
【问题描述】:
我在检查条件以更新 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();
}
?>
【问题讨论】:
-
我不确定它为什么不起作用。否则,我什至不执行并让我感到烦恼,因为我无法在 PostgreSQL 中插入相同的数据,以防用户多次下载。
-
你的SQL注入也有问题。 从不 从将用户输入粘贴到 SQL 语句中。此外,pg_num_rows 可以返回 -1
-
您是否验证过您的 Select 语句返回了您期望的行数?
-
我对PHP一无所知,但我会删除不必要的
select。运行update作为第一条语句。如果没有更新行,则运行插入。或者,如果只有少数用户多次下载某些内容,则先运行插入,捕获唯一键错误并进行更新。哪个更快,取决于哪个更频繁地发生:更新或插入。如果您可以升级到 Postgres 9.5,您可以使用insert .. on conflict update,它以事务安全的方式完成所有这些操作 -
我在使用 if (!$result2) 并遇到了同样的问题。但我会检查一下,@ChrisF。谢谢!
标签: php postgresql if-statement prepared-statement upsert