【问题标题】:If Record exists UPDATE MySql Table or else INSERT using PHP如果记录存在更新 MySql 表,否则使用 PHP 插入
【发布时间】:2018-04-30 07:52:12
【问题描述】:

我必须检查表 forex_rates_new 中是否存在记录,我需要检查 2 个标准,即它必须比较机构 ID 和货币名称。如果 Agency_id 和 currency_name 相同,则系统必须 UPDATE 或 INSERT。

forex_rates_new
id  agency_id   currency_name    rate
1   1111          aaa            1.898
2   2190          aaa            0.787

如果出现值为 111 的机构_id 和带有美元的货币名称,则该数据在数据库中。下次如果用户输入与 USD 相同的值 111 和 currency_name,则记录应进入更新模式或插入。这是我的查询:

INSERT INTO forex_rates_new (`agency_id`,`currency_name`,`rate`,`logo`,`created_at`) 
VALUES('".$agency_id."','".$currency_name."','".$rate."','".$logo."', now())

感谢任何帮助

【问题讨论】:

  • 首先使用选择查询检查给定agency_idcurrency_name的值是否存在。如果返回的行数大于0,则使用上述查询更新 else insert。
  • 为什么要手动插入 ID?最佳做法是让您的数据库自动分配 ID。如果agency_idcurrency_name 不相同但ID 已经存在怎么办?你会运行INSERT?我建议让您的 ID 自动递增并仅按 ID 检查。如果 ID 存在,则更新,否则插入。
  • 没有自动插入 ID。 ID 是主键。

标签: php mysql


【解决方案1】:

我在这里给你简单的演示如何实现这一点。首先你需要做选择数据。像这样。

"SELECT * FROM request WHERE agency_id='$agency_id' ";

现在检查数据是否存在进行更新查询

"UPDATE request SET field name='$value' WHERE agency_id='$agency_id'";

否则是这样的。

INSERT INTO forex_rates_new (`agency_id`,`currency_name`,`rate`,`logo`,`created_at`) 
VALUES('".$agency_id."','".$currency_name."','".$rate."','".$logo."', now())

你的代码应该是这样的。

$qry=mysqli_query($con,"SELECT * FROM request WHERE agency_id='$agency_id' ");
$rowCheck=mysqli_num_rows($qry);
    if ($rowCheck>0) { // if data exist update the data
        $qry=mysqli_query($con,"UPDATE request SET field name='$value' WHERE agency_id='$agency_id'");  
    }
    else{ // insert the data if data is not exist
        $qry=mysqli_query($con,"INSERT INTO request (field name) VALUES('$value')");
    }

记住给定的代码对 sql 注入攻击是开放的。这是逻辑 只有这不是完整的代码。避免使用sql注入攻击 准备好的语句。

【讨论】:

  • 我想这取决于您是否要先执行 READ 操作,然后执行 WRITE 操作。如果不考虑性能,这可能是一个很好的答案。 :D
  • 两个条件包括agency_idcurrency_name?
【解决方案2】:

检查truefalse IFEXISTS

IF ( IF(EXISTS(SELECT `agency_id`,`currency_name` FROM forex_rates_new where `agency_id` = "$agency_id" AND  `currency_name` = "$currency_name"),1,0) ) THEN

BEGIN
    UPDATE forex_rates_new  
    SET
    `rate` = "$rate",
    `logo` = "$logo",
    `created_at` = now();
    WHERE `agency_id` = "$agency_id" AND `currency_name` = "$currency_name"
END;

ELSE

BEGIN
    INSERT INTO forex_rates_new 
    (`agency_id`,`currency_name`,`rate`,`logo`,`created_at`) 
    VALUES
    ("$agency_id","$currency_name","$rate","$logo", now());
END;

END IF;

【讨论】:

  • 我想有一个小小的困惑。脚本不必比较agent_id=currency_name,但它必须比较,如果agent_id = $agency_id(传递值)和如果currency_name=$currency_name(传递值)。如果出现值为 111 的机构_id 并且出现带有美元的货币名称,则它在数据库中。下次如果用户输入与 USD 相同的值 111 和 currency_name,那么记录应该进入更新模式,否则插入。
  • 修改了我的答案,请检查它是否满足您的要求。
  • 感谢@Wong 的宝贵时间。
【解决方案3】:

给你!

<?php    
        $dupl = mysqli_query($con, "SELECT * FROM forex_rates_new WHERE currency_name='$agency_id'") or die(mysql_error($con));

        $row = mysqli_num_rows($dupl);
        if ($row > 0)
        {
            echo "<script language='javascript'>alert('Exists!!!')</script>";

        $stmt1 = $con->prepare("UPDATE forex_rates_new SET column_name=? WHERE column_name=?");
                        if($stmt1)
                        {
                            $stmt1->bind_param('is', $value, $value);
                            $stmt1->execute();
                        }
                      if($stmt1->affected_rows >0)
                      {
                        echo "<script language='javascript'>alert('Updated Sucessfully!!!')</script>";
                      }
                    else
                    {
                        echo "<script language='javascript'>alert('error!!!')</script>";
                    } 
        }

        $stmt = $con->prepare("INSERT into forex_rates_new VALUES(?,?,?,?, now())
        if($stmt)
        {
            $stmt->bind_param('isis', $currency_name, $agency_id, $rate, $logo);
            $stmt->execute();
        }
        if($stmt->affected_rows >0)
        {
            echo "<script language='javascript'>alert('Inserted Successfully!!!')</script>";
        }
        else{
            echo "<script language='javascript'>alert('An error occurred!!!')</script>";
        }
        } 
        ?>

以上是你想要使用 mysqli 准备好的语句。

i 代表整数 s代表字符串

【讨论】:

    【解决方案4】:

    您可以将UNIQUE KEY 添加到agency_id,currency_name,然后可以使用“REPLACE”语法 -> https://dev.mysql.com/doc/refman/8.0/en/replace.html

    更新/插入语句无需选择和添加条件。

    【讨论】:

      【解决方案5】:
      INSERT INTO t1 (a,b,c) VALUES (1,2,3)
        ON DUPLICATE KEY UPDATE c=c+1;
      

      https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

      【讨论】:

      • 但是在这方面我如何比较 Agency_id 和 currency_name 是否相同?
      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多