每次我想更新数据时外键约束都会失败

问题描述 投票:0回答:1

我在我创建的网站上的 PHP 文件中遇到错误。当我想更新数据时,程序不会更新它,而是显示错误消息。尽管我已经创建了外键并且数据库已经连接,但我确信错误出在下面的两行代码中。

/ jika form edit data yang dipilih
elseif ($_GET['form'] == 'edit') {
    if (isset($_GET['id'])) {
        // fungsi query untuk menampilkan data dari tabel transaksi
        $query = mysqli_query($mysqli, "SELECT a.id_transaksi,a.tgl_transaksi,a.barang,a.pekerja,a.pelanggan,a.jumlah_barang,a.status,
                                        b.id_barang ,b.nama_barang,
                                        c.id_pekerja,c.nama_pekerja,
                                        d.id_pelanggan,d.identitas,d.alamat,d.telepon as id_pelanggan
                                        FROM transaksi as a INNER JOIN barang as b INNER JOIN pekerja as c INNER JOIN pelanggan as d
                                        ON a.barang=b.id_barang AND a.pekerja=c.id_pekerja AND a.pelanggan=d.id_pelanggan
                                        WHERE a.id_transaksi='$_GET[id]'")
            or die('Ada kesalahan pada query tampil data ubah : ' . mysqli_error($mysqli));
        $data  = mysqli_fetch_assoc($query);

        $id_transaksi   = $data['id_transaksi'];

        $tanggal         = $data['tgl_transaksi'];
        $tgl             = explode('-', $tanggal);
        $tgl_transaksi   = implode('-', array_reverse($tgl));
        $id_pekerja      = $data['id_pekerja'];
        $id_barang       = $data['id_barang'];
        $jumlah_barang   = $data['jumlah_barang'];
        $id_pelanggan    = $data['id_pelanggan'];
        $nama_barang    = $data['nama_barang'];
        $nama_pekerja    = $data['nama_pekerja'];
        $identitas    = $data['identitas'];
        $alamat    = $data['alamat'];
        $status          = $data['status'];
    }
?>

第二个代码:

elseif ($_GET['act'] == 'update') {
        if (isset($_POST['simpan'])) {
            // Tambahkan kode debug di sini untuk menampilkan semua data POST
            echo "<pre>";
            print_r($_POST);
            echo "</pre>";
            if (isset($_POST['id_transaksi'])) {
                // ambil data hasil submit dari form
                $id_transaksi = mysqli_real_escape_string($mysqli, trim($_POST['id_transaksi']));
                $tanggal = $_POST['tgl_transaksi'];
                $tgl = explode('-', $tanggal);
                $tgl_transaksi = $tgl[2] . "-" . $tgl[1] . "-" . $tgl[0];

                $id_pekerja = mysqli_real_escape_string($mysqli, trim($_POST['id_pekerja']));
                $id_barang = mysqli_real_escape_string($mysqli, trim($_POST['id_barang']));
                $jumlah_barang = mysqli_real_escape_string($mysqli, trim($_POST['jumlah_barang']));
                $id_pelanggan = mysqli_real_escape_string($mysqli, trim($_POST['id_pelanggan']));
                $status = mysqli_real_escape_string($mysqli, trim($_POST['status']));

                // Tambahkan debug untuk memeriksa apakah variabel ada dan tidak null
                echo "ID Transaksi: $id_transaksi, ID Pekerja: $id_pekerja, ID Barang: $id_barang, Jumlah Barang: $jumlah_barang, ID Pelanggan: $id_pelanggan, Status: $status";

                // perintah query untuk mengubah data pada tabel transaksi
                $query = mysqli_query($mysqli, "UPDATE transaksi SET tgl_transaksi    = '$tgl_transaksi',
                                                                     pekerja          = '$id_pekerja',
                                                                     barang           = '$id_barang',
                                                                     jumlah_barang    = '$jumlah_barang',
                                                                     pelanggan        = '$id_pelanggan',
                                                                     status           = '$status'
                                                               WHERE id_transaksi     = '$id_transaksi'")
                    or die('Ada kesalahan pada query update : ' . mysqli_error($mysqli));

                // cek query
                if ($query) {
                    // jika berhasil tampilkan pesan berhasil update data
                    header("location: ../../main.php?module=transaksi&alert=2");
                }
            }
        }
    }

这是错误:

Fatal error: Uncaught mysqli_sql_exception: Cannot add or update a child row: a foreign key constraint fails (`global_survey`.`transaksi`, CONSTRAINT `FK_transaksi_barang` FOREIGN KEY (`barang`) REFERENCES `barang` (`id_barang`) ON DELETE CASCADE ON UPDATE CASCADE) in C:\xampp\htdocs\WebGlobalSurvey\admin\modules\transaksi\proses.php:61 Stack trace: #0 C:\xampp\htdocs\WebGlobalSurvey\admin\modules\transaksi\proses.php(61): mysqli_query(Object(mysqli), 'UPDATE transaks...') #1 {main} thrown in C:\xampp\htdocs\WebGlobalSurvey\admin\modules\transaksi\proses.php on line 61

我尝试修改INNER JOIN,因为我怀疑那行代码有错误,但程序仍然无法正常运行。但如果我更新 id_pekerja、id_pelanggan 和 id_barang,它就会起作用。如果我只改变其中之一,将无法工作。

This is the error, id_pekerja, id_pelanggan and id_barang are empty, I don't know why

php database web crud
1个回答
0
投票

检查外键约束:验证transaksi表上的外键约束,特别是FK_transaksi_barang是否正确设置。确保barang表中引用的列存在并且有效。

数据完整性:确保您尝试在 transaksi 表(barang、id_pekerja、id_pelanggan)中更新的值与引用表(barang、pekerja、pelanggan)中的值匹配。如果您要更新外键,请确保新值存在于各自引用的表中。

级联更新:如果要更新引用表中的主键值(id_barang、id_pekerja、id_pelanggan),请确保将外键关系设置为级联更新。这意味着当您更新引用的主键时,它也应该在 transaksi 表中自动更新。

调试:使用调试技术检查您尝试在 PHP 代码中更新的值。您可以添加 echo 或 var_dump 语句以在执行更新查询之前打印出值。这将帮助您确定是否传递了任何意外或不正确的值。

SQL 语句:仔细检查您用于更新查询的 SQL 语句。确保 WHERE 子句正确标识您要更新的行。

错误处理:在 PHP 代码中实现更强大的错误处理,以捕获和显示详细的错误消息。这将帮助您查明问题的确切原因。

测试:尝试一次更新一条记录,看看问题是否仍然存在。这将帮助您确定问题是否是由特定的更新组合引起的。

© www.soinside.com 2019 - 2024. All rights reserved.