我有一个表单,用户应该输入数据(名称,街道名称,街道号码),然后我想检查表格中是否存在该数据(名称,街道名称+街道号码),这样我就可以使用该行代替做一个新的。 有没有一种简单的方法可以做到这一点,还是我必须将数据提取到数组中并以某种方式进行搜索?
我有这段代码:
$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(),它发现变量已经填充,即使它不应该。
答案 0 :(得分:0)
听起来您正在创建多对一关系(可能),因此应该将该数据存储在单独的查找表中。在这种情况下,我建议首先尝试使用“INSERT IGNORE”语句插入该行 (http://dev.mysql.com/doc/refman/5.5/en/insert.html)然后使用mysql_affected_rows()来查看它是否发生了变化。如果没有,那么你知道有一个重复的行,你可以选择,取ID,然后你就完成了。
正如上面其中一条评论中提到的那样,你可以把它变成一个存储过程。
答案 1 :(得分:0)
假设您已经在桌面上创建了正确的键(即,名称,街道名称,街道号码或类似内容中的唯一键),那么MySQL INSERT...ON DUPLICATE KEY UPDATE
或可能REPLACE INTO
可能在这里很有用。如果要插入的密钥已经存在于表中,前者会将INSERT
语句转换为UPDATE
,后者将作为常规INSERT
,除非密钥已存在,其中在DELETE
新数据之前,它将首先INSERT
现有行。
当然,对于SELECT COUNT(*) AS n_existing FROM table WHERE...
而言,这并不是一个繁重的负担,然后检查结果集中的n_existing
以查看是否已存在与您正在准备的相同密钥的行{{1} 1}},并且从principle of least astonishment开始论证INSERT
之前SELECT
比使用之前可能没有遇到的深奥SQL语句更好由任何其他人来维护你的代码。如果您愿意,该选项仍然存在。