如果记录已存在,请检查mysql表

时间:2012-06-14 15:32:36

标签: php mysql

我正在使用以下内容将公司数据插入到mysql表中。是否可以在尝试再次输入公司之前检查公司是否已经在数据库中? php变量$company是我要检查的内容。

   <?php
    require("database.php");
    // Opens a connection to a MySQL server
    $con = mysql_connect("localhost", $username, $password);

    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }

    mysql_select_db("medicom_wp", $con);

    $pages = get_posts(array(
        'orderby' => 'title', 
        'post_type' => 'members',
        'numberposts' => 300,
        'post_status' => 'any'  
        ));
        foreach($pages as $post) {
        setup_postdata($post);

        $company = get_field('company_name');
        $address = get_field('address');
        $city = get_field('city');
        $post_code = get_field('post_code');

        mysql_query("INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('".$company."', '".$address.", ".$city.", ".$post_code."', '0.0', '0.0', '')");
        }
        wp_reset_query();

    mysql_close($con);
    ?>

3 个答案:

答案 0 :(得分:1)

  1. 在执行插入

  2. 之前,执行select语句以查看它们是否在那里
  3. (不推荐)制作名称字段(或任何其他识别公司的字段,一个唯一的密钥,因此当您再次尝试输入时,它将被拒绝

答案 1 :(得分:1)

尝试以下方法。基本上,发送另一个查询来检查具有相同公司名称的重复行,如果查询返回0行,则只运行insert命令。

<?php
require("database.php");
// Opens a connection to a MySQL server
$con = mysql_connect("localhost", $username, $password);

if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("medicom_wp", $con);

$pages = get_posts(array(
    'orderby' => 'title', 
    'post_type' => 'members',
    'numberposts' => 300,
    'post_status' => 'any'  
    ));
foreach($pages as $post) {
    setup_postdata($post);

    $company = get_field('company_name');
    $address = get_field('address');
    $city = get_field('city');
    $post_code = get_field('post_code');

    // prepare query to check for duplicate company
    $sql = sprintf("select count('x') as cnt from markers where `name` = '%s'", mysql_real_escape_string($company));
    // run query
    $row_dup = mysql_fetch_assoc(mysql_query($sql,$conn));
    // if no row exist
    if ($row_dup['cnt'] == 0) {
        // insert new company
        // consider preparing this query using sprintf() and mysql_real_escape_string() as above
        mysql_query("INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('".$company."', '".$address.", ".$city.", ".$post_code."', '0.0', '0.0', '')");
    }
}
wp_reset_query();

mysql_close($con);
?>

答案 2 :(得分:0)

自然解决方案是先运行另一个查询(例如select count())来检查标记是否存在,并从那里分支条件逻辑。

更有趣的解决方案是使用 UPSERT (更新+插入)的概念。如果行不存在,则插入该行,如果存在则更新它。因此,无论如何,最终只会有一行,但这是假设您不介意覆盖数据。 Here's a sample SO question about that.

另一种技术涉及创建主键列并利用mysql的完整性检查来强制每条记录保留1行。因此,每个主键的第一个插入将成功,但所有其他插入都将失败。