【问题标题】:MySQL query - if not exists - insert into - else - updateMySQL查询-如果不存在-插入-否则-更新
【发布时间】:2014-08-19 09:33:57
【问题描述】:

我通过表单做了一个简单的文档生成器,这个表单将所有内容保存到mysql数据库,效果很好,但是当有人输入相同的'nrumowy'时,它会在mysql中创建一个新行,'nrumowy'是唯一的,所以当有人添加具有相同“nrumowy”的表单时,我只想更新 mysql 中的现有数据,我有该代码:

$con=mysqli_connect("localhost","login","pass","database");
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// escape variables for security
$numerklienta = mysqli_real_escape_string($con, $_POST['numerklienta']);
$name = mysqli_real_escape_string($con, $_POST['name']);
$hours = mysqli_real_escape_string($con, $_POST['hours']);
$date = mysqli_real_escape_string($con, $_POST['date']);
$beginDate = mysqli_real_escape_string($con, $_POST['beginDate']);
$nrdomu = mysqli_real_escape_string($con, $_POST['nrdomu']);
$telefon = mysqli_real_escape_string($con, $_POST['telefon']);
$fax = mysqli_real_escape_string($con, $_POST['fax']);
$nip = mysqli_real_escape_string($con, $_POST['nip']);
$email = mysqli_real_escape_string($con, $_POST['email']);
$stronawww = mysqli_real_escape_string($con, $_POST['stronawww']);
$branza = mysqli_real_escape_string($con, $_POST['branza']);
$vatkodpocztowy = mysqli_real_escape_string($con, $_POST['vatkodpocztowy']);
$vatmiejscowosc = mysqli_real_escape_string($con, $_POST['vatmiejscowosc']);
$vatulica = mysqli_real_escape_string($con, $_POST['vatulica']);
$vatnrdomu = mysqli_real_escape_string($con, $_POST['vatnrdomu']);
$vatemail = mysqli_real_escape_string($con, $_POST['vatemail']);
$vatosoba = mysqli_real_escape_string($con, $_POST['vatosoba']);
$datapublikacji = mysqli_real_escape_string($con, $_POST['datapublikacji']);
$rabat = mysqli_real_escape_string($con, $_POST['rabat']);
$wartoscnetto = mysqli_real_escape_string($con, $_POST['wartoscnetto']);
$typreklamy = mysqli_real_escape_string($con, $_POST['typreklamy']);
$inne = mysqli_real_escape_string($con, $_POST['inne']);
$inne2 = mysqli_real_escape_string($con, $_POST['inne2']);
$inne3 = mysqli_real_escape_string($con, $_POST['inne3']);
$zaliczka = mysqli_real_escape_string($con, $_POST['zaliczka']);
$liczbarat1 = mysqli_real_escape_string($con, $_POST['liczbarat1']);
$zaakceptowaneprzez = mysqli_real_escape_string($con, $_POST['zaakceptowaneprzez']);
$telzam = mysqli_real_escape_string($con, $_POST['telzam']);
$datapodpis = mysqli_real_escape_string($con, $_POST['datapodpis']);
$nrumowy = mysqli_real_escape_string($con, $_POST['nrumowy']);

$sql="IF
NOT EXISTS ( SELECT * FROM zam WHERE nrumowy = '$nrumowy' )

THEN

INSERT INTO zam (numerklienta, name, hours, date, beginDate, nrdomu, telefon, fax, nip, email, stronawww, branza, vatkodpocztowy, vatmiejscowosc, vatulica, vatnrdomu, vatemail, vatosoba, datapublikacji, rabat, wartoscnetto, typreklamy, inne, inne2, inne3, zaliczka, liczbarat1, zaakceptowaneprzez, telzam, datapodpis, nrumowy)
VALUES ('$numerklienta', '$name', '$hours', '$date', '$beginDate', '$nrdomu', '$telefon', '$fax', '$nip', '$email', '$stronawww', '$branza', '$vatkodpocztowy', '$vatmiejscowosc', '$vatulica', '$vatnrdomu', '$vatemail', '$vatosoba', '$datapublikacji', '$rabat', '$wartoscnetto', '$typreklamy', '$inne', '$inne2', '$inne3', '$zaliczka', '$liczbarat1', '$zaakceptowaneprzez', '$telzam', '$datapodpis', '$nrumowy' )

