2016-12-31 81 views
0

我尽量把所有的数据从$_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' 
     ]; 

当我使用错误上$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; 
     } 

    } 

所以虽然数据是一样什么都能造成这些错误。谢谢。

+1

该错误显示调用函数'tambahProduk()'时出现问题。这是如何定义的?你想怎么称呼它? – akrys

+0

如上所述,问题出在您的方法'tambahProduk()'上。你需要向我们展示'tambahProduk()'的部分代码。 – Kitson88

+0

@akrys,Kitson,如果问题出在可能tambahProduk()那么它假设我调用tambahProduk($ data)时有问题,但事实并非如此。当我打电话使用tambahProduk($ produk)时,我只有问题。你不觉得问题出在$ produk上吗? – Ying

回答

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

+0

我认为这不是关于错误的输入格式,以及我有验证类来验证数据,所以它不会输入不正确的。我认为问题是在$ produk中的数组格式。 – Ying

+0

验证类?在你的问题中没有提到这一点。我会建议将此添加到您的问题。也许值得输出你的POST值以及使用'var_dump($ _ POST)' – Kitson88

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()的对象。