Php 如果字段不存在,则Sql插入行

Php 如果字段不存在,则Sql插入行,php,mysql,sql,Php,Mysql,Sql,如果记录已经在mysql数据库中,我不希望插入该记录 我有一个MySQL查询,它将销售数据插入我的数据库 我运行一个脚本,收集过去一天/或一周的所有销售额 但有时我会有一个查询,其中包含相同/重复的销售信息,我不希望将该查询输入到我的数据库中,我只想跳过它 “SalesRecord”字段对于每个销售记录都是非静态的,即7343,如果我的数据库中已经存在销售记录,那么编写sql查询跳过销售记录的最简单方法是什么 这是我的sql // NOW ADD THE SALES DATA TO EBAYSA

如果记录已经在mysql数据库中,我不希望插入该记录

我有一个MySQL查询,它将销售数据插入我的数据库

我运行一个脚本,收集过去一天/或一周的所有销售额

但有时我会有一个查询,其中包含相同/重复的销售信息,我不希望将该查询输入到我的数据库中,我只想跳过它

“SalesRecord”字段对于每个销售记录都是非静态的,即7343,如果我的数据库中已经存在销售记录,那么编写sql查询跳过销售记录的最简单方法是什么

这是我的sql

// NOW ADD THE SALES DATA TO EBAYSALESLISTINGS DATABASE
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
$sql = "INSERT INTO `ebaysaleslistings`(`SalesRecord`, `OrderID`, `Order`, `AmountPaid`, `SalesTaxAmount`, `ExternalTransactionID`, ".
   "`ExternalTransactionTime`, `ExternalFeeOrCreditAmount`, `ExternalTransactionPaymentOrRefundAmount`, `ShippingServiceSelected`, `ShippingServiceCost`, `ShippedTime`, ".
   "`Name`, `Street1`, `Street2`, `CityName`, `PostalCode`, `StateOrProvince`, `CountryName`, `Phone`, `OrderLineItemID`, `EbayItemID`, ".
   "`EbayFees`, `Title`, `QuantityPurchased`, `BuyerEmail`, `TransactionID`, `TransactionPrice`, `Platform`) ".

   "VALUES ('$elm_SaleRecordID','$elm_OrderID','$elm_OrderStatus','$AmountPaid','$SalesTaxAmount','$externalTransaction->ExternalTransactionID','$externalTransaction->ExternalTransactionTime','$externalTransaction->FeeOrCreditAmount','$externalTransaction->FeeOrCreditAmount', ".
   "'$ShippingServiceSelected->ShippingService','$ShippingServiceSelected->ShippingServiceCost','$order->ShippedTime','$shippingAddress->Name','$shippingAddress->Street1','$shippingAddress->Street2','$shippingAddress->CityName','$shippingAddress->PostalCode', ".
   "'$shippingAddress->StateOrProvince','$shippingAddress->CountryName','$shippingAddress->Phone','$transaction->OrderLineItemID','$elm_EbayItemID', ".
   "'$elm_EbayFees','$elm_title','$transaction->QuantityPurchased','$elm_email','$transaction->TransactionID','$transaction->TransactionPrice','$transaction->Platform')";

echo "<br><br>" . $sql . "<br><br>";