ELSE

UPDATE zam SET name = '$name', numerklienta = '$numerklienta', hours = '$hours', date = '$date', beginDate = '$beginDate', nrdomu = '$nrdomu', telefon = '$telefon', fax = '$fax', nip = '$nip', email = '$email', stronawww = '$stronawww', branza = '$branza', vatkodpocztowy = '$vatkodpocztowy', vatmiejscowosc = '$vatmiejscowosc', vatulica = '$vatulica', vatnrdomu = '$vatnrdomu', vatemail = '$vatemail', vatosoba = '$vatosoba', datapublikacji = '$datapublikacji', rabat = '$rabat', wartoscnetto = '$wartoscnetto', typreklamy = '$typreklamy', inne = '$inne', inne2 = '$inne2', inne3 = '$inne3', zaliczka = '$zaliczka', liczbarat1 = '$liczbarat1', zaakceptowaneprzez = '$zaakceptowaneprzez', telzam = '$telzam', datapodpis = '$datapodpis' WHERE nrumowy ='$nrumowy'

END IF";

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}


mysqli_close($con);

这个没有“select.....”和“else update”的查询只是一个“插入”效果很好,当我把这个“插入”更改为“更新”但我不知道怎么做时这个变量如果不存在 - 插入 - 否则更新

【问题讨论】:

  • 是什么让您认为您可以在if..else 构造中嵌入SQL 语句?我认为您只能在 stored procedure 中做到这一点。

标签: php mysql sql


【解决方案1】:

您可以在 MySQL 上使用两个选项。

  1. 使用'REPLACE'。这里的问题是,如果你记录有 外键那么你就麻烦了described here
  2. 使用INSERT ... ON DUPLICATE KEY UPDATE。它的用法是well described in this article

我更喜欢 2),所以在您的情况下,您需要执行以下操作:

  1. 制作“nrumowy”主键或唯一索引
  2. 将 SQL 更新为如下内容:

(缩短版)

INSERT INTO zam
            (numerklienta,
             name,
/* put rest of the fields here */
             nrumowy)
VALUES ('$numerklienta',
             '$name',
/* put rest of the fields here */
             '$nrumowy' )
ON DUPLICATE KEY UPDATE
  numerklienta = values(numerklienta),
  name = value(name)
/* put rest of the fields here */
  ;     

PS:一般来说,我建议您停止在代码中使用原始 SQL。使用 PDO 函数,例如“PDO::prepare”和“PDOStatement::bindValue”。你可以在 PHP 文档中看到好的 examples

【讨论】:

  • 我使用了“ON DUPLICATE KEY UPDATE”并将“nrumowy”设置为主要和唯一,这就是我想要的,非常感谢。
【解决方案2】:

您绝对应该阅读REPLACE INTO

