【问题标题】:how to prevent duplicate entry in mysql while data are entered from array?从数组输入数据时如何防止mysql中的重复输入?
【发布时间】:2016-12-13 11:54:20
【问题描述】:

我是 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);
}
?>

【问题讨论】:

  • 绝对不使用 PHP,您可以通过在数据库中的相关列上创建唯一索引来做到这一点
  • @e4c5 请你解释一下我怎样才能给唯一的索引或给我一个链接
  • @Blueblazer172 我只是想停止重复数据库输入,我该如何实现?
  • 是的,我想要 php 方面的那个 @Blueblazer172
  • 你不能在 PHP 端可靠地做到这一点。如果您的脚本的两个实例碰巧同时插入了相同的数据,那么无论您做什么,都会有一个副本。这被称为竞争条件。以任何程度的可靠性做您想做的事情的唯一方法是对数据库表强制执行唯一约束。

标签: php android mysql arrays json


【解决方案1】:

创建唯一索引

无论您使用何种编程语言,对数据的所有约束都必须在数据库中而不是在您的应用程序层中强制执行。最简单的方法是在相关列上添加一个 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。您甚至可能会在性能上获得微小的提升。然而更重要的是,可以传递到服务器的字符串的最大大小,如果你得到一个大数组,你可能会超过这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多