2016-12-31 77 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()的對象。