如果记录已存在,则为 PDO 数组

Posted

技术标签:

【中文标题】如果记录已存在,则为 PDO 数组【英文标题】:PDO array if record already existed 【发布时间】:2018-07-09 06:51:25 【问题描述】:

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

此代码有效。

if(isset($_POST['submit']))
    $number = $_POST['number'];
    $letter = $_POST['letter'];

    $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();
    

如果数据已经插入,我的意图是停止插入数据。所以我这样尝试。我确信这是错误的,因为数组变量不能传递给第一个语法**(sql1)** 并且 $query 没有被访问 foreach 子句。我不知道,所以我就这样使用。请提供任何想法来停止已插入的记录。

我想修改这段代码

<?php
if(isset($_POST['submit']))
    $number = $_POST['number'];
    $letter = $_POST['letter'];

    $sql1 = 'SELECT COUNT(*) FROM class WHERE number = :number';
    $stmt = $con->prepare($sql1);
    $stmt->bindParam(':number', $number[$key]);
    $stmt->execute();

    if($stmt->fetchColumn())
        echo"<script>alert('Class is already existed')</script>";
    
    else
        $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();
    


?>

此代码显示以下错误

Notice: Undefined variable: key in C:\xampp\htdocs\marksheet\class.php on line 53
Notice: Undefined variable: query in C:\xampp\htdocs\marksheet\class.php on line 57
Fatal error: Uncaught Error: Call to a member function bindParam() on null in C:\xampp\htdocs\marksheet\class.php:57 Stack trace: #0 main thrown in C:\xampp\htdocs\marksheet\class.php on line 57

【问题讨论】:

行内$stmt-&gt;bindParam(':number', $number[$key]); $key 未定义。 正在解决您的问题,您还想要解决方案吗? 【参考方案1】:

这应该可行:

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>";
            
        
    

更新

@AlivetoDie 建议的解决方案非常适用于插入唯一数据并删除重复数据的速记方法。但是,它没有任何方法可以跟踪失败的数据索引,因为查询总是返回 TRUE。

【讨论】:

非常感谢。我已经失去了一整天尝试不同的方式。终于成功了。 别提了:)【参考方案2】:

我想推荐以下方式。首先你需要一个动态函数来检查相关表中的记录

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 数组,这将使您的脚本更加动态,您可以防止重复插入,还可以检查多个列。

【讨论】:

以上是关于如果记录已存在,则为 PDO 数组的主要内容,如果未能解决你的问题,请参考以下文章

PDO MYSQL 如果不存在则创建表并找出它是不是已创建

PDO::PARAM_FLOAT 不存在,为啥?

[PDO如果ID存在,则在更新时插入MySQL

Sqlite:如果结果为空,则为最大子查询设置默认值

MATLAB查找字符数组中是不是存在特定的字符串

linux条件判断之判断文件是否存在