Php 从数组中输入数据时,如何防止mysql中重复输入?

Php 从数组中输入数据时,如何防止mysql中重复输入?,php,android,mysql,arrays,json,Php,Android,Mysql,Arrays,Json,我是android开发的新手,我正在通过android应用程序发送一个json数组,并将该数据插入MySQL数据库。问题是,每当我插入userJSON时,每次都会输入重复的条目。所以,我想防止mysql中的重复条目,如何使用php实现这一点。请帮我解决这个问题 android端的json字符串 '[{"type":"Outgoing","duration":"0","number":"XXXXXXXX","date":"Tue Dec 13 15:26:29 GMT+05:30 2016"},

我是android开发的新手,我正在通过android应用程序发送一个json数组,并将该数据插入MySQL数据库。问题是,每当我插入userJSON时,每次都会输入重复的条目。所以,我想防止mysql中的重复条目,如何使用php实现这一点。请帮我解决这个问题

android端的json字符串

'[{"type":"Outgoing","duration":"0","number":"XXXXXXXX","date":"Tue Dec 13 15:26:29 GMT+05:30 2016"},
{"type":"Outgoing","duration":"0","number":"XXXXXXXX","date":"Tue Dec 13 13:49:50 GMT+05:30 2016"}]';
这是我的用于post json的php文件:

<?php  
require_once('conn.php');
if($_SERVER['REQUEST_METHOD']=='POST')
{
 $json = $_POST["usersJSON"]; 
 echo $json;
 if (get_magic_quotes_gpc())
 {
    $json = stripslashes($json);
 }
 $data = json_decode($json,true);

 $query=mysqli_query($con,"SELECT * 
                          FROM users
                          where number = '$number' 
                            and type = '$type' 
                            and date = '$date' 
                            and duration= '$duration'");

if(mysqli_num_rows($query)>0) {
    echo "already exist";
}
elseif(is_array($data))
 {
       $sql = "INSERT IGNORE INTO users (type, duration, number,date) values ";

       $valuesArr = array();

 foreach($data as $row)
 {
    $type = mysqli_real_escape_string( $con,$row['type'] );
    $duration = mysqli_real_escape_string($con, $row['duration'] );
    $number = mysqli_real_escape_string( $con,$row['number'] );
$date = mysqli_real_escape_string( $con,$row['date'] );

    $valuesArr[] = "('$type', '$duration', '$number', '$date')";


}

$sql .= implode(',', $valuesArr);
if(mysqli_query($con,$sql))
{
     echo 'Entry Added Successfully';
}
else
{
     echo 'Could Not Add Entry';
}
}
//Closing the database 
 mysqli_close($con);
}
?>
创建唯一索引
无论您使用何种编程语言,对数据的所有约束都必须在数据库中强制执行,而不是在应用程序层中强制执行。最简单的方法是在相关列上添加一个唯一键

ALTER TABLE users ADD UNIQUE KEY all_columns(number,type,date,duration)
我将所有四列添加到唯一索引中,因为您似乎希望任何列都具有独立的重复值。请确认这是否正确,或者在创建索引时选择适当的列

只需输入您的代码 有了唯一的钥匙,您就不需要选择了

$data = json_decode($json,true);
if(is_array($data))
{
       $sql = "INSERT IGNORE INTO users (type, duration, number,date) values ";
       ....
}
使用事先准备好的陈述 您最好使用预先准备好的语句,而不是像当前那样进行巨大的字符串连接和对
mysqli\u real\u escape
的多重调用。您甚至可能会在性能上得到微小的提高。然而,更重要的是,可以传递到服务器的字符串有一个最大大小,如果您得到一个大数组,您可能会超出这个最大大小。

创建一个唯一的索引 无论您使用何种编程语言,对数据的所有约束都必须在数据库中强制执行,而不是在应用程序层中强制执行。最简单的方法是在相关列上添加一个唯一键

ALTER TABLE users ADD UNIQUE KEY all_columns(number,type,date,duration)
我将所有四列添加到唯一索引中,因为您似乎希望任何列都具有独立的重复值。请确认这是否正确,或者在创建索引时选择适当的列

只需输入您的代码 有了唯一的钥匙,您就不需要选择了

$data = json_decode($json,true);
if(is_array($data))
{
       $sql = "INSERT IGNORE INTO users (type, duration, number,date) values ";
       ....
}
使用事先准备好的陈述
您最好使用预先准备好的语句,而不是像当前那样进行巨大的字符串连接和对
mysqli\u real\u escape
的多重调用。您甚至可能会在性能上得到微小的提高。然而,更重要的是,可以传递到服务器的字符串有一个最大大小,如果你得到一个大数组,你可能会超过这个大小。

使用PHP肯定不行,您可以通过在database@e4c5你能解释一下我怎样才能给出唯一的索引或提供一个link@Blueblazer172我只是想停止重复数据库条目,我如何才能做到这一点呢?耶,我想从php端@Blueblazer172获得这一点,但在php端你无法可靠地做到这一点。如果脚本的两个实例同时插入相同的数据,那么无论您做什么,都将有一个副本。这叫做比赛条件。要实现任何程度的可靠性,唯一的方法就是在数据库表上强制执行唯一的约束,您可以通过在database@e4c5你能解释一下我怎样才能给出唯一的索引或提供一个link@Blueblazer172我只是想停止重复数据库条目,我如何才能做到这一点呢?耶,我想从php端@Blueblazer172获得这一点,但在php端你无法可靠地做到这一点。如果脚本的两个实例同时插入相同的数据,那么无论您做什么,都将有一个副本。这叫做比赛条件。对于任何程度的可靠性,唯一的方法就是在数据库表上强制一个唯一的约束。