gpt4 book ai didi

php - 我尝试实现 UPSERT 时遇到的问题

转载 作者:行者123 更新时间:2023-11-29 13:54:40 25 4
gpt4 key购买 nike

我在检查更新 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 注入(inject) 完全开放。请改用准备好的语句。

Postgres 9.5 中,您甚至可以使用新的 UPSERT implementation INSERT ... ON CONFLICT ON ... DO UPDATE单个语句中执行此操作- 假设 (nome, email) 上有一个 UNIQUEPRIMARY KEY 约束:

$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_preparepg_execute .对于单个调用,请使用 pg_query_params :

pg_query_params($sql, array($_POST[nome_download]
, $_POST[email_download]
, $_POST[estado_download]
, $_SESSION[nome_arquivo_download]));

关于php - 我尝试实现 UPSERT 时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com