如何解决“致命错误:未捕获的错误:在数组上调用成员函数beginTransaction()”

时间:2019-05-17 07:14:14

标签: php pdo

我正在建立一个网站,您可以在其中输入一些数据,然后将这些数据放入数据库中。

if (isset ($_POST['next_1']))
{
    $name = $_POST['Name'];
    $geburtsdatum = $_POST['Geburtsdatum'];
    $anzahlom = $_POST['AnzahlOM'];
    $conn = [];
}
else
{
    header('Location: pdo_test.php', true, 302);
}
?>

$ conn是我的变量,用于保存连接数据。

<?php
//Showing Errors
error_reporting(E_ALL);
ini_set('display_errors', 1);

//Connection to Database
include 'includes/connect.php'; 

try
{   
    $conn->beginTransaction();

    $stmt = $conn->prepare("INSERT INTO mitarbeiter_test (name, geburtsdatum, Monitor)
    VALUES (:name, :geburtsdatum, :Monitor)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':geburtsdatum', $geburtsdatum);
    $stmt->bindParam(':Monitor', $anzahlom);

    $stmt->execute();

    $conn->commit();
    echo "<br>New records created successfully";
}
catch(PDOException $e)
{
    $conn->rollBack();
    error_log("Database rollback; inserting data failed: ".$e->getMessage());
}

?> 

这是发生错误的部分: $ conn-> beginTransaction();

这是connect.php:

<?php include_once 'login_data.php';
try
{
    $conn = new PDO('mysql:host='.HOST.';dbname='.DATABASE.'', ''.USER.'', ''.PASSWORD.'', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully"; 
}   

catch(PDOException $e)
    {
    echo "Connection failed: " . $e->getMessage();
    }

?> 

当我提交带有数据的表单时,我得到一条消息,即与数据库的连接已成功,并且出现了错误消息: '致命错误:未捕获的错误:在/var/www/sla-test/htdocs/test/db_test_in.php:49中的数组上调用成员函数beginTransaction():49堆栈跟踪:#0 {main}放在/ var / www中/sla-test/htdocs/test/db_test_in.php行49'

我已经看过其他有关调用成员函数问题的文章,但是其中大多数是关于“ ... on non-object”的,而我发现的一些关于“ ... on array”的文章并未确实可以帮助我理解问题。据我了解,$ conn变量必须是一个对象而不是数组,但是我不知道如何重写代码来实现这一点。

当我删除行$conn = []时,我得到的错误是'... on null'而不是'... on array'。

1 个答案:

答案 0 :(得分:0)

您将$conn定义为数组,而不是PDO实例。由于beginTransaction不是数组的方法,因此您会收到错误消息“在数组上调用成员函数beginTransaction()”。

尝试使用与上一个代码段相同的方式进行初始化:

$conn = new PDO(...);