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

标签 php android mysql arrays json

我是android开发新手,我通过android应用程序发送一个json数组并将该数据插入MySQL数据库。问题是,每当我插入 userJSON 时,它每次都会输入重复的条目。所以,我想防止 mysql 中的重复条目,这怎么可能用 php.ini 实现呢?请帮我解决这个问题。

来自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)

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

只是你的代码

有了唯一的 key ,您就不需要 SELECT

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

使用准备好的语句

您最好使用准备好的语句,而不是像当前那样进行巨大的字符串连接和多次调用mysqli_real_escape。您甚至可能会获得性能的微小提升。然而更重要的是,可以传递到服务器的字符串有最大大小,如果你得到一个大数组,你可能会超出这个范围。

关于php - 从数组输入数据时如何防止mysql中的重复输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41120518/

相关文章:

php - 错误控制台显示 "function not defined"

android - 如何通过循环设置多个 onClick()?

android - 在 Android 中使用 FloatingActionButton 的最低 Api 版本是多少?

php - 如何获取PDO中查询语句的类型?

php - mysql表导入不起作用?

php - 获取 SQLSTATE[HY000] : General error but query is performed anyway

php - PHP 查询中的左大括号和大括号是什么意思?

php - 将图像从 android 上传到 PHP 服务器

javascript - 多种表单和单选按钮

android - 在 Android AudioTrack 中使用缓冲区