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

时间:2016-12-13 11:54:21

标签: 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"},
{"type":"Outgoing","duration":"0","number":"XXXXXXXX","date":"Tue Dec 13 13:49:50 GMT+05:30 2016"}]';

这是我的帖子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);
}
?>

1 个答案:

答案 0 :(得分:2)

创建UNIQUE INDEX

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

ALTER TABLE users ADD UNIQUE KEY all_columns(number,type,date,duration)

我将所有四列添加到唯一索引中,因为您似乎希望任何列都具有独立的重复值。请确认这是否正确,或在创建索引时选择相应的列。

只需您的代码

使用唯一的密钥,您不需要SELECT

$data = json_decode($json,true);
if(is_array($data))
{
       $sql = "INSERT IGNORE INTO users (type, duration, number,date) values ";
       ....
}

使用准备好的陈述

而不是当前正在进行的大型字符串连接以及对mysqli_real_escape的多次调用,您最好使用预准备语句。您甚至可能会略微提升性能。但更重要的是,字符串的最大大小可以传递给服务器,如果你得到一个大型数组,你可能会超越它。

相关问题