如何根据使用mysql和php输入的值插入重复值
我试着在我的标题上总结一下,但让我在下面更详细地向你们解释我正在努力实现的目标 目前,我向查询传递了一个数组,并使用foreach将每个数组插入到我的数据库中,如下所示如何根据使用mysql和php输入的值插入重复值,php,mysql,Php,Mysql,我试着在我的标题上总结一下,但让我在下面更详细地向你们解释我正在努力实现的目标 目前,我向查询传递了一个数组,并使用foreach将每个数组插入到我的数据库中,如下所示 if(is_array($myArr)){ foreach($myArr as $userID=> $email){ $sql = "INSERT INTO userdata (userID, email) values ('$userID', '$email')"; mysql_query($sql) or e
if(is_array($myArr)){
foreach($myArr as $userID=> $email){
$sql = "INSERT INTO userdata (userID, email) values ('$userID', '$email')";
mysql_query($sql) or exit(mysql_error());
}
}
当前我的数组如下所示
Array
(
[39] => sessa@test.com
[54] => sessa@test.com
[55] => sessa@test.com
[56] => sessa@test.com
[57] => mark@foo.com
[58] => mark@foo.com
[59] => mark@foo.com
[60] => mark@foo.com
[61] => sam@bar.com
[62] => sam@bar.com
[63] => sam@bar.com
[64] => sam@bar.com
)
“$userID”是[39],而“email”是..well电子邮件
这就是我的问题所在
我想要实现的是在一个新的列中插入一个新的id,我在这个“url”列中调用了“url”,我希望能够以1递增,并将相同的值添加到具有相同电子邮件的行中
像这样
UserID | email | url
===============================
39 | sessa@test.com | 1
54 | sessa@test.com | 1
55 | sessa@test.com | 1
56 | sessa@test.com | 1
57 | mark@foo.com | 2
58 | mark@foo.com | 2
59 | mark@foo.com | 2
60 | mark@foo.com | 2
61 | sam@bar.com | 3
62 | sam@bar.com | 3
63 | sam@bar.com | 3
64 | sam@bar.com | 3
我希望这是有意义的。谢谢你的阅读。永远感谢你的帮助
if(is_array($myArr)) :
foreach($myArr as $userID=> $email){
$emails[] = $email;
}
$emails = array_unique($emails);
foreach($emails as $e){
$counter = 0;
foreach($myArr as $userID=> $email){
if($email == $e){
$sql = "INSERT INTO userdata (userID, email,url) values ('$userID', '$email','$counter')";
$counter++;
}
}
}
endif;
您可以使用此命令为所有insert创建一条SQL语句
if(is_array($myArr)) :
foreach($myArr as $userID=> $email){
$emails[] = $email;
}
$emails = array_unique($emails);
$sql = '';
$counter = 1;
foreach($emails as $e){
foreach($myArr as $userID=> $email){
if($email == $e){
$sql .= "INSERT INTO userdata (userID, email,url) values ('$userID', '$email','$counter');";
}
}
$counter++;
}
endif;
mysql_query($sql) or exit(mysql_error());
SQL输出
INSERT INTO userdata (userID, email,url) values ('39', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('54', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('55', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('56', 'sessa@test.com','1');INSERT INTO userdata (userID, email,url) values ('57', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('58', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('59', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('60', 'mark@foo.com','2');INSERT INTO userdata (userID, email,url) values ('61', 'sam@bar.com','3');INSERT INTO userdata (userID, email,url) values ('62', 'sam@bar.com','3');INSERT INTO userdata (userID, email,url) values ('63', 'sam@bar.com','3');INSERT INTO userdata (userID, email,url) values ('64', 'sam@bar.com','3');
我会用重复的钥匙 确保您在电子邮件上有唯一的索引
if(is_array($myArr)){
foreach($myArr as $userID=> $email){
$sql = "INSERT INTO userdata (userID, email) values ('$userID', '$email')
ON DUPLICATE KEY UPDATE url=url+1";
mysql_query($sql) or exit(mysql_error());
}
}
编辑:
好的,这可能是解决方案:
$data = array();
$ids = 1;
if(is_array($myArr)){
foreach($myArr as $userID=> $email){
$domain = substr(strstr($email,"@"),1);
if (! isset($data[$domain]))
{
$data[$domain] = $ids;
$ids ++;
}
$sql = "INSERT INTO userdata (userID, email,url)
VALUES ('$userID', '$email','".$data[$domain]."')";
mysql_query($sql) or exit(mysql_error());
}
}
如果您有足够的内存,您可以再创建一个阵列数据结构并存储电子邮件和ID 例如,您可以在For循环中执行类似的操作
$data = array();
$i = 0;
if(is_array($myArr)){
foreach($myArr as $userID=> $email){
$url_id = '';
if (! isset($data[$email]))
{
$data[$email] = ++$i;
}
$url_id = $data[$email];
$sql = "INSERT INTO userdata (userID, email,url) values ('$userID', '$email','$url_id')";
mysql_query($sql) or exit(mysql_error());
}
}
我认为这不是最有效的解决办法。。但是它应该可以工作。您可以通过一个查询来组织它
if(is_array($myArr)){
foreach($myArr as $userID=> $email){
$sql = "INSERT INTO `userdata` (`userID`, `email`, `url`)
select '$userID', '$email', count(`email`) +1 from `userdata` where `email` = '$email'";
mysql_query($sql) or exit(mysql_error());
}
}
这听起来像是需要一个带有
id,email
(其中id包含autoincrement列)的表,以及一个带有userId,url
?@Wrikken嗨,Wrikken我已经简化了这个问题的表。感谢您的输入:)这并不意味着它仍然闻不到某种正常化可能是健康的,但嘿,您比我更能判断是否需要它;)这太神奇了。。但他希望在收到一封新邮件后获得+的回复。这不是每个电子邮件的增量url吗?所以发邮件1-1234然后发邮件21234@John您好,John,您的第二个解决方案似乎是使用同一封电子邮件增加url id。@BaconJuice我更新了我的答案。我不明白这个问题。您想要电子邮件地址中每个域名的ID吗?我的代码现在应该可以工作了。@John不,它不是特定于域的。我已经在上面的问题中做了概述。实际上,使用mysql\u query()
Yes,一次只能运行一个查询。这是我的第二个解决方案。。最好的。。为什么你可以创建一个查询,却要多次点击数据库;从手动mysql\u query()向服务器上与指定链接\u标识符关联的当前活动数据库发送唯一查询(不支持多个查询)
wellmysql\u query
是一种访问数据库的旧方法,为什么他不使用PDO?这就是问题所在