我尝试将$_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;
}
}
所以虽然数据是相同的,但是可能导致这些错误的原因。感谢。
答案 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()
的对象。