2017-02-06 7 views
0

私は2つのテーブルに外部キーを持つこのプロジェクトに取り組んでいます。私はデータベースに新しいレコードを挿入しようとしているフォームを使用しています。また、dbに画像パスがあり、フォーム経由で画像パスを挿入しています。私はcodeigniterファイルアップロードライブラリを使用しています。外部キーフィールドでもフォームを送信すると、データベーステーブルの他のフィールドが更新されます。しかし、画像パスは更新されていません。フォームを送信すると、このエラーが表示されます。データベースエラー1452

A Database Error Occurred 

Error Number: 1452 

Cannot add or update a child row: a foreign key constraint fails (`bfh`.`products`, CONSTRAINT `category_fk` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)) 

INSERT INTO `products` (`img`) VALUES ('assets/img//sakya.PNG') 

Filename: C:/xampp/htdocs/CI-skeleton/system/database/DB_driver.php 

Line Number: 691 

コントローラ

public function add_product() 
    { 
     $result = 0; 
     $cat_id = $this->input->post("category_id"); 
     $type_id = $this->input->post("type_id"); 
     $pname = $this->input->post("p_name"); 
     $images = $this->input->post("images"); 
     $images = $_FILES['images']['name']; 
     $price = $this->input->post("price"); 

     $this->load->model("Products_Model"); 
     $product_id = $this->Products_Model->add_product($cat_id, $type_id, $pname, $price); 

     if ($product_id != 0) { 
     $result = $this->Products_Model->add_product_images($images); 
     } 


     if ($result && $_FILES['images']['name'][0] != "") { 
     $this->load->model('Image_Upload'); 
     $result = $this->Image_Upload->upload("assets/img"); 
    } 

     $this->session->set_flashdata('result', $result); 
     redirect('Products'); 
    } 

モデル

public function add_product($cat_id, $type_id, $pname, $price) 
    { 
     $result = $this->db->get_where("products", array('name' => $pname)); 
     if ($result->num_rows() != 0) { 
      return 0; // record already exists 
     } else { 
      $data = array(
        'category_id' => $cat_id, 
        'type_id' => $type_id, 
        'name' => $pname, 
        'price' => $price 
      ); 

      if(!$this->db->insert('products', $data)) { 
       return -1; // error 
      }else{ 
       return $this->db->insert_id(); 
      } 

      return 1; // success 
     } 
    } 

public function add_product_images($images) 
{ 
    $path = "assets/img/"; 

    foreach ($images as $image) { 
     // if no images were given for the item 
     if ($image == "") { 
      return 1; 
     } 

     $data = array(
       'img' => $path."/".$image 
     ); 

     if (! $this->db->insert('products', $data)) { 
      return 0; // if something goes wrong 
     } 
    } 

    return 1; 
} 
+0

あなたがしようとしていることを説明してください –

+0

私は、製品、カテゴリ、およびタイプテーブルと呼ばれるテーブルをデータベースに持っています。商品テーブルには、カテゴリテーブルとタイプテーブルからの外部キーがあります。ここでは、productsテーブルの新しいレコードを挿入しようとしています。フォームを送信すると、画像パスフィールドを除く他のすべてのフィールドが更新され、エラーが表示されます。 – Kasun

答えて

1

add_product_images()のinsertの代わりに "update"クエリを使用する必要があります。 「挿入」は製品の新しいレコードを追加するため、カテゴリID(外部キー)がないため、このエラーが表示されます。 イメージを更新しようとします。

0

enter image description here

同じ名前を持つ2つの変数を持っているし、問題のthats。 異なる変数名が必要です。 これがあなたを助けてくれることを願っています。あなたが書いたモデルは、製品を追加する機能場合

0

は、このスクリプト

  1. でいくつかの問題があります。クエリが失敗した場合は-1を返し、それ以外の場合は製品ID を返しますが、製品がデータベースにあった場合は0を返し、コントローラではproduct_id!= 0であるかどうかをチェックして画像を挿入します。だから、製品がデータベースに存在しないかどうか気にしないで、テーブルに挿入しなかった場合は、
  2. add_product_imagesでif($ image == "")をチェックします。このステートメントが真であれば、イメージ配列($ images)をどのように取得するのか分かりません。 ($ images)
関連する問題