【讨论】:

    【解决方案3】:

    你可以从表中检查 nrumowy

    $check = "SELECT nrumowy FROM zam WHERE nrumowy = '$nrumowy'";
    $check = mysql_query($check);
    $check = mysql_fetch_array($check);
    $check = $check['nrumowy'];
    
    if (empty($check))
            {
                insert
            }
    else
            {
                update
            }
    

    【讨论】:

      【解决方案4】:

      iatboy,这应该是这样的吗?因为这对我不起作用(空白页面),我是 mysql 和 php 的新手,这只是最简单的工作形式,不会在公共页面上使用。

      <?php
      $con=mysqli_connect("localhost","login","pass","db");
      // Check connection
      if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
      }
      
      // escape variables for security
      $numerklienta = mysqli_real_escape_string($con, $_POST['numerklienta']);
      $name = mysqli_real_escape_string($con, $_POST['name']);
      $hours = mysqli_real_escape_string($con, $_POST['hours']);
      $date = mysqli_real_escape_string($con, $_POST['date']);
      $beginDate = mysqli_real_escape_string($con, $_POST['beginDate']);
      $nrdomu = mysqli_real_escape_string($con, $_POST['nrdomu']);
      $telefon = mysqli_real_escape_string($con, $_POST['telefon']);
      $fax = mysqli_real_escape_string($con, $_POST['fax']);
      $nip = mysqli_real_escape_string($con, $_POST['nip']);
      $email = mysqli_real_escape_string($con, $_POST['email']);
      $stronawww = mysqli_real_escape_string($con, $_POST['stronawww']);
      $branza = mysqli_real_escape_string($con, $_POST['branza']);
      $vatkodpocztowy = mysqli_real_escape_string($con, $_POST['vatkodpocztowy']);
      $vatmiejscowosc = mysqli_real_escape_string($con, $_POST['vatmiejscowosc']);
      $vatulica = mysqli_real_escape_string($con, $_POST['vatulica']);
      $vatnrdomu = mysqli_real_escape_string($con, $_POST['vatnrdomu']);
      $vatemail = mysqli_real_escape_string($con, $_POST['vatemail']);
      $vatosoba = mysqli_real_escape_string($con, $_POST['vatosoba']);
      $datapublikacji = mysqli_real_escape_string($con, $_POST['datapublikacji']);
      $rabat = mysqli_real_escape_string($con, $_POST['rabat']);
      $wartoscnetto = mysqli_real_escape_string($con, $_POST['wartoscnetto']);
      $typreklamy = mysqli_real_escape_string($con, $_POST['typreklamy']);
      $inne = mysqli_real_escape_string($con, $_POST['inne']);
      $inne2 = mysqli_real_escape_string($con, $_POST['inne2']);
      $inne3 = mysqli_real_escape_string($con, $_POST['inne3']);
      $zaliczka = mysqli_real_escape_string($con, $_POST['zaliczka']);
      $liczbarat1 = mysqli_real_escape_string($con, $_POST['liczbarat1']);
      $zaakceptowaneprzez = mysqli_real_escape_string($con, $_POST['zaakceptowaneprzez']);
      $telzam = mysqli_real_escape_string($con, $_POST['telzam']);
      $datapodpis = mysqli_real_escape_string($con, $_POST['datapodpis']);
      $nrumowy = mysqli_real_escape_string($con, $_POST['nrumowy']);
      
      
      
      $result = mysql_query(SELECT nrumowy FROM zam WHERE nrumowy = '$nrumowy' limit 1);
      if (empty(mysql_fetch_array($result)))
      {
          mysql_query(INSERT INTO zam (numerklienta, name, hours, date, beginDate, nrdomu, telefon, fax, nip, email, stronawww, branza, vatkodpocztowy, vatmiejscowosc, vatulica, vatnrdomu, vatemail, vatosoba, datapublikacji, rabat, wartoscnetto, typreklamy, inne, inne2, inne3, zaliczka, liczbarat1, zaakceptowaneprzez, telzam, datapodpis, nrumowy)
      VALUES ('$numerklienta', '$name', '$hours', '$date', '$beginDate', '$nrdomu', '$telefon', '$fax', '$nip', '$email', '$stronawww', '$branza', '$vatkodpocztowy', '$vatmiejscowosc', '$vatulica', '$vatnrdomu', '$vatemail', '$vatosoba', '$datapublikacji', '$rabat', '$wartoscnetto', '$typreklamy', '$inne', '$inne2', '$inne3', '$zaliczka', '$liczbarat1', '$zaakceptowaneprzez', '$telzam', '$datapodpis', '$nrumowy' ));
      }
      else
      {
          mysql_query(UPDATE zam SET name = '$name', numerklienta = '$numerklienta', hours = '$hours', date = '$date', beginDate = '$beginDate', nrdomu = '$nrdomu', telefon = '$telefon', fax = '$fax', nip = '$nip', email = '$email', stronawww = '$stronawww', branza = '$branza', vatkodpocztowy = '$vatkodpocztowy', vatmiejscowosc = '$vatmiejscowosc', vatulica = '$vatulica', vatnrdomu = '$vatnrdomu', vatemail = '$vatemail', vatosoba = '$vatosoba', datapublikacji = '$datapublikacji', rabat = '$rabat', wartoscnetto = '$wartoscnetto', typreklamy = '$typreklamy', inne = '$inne', inne2 = '$inne2', inne3 = '$inne3', zaliczka = '$zaliczka', liczbarat1 = '$liczbarat1', zaakceptowaneprzez = '$zaakceptowaneprzez', telzam = '$telzam', datapodpis = '$datapodpis' WHERE nrumowy ='$nrumowy');
      }
      
      if (!mysqli_query($con,$result)) {
        die('Error: ' . mysqli_error($con));
      }
      
      
      mysqli_close($con);
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多