将$ _POST数据放入数组中

时间:2016-12-31 08:05:53

标签: php arrays

我尝试将$_POST中的所有数据放入这样的数组中:

$produk =
        [
            'kode'=>$_POST['kode'],
            'id_kategori'=>$_POST['kategori'],
            'produk'=>$_POST['produk'],
            'keterangan'=>$_POST['keterangan'],
            'harga'=>$_POST['harga'],
            'potongan'=>$_POST['potongan'],
            'jumlah'=>$_POST['jumlah'],
            'berat'=>$_POST['berat'],
            'warna'=>$_POST['warna'],
            'ukuran'=>$_POST['ukuran']
        ];

但是当我尝试将其插入某个类并且遇到这种错误时,我总是遇到错误:

( ! ) Fatal error: Uncaught Error: Call to a member function tambahProduk() on array in C:\wamp64\www\core\test.php on line 35
( ! ) Error: Call to a member function tambahProduk() on array in C:\wamp64\www\core\test.php on line 35

使用它测试我的数据时它工作正常:

$data =
        [
            'kode' => 'abcde',
            'id_kategori' => '1',
            'produk' => 'Topi',
            'keterangan' => 'Baju ini dibuat dengan penuh hati.',
            'harga' => '250000',
            'potongan' => '0',
            'jumlah' => '3',
            'berat' => '100',
            'warna' => 'merah, kuning, hijau',
            'ukuran' => 's, m, xl, xxl'
        ];

当我在Print_r上使用$produk时,我得到了这个结果:

Array ( [kode] => JKW001 [id_kategori] => 1 [produk] => Baju Jokowi 01 [keterangan] => Kaos oblong enak sekali dipakai [harga] => 10000 [potongan] => 2 [jumlah] => 12 [berat] => 11 [warna] => merah, kuning, hijau, biru, coklat [ukuran] => A,B,C,D,E,F,G ) 

这里有tambahProduct函数:

public function tambahProduk($produk){
        try{
            $this->pdo->beginTransaction();
            $sql = 'INSERT INTO produk 
            (kode_produk, id_kategori, nama_produk, keterangan, harga, potongan, jumlah_tersedia, berat)
            VALUES (:kode_produk, :id_kategori, :nama_produk, :keterangan, :harga, :potongan, :jumlah_tersedia,
          :berat)';

            $stmt = $this->pdo->prepare($sql);
            $stmt->bindParam(':kode_produk', $produk['kode'], \PDO::PARAM_STR);
            $stmt->bindParam(':id_kategori', $produk['id_kategori'], \PDO::PARAM_INT);
            $stmt->bindParam(':nama_produk', $produk['produk'], \PDO::PARAM_STR);
            $stmt->bindParam(':keterangan', $produk['keterangan'], \PDO::PARAM_STR);
            $stmt->bindParam(':harga',$produk['harga'] ,\PDO::PARAM_INT);
            $stmt->bindParam(':potongan', $produk['potongan'],\PDO::PARAM_INT);
            $stmt->bindParam(':jumlah_tersedia',$produk['jumlah'] ,\PDO::PARAM_INT);
            $stmt->bindParam(':berat',$produk['berat'] ,\PDO::PARAM_INT);
            $stmt->execute();
            $id_produk = $this->pdo->lastInsertId();

            $sql2 = 'INSERT INTO ukuran (ukuran) VALUE (:ukuran)';
            $stmt = $this->pdo->prepare($sql2);
            $ukuran = explode(",",$produk['ukuran']);
            $id_ukuran = [];
            foreach ( $ukuran as $key => $value) {
                if (!empty($value)) {
                    $stmt->bindParam(':ukuran', $value);
                    $stmt->execute();
                    $id_ukuran[] = $this->pdo->lastInsertId();
                    //echo $value;
                    //print_r($id_ukuran);
                }
            }

            $sql3 = 'INSERT INTO ukuran_produk (id_produk, id_ukuran) VALUES (:id_produk,:id_ukuran)';
            $stmt = $this->pdo->prepare($sql3);
            foreach ( $id_ukuran as $key => $value) {
                if (!empty($value)) {
                    $stmt->bindParam(':id_produk', $id_produk);
                    $stmt->bindParam(':id_ukuran', $value);
                    $stmt->execute();
                }
            }

            $sql4 = 'INSERT INTO warna (warna) VALUE (:warna)';
            $stmt = $this->pdo->prepare($sql4);
            $warna = explode(",",$produk['warna']);
            $id_warna = [];
            foreach ( $warna as $key => $value) {
                if (!empty($value)) {
                    $stmt->bindParam(':warna', $value);
                    $stmt->execute();
                    $id_warna[] = $this->pdo->lastInsertId();
                    //echo $value;
                    //print_r($id_warna);
                }
            }

            $sql5 = 'INSERT INTO warna_produk (id_produk, id_warna) VALUES (:id_produk,:id_warna)';
            $stmt = $this->pdo->prepare($sql5);
            foreach ( $id_warna as $key => $value) {
                if (!empty($value)) {
                    $stmt->bindParam(':id_produk', $id_produk);
                    $stmt->bindParam(':id_warna', $value);
                    $stmt->execute();
                }
            }

            $this->pdo->commit();
        }catch (\PDOException $e){
            echo $e;
        }

    }

所以虽然数据是相同的,但是可能导致这些错误的原因。感谢。

2 个答案:

答案 0 :(得分:0)

我怀疑将$_POST值作为字符串传递可能与INT有关。因此,当您将$_POST数据绑定到PDO作为INT时,它就会失败。

以下示例:

$_POST['test'] = '0';

if (filter_var($_POST['test'], FILTER_VALIDATE_INT)) {

    echo 'True';

} else {

    echo 'False';

}

输出:

False

我建议您使用下面的三元组将$_POST值转换为INT

$_POST['potongan'] = '0';

$pontogan = (is_numeric($_POST['potongan']) ? (int)$_POST['potongan'] : NULL);

因此,如果$_POST['potongan']为数字,则将$_POST['potongan']转换为INT并分配给$pontogan,否则$pontogan将被指定为NULL

答案 1 :(得分:0)

最后,让我们在评论中总结一下我们的讨论,让其他人有机会快速了解这里发生的事情:

错误Call to a member function tambahProduk() on array不是由数据格式引起的:$data$produk的定义方式相同。

因此,函数调用是问题:从函数定义中,很明显函数是在类中定义的。事实证明,此类的实例已保存到$produk。到目前为止$data的测试调用工作正常:$produk->tambahProduk($data);

来自$_POST的真实数据的调用不再有效。从最初的问题可以看出,这些数据也存储在$produk中。所以函数调用将是:$produk->tambahProduk($produk);

在这里我们发现了问题:在$produk中,存储了来自$_POST的数据数组。所以没有任何对象了。这也意味着无法再调用所需对象的成员函数tambahProduk()

错误信息怎么样?

它说,阵列上有一个函数调用。那是因为数据数组是在$produk内找到的。它应该是一个具有函数tambahProduk()的对象。