php / mysql更新表并插入未找到匹配项的新记录

时间:2011-03-30 13:47:48

标签: php mysql sql

我想根据另一个表中的值更新表。如果不存在记录,则插入为新记录。此代码正确更新,但不会插入记录不存在的位置。

$results_google = mysql_query("upadate google set                
    Description = '".mysql_real_escape_string(trim(addslashes(strip_tags($row_first['product_description']))))."',
    Manufacturer = '".$row_first['product_vendor']."',
    Price = '".$row_first['product_price']."',                
    Title ='".$row_first['product_title']."'
    WHERE product_id = '".mysql_real_escape_string($row_first['product_id'])."';");
if(!$results_google) {      
    $google = "insert into `google`(`product_id`,`id`,`Description`,`Link`,`Manufacturer`,`Title`,
        `Price`,`Shipping_Weight`,`Image_Link`,`Brand`,`inv_id`)
        VALUES (
        '".mysql_real_escape_string($row_first['product_id'])."',
        '".mysql_real_escape_string($row_first['product_id'])."',
        '".mysql_real_escape_string(trim(strip_tags(addslashes($row_first['product_description']))))."',
        '".mysql_real_escape_string($row_first['product_link'])."',
        '".mysql_real_escape_string($row_first['product_vendor'])."',
        '".mysql_real_escape_string($row_first['product_title'])."',
        '".mysql_real_escape_string($row_first['product_price'])."',                             
        '".mysql_real_escape_string($row_first['weight'])."',
        '".mysql_real_escape_string($row_first['image_link'])."',
        '".mysql_real_escape_string($row_first['product_vendor'])."',
        '$inventory_id')";
    mysql_query ($google) or die("google".mysql_error());
}

2 个答案:

答案 0 :(得分:2)

如果您询问如何插入行或更新它(如果已存在),则需要查看ON DUPLICATE KEY UPDATEON DUPLICATE KEY UPDATE只会检查UNIQUE索引或主键,因此请确保将导致其他行的不同字段标记为唯一(或者您可以执行多列唯一索引)。

阅读documentation for INSERT ... ON DUPLICATE KEY UPDATE

答案 1 :(得分:1)

虽然@Konerak的评论确实是正确的方法,结合准备好的语句并了解你的数据(转换为ints进行整数,使用字符串函数进行字符串等),我会回答这个问题至于为什么你的代码没有按预期工作。

您正在使用带有WHERE语句的更新查询。如果未找到匹配的行,则不会更新任何行,但查询不会返回false,因为mysql_query仅在出错时返回false并且找不到要更新的行不是错误。因此,只要您的查询有效,您的if语句将始终为false。

修改:如下面的评论中所述,您可以使用mysql_affected_rows()检查是否没有更新行:

if (mysql_affected_rows() == 0)
{
  // insert a record
}

但我真的建议采用ON DUPLICATE KEY UPDATE和准备好的陈述方式。