Php PDO数组(如果记录已存在)

Php PDO数组(如果记录已存在),php,mysql,arrays,pdo,insert,Php,Mysql,Arrays,Pdo,Insert,我使用数组从一个提交按钮插入多行。记录的插入工作进展顺利。现在,如果记录已经存在,我想停止插入数据。我的单记录更新语法是防止同一记录多次插入。但在使用数组时,我很困惑,也不知道该怎么做。我尝试了很多,但每种方法都显示错误 此代码正在运行 我的意图是,如果数据已经插入,就停止插入。所以我试着这样做。我确信这是错误的,因为数组变量无法传递到第一个语法**sql1**,并且$query未被访问到foreach子句。我不知道,所以我就这样用过。请给我提供任何停止已插入记录的方法 我想更改此代码 我想推荐

我使用数组从一个提交按钮插入多行。记录的插入工作进展顺利。现在,如果记录已经存在,我想停止插入数据。我的单记录更新语法是防止同一记录多次插入。但在使用数组时,我很困惑,也不知道该怎么做。我尝试了很多,但每种方法都显示错误

此代码正在运行

我的意图是,如果数据已经插入,就停止插入。所以我试着这样做。我确信这是错误的,因为数组变量无法传递到第一个语法**sql1**,并且$query未被访问到foreach子句。我不知道,所以我就这样用过。请给我提供任何停止已插入记录的方法

我想更改此代码


我想推荐以下方法。首先,您需要一个动态函数,它应该检查相关表中的记录

function isExist($columnName, $columnValue, $tableName){
        $columnName     = (!empty($columnName)) ? $columnName : 'empty';
        $columnValue    = (!empty($columnValue)) ? $columnValue : 'empty';
        $tableName  = (!empty($tableName)) ? $tableName : 'empty';
        $exist = 0;
        if($columnName != 'empty' && $columnValue != 'empty' && $tableName != 'empty'){
            $sql = "select * from `".$tableName."` where `".$columnName."` = '".$columnValue."'";
            $isExist = mysqli_query($this->connection,$sql);
            if(mysqli_num_rows($isExist) > 0){
                $exist = 1;

            }
        }
      return $exist;    
    }
然后按照以下方式在函数中使用它

if(isset($_POST['submit'])){
    $error = 0; 
    $response = array();
    $number = $_POST['number'];
    $letter = $_POST['letter'];

    $number_name_exist = $this->isExist('number', $number, 'class');
    if($number_name_exist == 1){
       $error = 1;
        $response['error'] =  $number . ' is already exists';
    }

    if($error == 0){

        $sql = "INSERT INTO class(number, letter) VALUES(:number, :letter)";
        $query = $con->prepare($sql);

        foreach($number AS $key => $n){
            $query->bindParam(':number', $number[$key]);
            $query->bindParam(':letter', $letter[$key]);
            $query->execute();
        }

    }
}

在上面的示例中,您可以看到$error变量和$response数组,这将使您的脚本更加动态,您可以防止重复插入,还可以检查多个列。

我推荐以下方法。首先,您需要一个动态函数,它应该检查相关表中的记录

function isExist($columnName, $columnValue, $tableName){
        $columnName     = (!empty($columnName)) ? $columnName : 'empty';
        $columnValue    = (!empty($columnValue)) ? $columnValue : 'empty';
        $tableName  = (!empty($tableName)) ? $tableName : 'empty';
        $exist = 0;
        if($columnName != 'empty' && $columnValue != 'empty' && $tableName != 'empty'){
            $sql = "select * from `".$tableName."` where `".$columnName."` = '".$columnValue."'";
            $isExist = mysqli_query($this->connection,$sql);
            if(mysqli_num_rows($isExist) > 0){
                $exist = 1;

            }
        }
      return $exist;    
    }
然后按照以下方式在函数中使用它

if(isset($_POST['submit'])){
    $error = 0; 
    $response = array();
    $number = $_POST['number'];
    $letter = $_POST['letter'];

    $number_name_exist = $this->isExist('number', $number, 'class');
    if($number_name_exist == 1){
       $error = 1;
        $response['error'] =  $number . ' is already exists';
    }

    if($error == 0){

        $sql = "INSERT INTO class(number, letter) VALUES(:number, :letter)";
        $query = $con->prepare($sql);

        foreach($number AS $key => $n){
            $query->bindParam(':number', $number[$key]);
            $query->bindParam(':letter', $letter[$key]);
            $query->execute();
        }

    }
}
在上面的示例中,您可以看到$error变量和$response数组,这将使脚本更加动态,您可以防止重复插入,还可以检查多个列。

这应该可以:

使现代化 @AlivetoDie建议的解决方案可以作为插入唯一数据并删除重复数据的简写方式。但是,它没有任何方法来跟踪失败的数据索引,因为查询总是返回TRUE

这应该有效:

使现代化
@AlivetoDie建议的解决方案可以作为插入唯一数据并删除重复数据的简写方式。但是,它没有任何方法来跟踪失败的数据索引,因为查询总是返回TRUE

在$stmt->bindParam行中:number',$number[$key]$密钥未定义。我正在处理您的问题,您是否仍然需要解决方案?在$stmt->bindParam:number',$number[$key]行中$密钥未定义。我正在处理您的问题,您还需要解决方案吗?非常感谢。我一整天都在尝试不同的方法。终于成功了,不用客气,非常感谢。我一整天都在尝试不同的方法。终于成功了。别提了:
if(isset($_POST['submit'])){
    $error = 0; 
    $response = array();
    $number = $_POST['number'];
    $letter = $_POST['letter'];

    $number_name_exist = $this->isExist('number', $number, 'class');
    if($number_name_exist == 1){
       $error = 1;
        $response['error'] =  $number . ' is already exists';
    }

    if($error == 0){

        $sql = "INSERT INTO class(number, letter) VALUES(:number, :letter)";
        $query = $con->prepare($sql);

        foreach($number AS $key => $n){
            $query->bindParam(':number', $number[$key]);
            $query->bindParam(':letter', $letter[$key]);
            $query->execute();
        }

    }
}
if (isset($_POST['submit'])) {
    if(!empty($_POST['number']) && !empty($_POST['letter']) )
    {
        $number = $_POST['number'];
        $letter = $_POST['letter'];
        // Assuming both $number and $letter 1 dimensional array with equal number of indexes
        $notInsertedKey = [];
        foreach ($number AS $key => $item) {               

            /* Checking Existence*/
            $sql1 = 'SELECT COUNT(*) as counted FROM class WHERE number = :number';
            $stmt = $con->prepare($sql1);
            $stmt->bindParam(':number', $number[$key]);
            $stmt->execute();
            $data = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($data['counted'] < 1) {
                // echo "Not Exist";

                $sql = "INSERT INTO class(number, letter) VALUES (:number, :letter)";
                $query = $con->prepare($sql);
                $query->bindParam(':number', $number[$key]);
                $query->bindParam(':letter', $letter[$key]);
                $query->execute();

            } else {
                $notInsertedKey[] = $key;
                // Incase you want to know the failed indexes.
                echo "<script>alert('Class is already existed')</script>";
            }
        }
    }
}