使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误

Posted

技术标签:

【中文标题】使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误【英文标题】:Undefined array key error with PHPunit test function using PDO SQL INSERT INTO 【发布时间】:2021-08-29 02:35:17 【问题描述】:

我正在使用 phpstorm。

我的测试类中已经有一个工作测试,我正在尝试让这个新功能测试工作。它测试一个简单的 INSERT INTO SQL 语句,我将所有要在数组中使用的数据,我使用 PDO 并创建了所有细节的模拟。

我拥有正在测试的实际功能。所以没有任何问题。

我已包含以下代码:

public function testSetTimestampCount()
    
        $mysqli = (new db_connection())->connection();

        $validData = [
            'id' => '99',
            'ip' => '127.0.0.1'
        ];



        $table = 'ip';

        $stmt = $this->createMock(\PDOStatement::class);
        $stmt->expects($this->once())
            ->method('execute')
            ->will(returnValueMap($validData))
            ->with($validData)
            ->willReturn(true);


        global $pdo;
        $pdo = $this->createMock('PDO');
        $pdo->expects($this->once())
            ->method('prepare')
            ->with("INSERT INTO $table id,address VALUES (:ip, :id)")
            ->willReturn($stmt);

        $ipStmt = new ip_request();
        $ipStmt->setTimestampCount($validData,$mysqli);

    

我的实际功能是这样的:

function setTimestampCount($valueData,$mysqli)
    
 
        $query = $mysqli->prepare ("INSERT INTO `ip` (`id`, `address`)VALUES (:id,:ip)");
        $query ->bindValue(':id', $valueData[0], PDO::PARAM_INT);
        $query ->bindValue(':ip', $valueData[1], PDO::PARAM_STR);
        echo $valueData[0];
        $query->execute();

    

主代码中对该函数的调用如下:

$valueData = [];
array_push($valueData, $id);
array_push($valueData, $ip);
                    
(new ip_request)->setTimestampCount($valueData,$mysqli);

我的错误是未定义的数组键0,错误指向的类函数在

$query ->bindValue(':id', $valueData[0], PDO::PARAM_INT);

在下面一行的测试函数上:

$ipStmt->setTimestampCount($validData,$mysqli);

谁能帮忙?

谢谢

【问题讨论】:

只是一个想法 - 更改您的主代码以执行类似测试代码的操作可能会更好,然后您将拥有$query ->bindValue(':id', $valueData['id'],这更清晰(恕我直言)。 mysqli, PDO - 你为什么同时使用? 【参考方案1】:

在您的测试用例中 - $validData 只有 id 和 ip 元素 - 没有 0 元素。

看起来应该是

$validData = ['99','127.0.0.1'];

【讨论】:

是的,解决了它,我以前的方式有什么意义?我从堆栈中找到了这个例子,再次感谢 实际上错误我现在得到 $query->execute();行是:“完整性约束违规:1452 无法添加或更新子行:外键约束失败”这是我需要第一种方法的原因吗? 查看表定义,看看定义了哪些外键。这意味着(也许)您需要在另一个表中使用该 IP 地址记录才能使其工作。 @spinstaUSA:请参考堆栈中的示例,再次感谢。

以上是关于使用 PDO SQL INSERT INTO 的 PHPunit 测试函数未定义数组键错误的主要内容,如果未能解决你的问题,请参考以下文章

sql [INSERT INTO] #Syntax #Insert_into

access SQL语句中 insert into

SQL——INSERTSELECTUPDATEDELETE和INSERT INTO

SQL Server 错误 1934 发生在 INSERT 到具有计算列 PHP/PDO 的表中

SQL语法:Replace into 与 Insert into 的区别

SQL语法:Replace into 与 Insert into 的区别