0

我有一个表单,用户应该输入数据(名称,街道名称,街道编号),然后我想检查该数据是否存在于表中(名称,街道名称 + 街道编号),所以我可以使用该行而不是创建一个新的一。有没有一种简单的方法可以做到这一点,还是我必须将数据提取到一个数组中并以某种方式搜索?

我有这个代码:

$sql = "INSERT INTO 725G54_proj_address VALUES           (NULL,'$streetname','$streetnumber')";
$result1 = mysql_query($sql,$con);
$address=mysql_insert_id();
echo "ID of last inserted record is: " . $address;
echo "<br>";


$sql = "INSERT INTO 725G54_proj_contact VALUES ('Null','$name','$telephonenumber')";
$result2 = mysql_query($sql,$con);
$contact = mysql_insert_id();
echo "ID of last inserted record is: " . $contact;


$sql = "INSERT INTO 725G54_proj_LivesAt VALUES ('$contact','$address')";
$result3 = mysql_query($sql,$con);`enter code here`

我想要的是找出示例 Mainstreet 31 是否已经存在于 proj_address 中,如果存在,则使用其自动递增的 id 插入 proj_Lives_at。

编辑:我决定发送查询以检查数据是否存在。我将它加载到一个变量中并检查它是否为空,但是有一些问题使得“if(empty)”不能正常工作。然而,反过来 ("if(!empty)") 也可以。

查询和加载如下所示:

$sql2="SELECT 725G54_proj_address.Address_ID, GROUP_CONCAT( cast( concat( 725G54_proj_address.Street_Name, ' ', 725G54_proj_address.Street_Number ) AS char ) SEPARATOR ', ') AS addresses
    FROM 725G54_proj_address
    WHERE 725G54_proj_address.Street_Name = '$streetname' AND 725G54_proj_address.Street_Number= '$streetnumber'
    GROUP BY 725G54_proj_address.Address_ID
    ORDER BY 725G54_proj_address.Address_ID ASC";
$result2=mysql_query($sql2);

编辑 2:我尝试切换到使用 count() 而不是 empty() 并且它发现变量已填充,即使它不应该。

4

2 回答 2

0

听起来您正在(可能)创建多对一关系,因此应该将该数据存储在单独的查找表中。在这种情况下,我建议首先尝试使用“INSERT IGNORE”语句(http://dev.mysql.com/doc/refman/5.5/en/insert.html)插入该行,然后使用 mysql_affected_rows()看看它是否做出了改变。如果没有,那么您知道有一个重复的行,您可以选择它,获取其 ID,然后您就完成了。

正如有人在上述评论之一中提到的那样,您可以将其作为存储过程。

于 2013-05-31T17:35:25.243 回答
0

假设您已经在表上创建了正确的键(即,跨 (name、streetname、streetnumber) 或类似的唯一键),那么 MySQLINSERT...ON DUPLICATE KEY UPDATE或可能REPLACE INTO在这里可能有用。前者会将您的INSERT语句转换为UPDATE如果要插入的键已经存在于表中,而后者将作为常规操作INSERT,除非该键已经存在,在这种情况下,它会在获取新数据DELETE之前首先处理现有行。INSERT

当然,这并不是一个繁重的负担SELECT COUNT(*) AS n_existing FROM table WHERE...,然后n_existing在结果集中检查是否已经存在与您准备的相同键的行INSERT,并且可以从最小惊讶原则进行论证最好使用SELECTbefore INSERT,而不是使用其他任何将要维护您的代码的人以前可能没有遇到过的深奥的 SQL 语句。尽管如此,如果您愿意,该选项仍然存在。

于 2013-05-31T17:35:59.030 回答