mysql_select_db('ebaylistingmanager');
$retval = mysql_query( $sql, $conn );
//现在将销售数据添加到EBAYSALESLISTINGS数据库中
$conn=mysql\u connect($dbhost、$dbuser、$dbpass);
$sql=“插入到`ebaysaleslistings`(`SalesRecord`、`OrderID`、`Order`、`AmountPaid`、`SalesTaxAmount`、`ExternalTransactionID`、`中”。
“`ExternalTransactionTime`、`ExternalFeeOrCreditAmount`、`ExternalTransactionPaymentReturnAmount`、`ShippingServiceSelected`、`ShippingServiceCost`、`ShippingTime`、”。
“`Name`、`Street1`、`Street2`、`CityName`、`PostalCode`、`StateOrProvince`、`CountryName`、`Phone`、`OrderLineItemID`、`EbayItemID`、”。
“`EbayFees`、`Title`、`QuantityPurchased`、`BuyerEmail`、`TransactionID`、`TransactionPrice`、`Platform`”)。
“值(“$elm_SaleRecordID”、“$elm_OrderID”、“$elm_OrderStatus”、“$AmountPaid”、“$SalesTaxAmount”、“$externalTransaction->externalTransaction ID”、“$externalTransaction->externalTransaction Time”、“$externalTransaction->FeeOrCreditAmount”、“$externalTransaction->FeeOrCreditAmount”、”。”。
“‘$ShippingServiceSelected->ShippingService’,‘$ShippingServiceSelected->ShippingServiceCost’,‘$order->ShippingTime’,‘$shippingAddress->Name’,‘$shippingAddress->Street1’,‘$shippingAddress->Street2’,‘$shippingAddress->CityName’,‘$shippingAddress->PostalCode’,”。
“'$shippingAddress->StateOrProvince'、'$shippingAddress->CountryName'、'$shippingAddress->Phone'、'$transaction->OrderLineItemID'、'$elm_EbayItemID'、”。
“%$elm_EbayFees'、%$elm_title'、%$transaction->QUENTITYPURCHASED'、%$elm_email'、'$transaction->TransactionID'、'$transaction->TransactionPrice'、'$transaction->平台'”;
回声“

”$sql。“

”; mysql_select_db('ebaylistingmanager'); $retval=mysql\u查询($sql,$conn);
如果您的列
SalesRecord
设置为唯一,则您将收到一个插入错误。如果不是,请更改表并使列唯一。然后简单地使用以下语法:

$sql = "INSERT IGNORE INTO `ebaysaleslistings` ......";
注意
插入
后的
忽略
。这将使MySQL忽略任何错误


请切换到
PDO
mysqli.*
方法
mysql.*
方法已被弃用。

我不会使用Insert ignore选项,因为这将忽略其他错误

最有效的方法是,假设当你说该字段唯一时,你的意思是数据库实际上有一个唯一的密钥设置,正确的方法是使用PDO,忽略重复密钥错误引发的异常,比如代码23000,或者我必须查找它

$PDO = new \PDO(
    "mysql:host=$dbHost;dbname=$dbName",
    $dbUser,
    $dbPass
);
//set pdo error mode to throw exceptions.  So we can in turn catch them :)
$this->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

try{
   //obviously use your query here.
   $stmt = $PDO->prepare( '
      INSERT INTO
           table
      ( field1, field2 ) VALUES ( :value1, :value2 )
  ');
    $stmt->execute( array( ':value1'=>1, ':value2' => 2) );

}catch( PDOException $e ){
    if( $e->getCode() != 23000 ){
       //if not code 23000 die with error message output - 23000 is duplicate key
       die( "<pre>($e->getMessage()}\n\n{$e->getTraceAsString()}");
    }
}
$PDO=new\PDO(
“mysql:host=$dbHost;dbname=$dbname”,
$dbUser,
$dbPass
);
//将pdo错误模式设置为引发异常。所以我们可以反过来抓住他们:)
$this->setAttribute(\PDO::ATTR\u ERRMODE,\PDO::ERRMODE\u异常);
试一试{
//显然,在这里使用您的查询。
$stmt=$PDO->准备
插入
桌子
(字段1,字段2)值(:value1,:value2)
');
$stmt->execute(数组(':value1'=>1',:value2'=>2));
}捕获(PDO$e){
如果($e->getCode()!=23000){
//如果不是代码23000,则输出错误消息-23000是重复键
死(($e->getMessage()}\n\n{$e->getraceAssString()});
}
}
这有点出乎我的意料,但它应该为您指出正确的方向。当然,更好的解决方案是通过不插入重复数据来避免所有问题。但我需要更多关于如何获得重复数据的详细信息,以真正解决这一问题

进一步阅读

除了防止SQL注入之外,使用PDO的另一个好处是在循环中使用prepare和execute。这一点不应低估,因为与单独使用mysql相比,您可以更高效、更干净地多次运行PDO

$stmt=$PDO->prepare('
插入
桌子
(字段1,字段2)值(:value1,:value2)
');
foreach($输入为$值){
试一试{
$stmt->execute($value);
}捕获(PDO$e){
如果($e->getCode()!=23000){
//如果不是代码23000,则输出错误消息-23000是重复键
死(($e->getMessage()}\n\n{$e->getraceAssString()});
}
}
}

这样,您就不会在输入的每个循环上重新生成查询。但是,您希望
try-catch
块正好位于查询的实际执行附近,否则它会“踢”如果你想用一个复制的唯一密钥插入,你就应该得到一个错误。为了避免使用<代码>忽略< /代码>。如果你的表没有设置为销售记录作为唯一的密钥,那么你需要这样做。你可能的复制品也应该高度考虑切换到myqLy* *或者使用PDO。mys。ql_u*已被弃用,并存在严重的安全风险
      $stmt = $PDO->prepare( '
         INSERT INTO
           table
         ( field1, field2 ) VALUES ( :value1, :value2 )
     ');

      foreach( $inputs as $values ){
         try{
              $stmt->execute( $values );
         }catch( PDOException $e ){
              if( $e->getCode() != 23000 ){
              //if not code 23000 die with error message output - 23000 is duplicate key
                  die( "<pre>($e->getMessage()}\n\n{$e->getTraceAsString()}");
              }
          }
      }