2011-05-29 25 views
-1

フォームを使用してデータベースを更新しようとしていますが、アイテムを追加したり更新したりしていません。アイテムを削除することはできますが、それだけです。私は間違って何をしているのですか?これを解決するにはどうしたらいいですか?PHP/MYSQL複数のテーブルを挿入/更新する方法

enter image description here ご協力いただきありがとうございます。

INSERTの商品ページ

<?php 
// Parse the form data and add inventory item to the system 
if (isset($_POST['PART_DESC'])) { 


      $PART_DESC = $row["PART_DESC"]; 
      $SERIAL_NUM = $row["SERIAL_NUM"]; 
      $RACK_NUM = $row["RACK_NUM"]; 
      $PART_TYPE_ID = $row["PART_TYPE_ID"]; 
      $PART_TYPE_DESC = $row["PART_TYPE_DESC"]; 
    // See if that product name is an identical match to another product in the system 
    $sql = mysql_query("SELECT PART_ID FROM PART WHERE ='$PART_ID' LIMIT 1"); 
    $productMatch = mysql_num_rows($sql); // count the output amount 
    if ($productMatch > 0) { 
     echo 'Sorry you tried to place a duplicate "Product Name" into the system, <a href="inventory.php">click here</a>'; 
     exit(); 
    } 
    // Add this product into the database now 
    $sql = mysql_query("INSERT INTO PART (PART_DESC, SERIAL_NUM, RACK_NUM, PART_TYPE_DESC, LOCATION) 
     VALUES('$PART_DESC','$SERIAL_NUM','$RACK_NUM','$PART_TYPE_ID','$PART_TYPE_DESC',now())") or die (mysql_error()); 
    $pid = mysql_insert_id(); 

    exit(); 
} 

?> 

<?php 
// Script Error Reporting 
error_reporting(E_ALL); 
ini_set('display_errors', '1'); 
?> 

EDITの商品ページ

<?php 
// Gather this product's full information for inserting automatically into the edit form below on page 
if (isset($_GET['pid'])) { 
    $targetID = $_GET['pid']; 
    $sql = mysql_query("SELECT PART_ID, PART_DESC, SERIAL_NUM, RACK.RACK_NUM, PART.PART_TYPE_ID, PART_TYPE_DESC, LOCATION 
FROM PART 
INNER JOIN PART_TYPE ON PART.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID 
INNER JOIN RACK ON RACK.RACK_NUM = PART.RACK_NUM 
WHERE PART_ID='$targetID' LIMIT 1"); 
    $productCount = mysql_num_rows($sql); // count the output amount 
    if ($productCount > 0) { 
     while($row = mysql_fetch_array($sql)){ 

      $id = $row["PART_ID"]; 
      $PART_DESC = $row["PART_DESC"]; 
      $SERIAL_NUM = $row["SERIAL_NUM"]; 
      $RACK_NUM = $row["RACK_NUM"]; 
      $PART_TYPE_ID = $row["PART_TYPE_ID"]; 
      $PART_TYPE_DESC = $row["PART_TYPE_DESC"]; 
      $LOCATION = $row["LOCATION"]; 
     } 
    } else { 
     echo "Sorry dude that crap dont exist."; 
     exit(); 
    } 
} 
?> 
<?php 
// Parse the form data and add inventory item to the system 
if (isset($_POST['PART_DESC'])) { 

    $pid = mysql_real_escape_string($_POST['thisID']); 

      $PART_DESC = $row["PART_DESC"]; 
      $SERIAL_NUM = $row["SERIAL_NUM"]; 
      $RACK_NUM = $row["RACK_NUM"]; 
      $PART_TYPE_ID = $row["PART_TYPE_ID"]; 
      $PART_TYPE_DESC = $row["PART_TYPE_DESC"]; 
      $LOCATION = $row["LOCATION"]; 

    // See if that product name is an identical match to another product in the system 
    $sql = mysql_query("UPDATE PART SET PART_DESC='$PART_DESC', SERIAL_NUM='$SERIAL_NUM', PART.PART_TYPE_DESC='$PART_TYPE_DESC', RACK.RACK_NUM='$RACK_NUM', LOCATION='$LOCATION' 
    INNER JOIN PART_TYPE ON PART.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID 
INNER JOIN RACK ON RACK.RACK_NUM = PART.RACK_NUM WHERE PART.PART_ID='$pid'"); 
    header("location: inventory.php"); 
    exit(); 
} 

>

+0

更新のために 'またはdie(mysql_error());'を追加して、なぜ更新していないのかを確認してください。また、getからintにIDを静的にキャストするか、それをエスケープする必要があります。 –

+0

'$ PART_DESC = mysql_real_escape_string($ row [" PART_DESC "]);またはそのデータはあなたのデータベースのものですか? – Johan

+0

データベースから来ています –

答えて

1

このコードは奇妙に見える:?

INSERT INTO PART 
    (PART_DESC, SERIAL_NUM, RACK_NUM, PART_TYPE_DESC, LOCATION) 
VALUES 
('$PART_DESC','$SERIAL_NUM','$RACK_NUM','$PART_TYPE_ID','$PART_TYPE_DESC',now())" 

partsテーブルにはのみのフィールドがあります。

part_id 
, part_desc 
, serial_num 
, rack_num 
, part_type_id 

だから、それらは、あなたが挿入できる唯一のフィールドです。外部キーは、あなた自身でそれを行う必要がある複数のテーブルに魔法のように挿入物を広げません。
外部キーのみが、あなたのテーブルにダングリングデータ(何にもリンクしていないFK)を挿入するのを防ぎます。
blackholeテーブルを作成します。

あなたはまだ1つのインサートと、あなたがやりたいことができますどのように
あなたは地獄一度に挿入を行う上でバインドされている場合は、(私はお勧め)は、次の操作を行います挿入するすべてのフィールドを保持します。
ブラックホールテーブルにafter insert triggerを作成し、その中に挿入ロジックを実行します。
これは自動的にすべての挿入ロジックを1つのトランザクションに入れます。したがって、MyISAMテーブルを使用していてもACIDの安全なトランザクションがまだあります:-)。これは
仕組み

/*create the blackhole table, adjust field types to match your tables*/ 
CREATE TABLE `test`.`bhpartsinsert` (
    `part_desc` varchar(255) NOT NULL, 
    `serial_num` varchar(45) NOT NULL, 
    `part_type_desc` varchar(45) NOT NULL, 
    `location` varchar(45) NOT NULL, 
    PRIMARY KEY (`part_type_desc`) 
) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1; 

DELIMITER $$ 

CREATE TRIGGER ai_bhparts_insert_each AFTER INSERT 
    ON bhpartsinsert FOR EACH ROW 
BEGIN 
    DECLARE mypart_type_id INTEGER; 
    DECLARE myrack_num INTEGER; 

    SELECT part_type_id INTO mypart_type_id FROM part_type 
    WHERE part_type_desc = new.part_type_desc LIMIT 1; 
    IF mypart_type_id IS NULL THEN BEGIN 
    INSERT INTO part_type VALUES (null, new.part_type_desc); 
    SELECT LAST_INSERT_ID() INTO mypart_type_id; 
    END; END IF; 

    SELECT rack_num INTO myrack_num FROM rack 
    WHERE location = new.location LIMIT 1; 
    IF myrack_num IS NULL THEN BEGIN 
    INSERT INTO rack VALUES (null, new.location); 
    SELECT LAST_INSERT_ID() INTO myrack_num; 
    END; END IF; 

    INSERT INTO part VALUES 
    (null, new.part_desc, new.serial_num, myrack_num, mypart_type_id); 
END $$ 

DELIMITER ; 

あなたはブラックホールのテーブルに挿入が何であれ、忘れます、しかしトリガーが解雇ありません。
私はすべての行を挿入するたびに起動するトリガーを作成しました。
トリガーは、ラックに位置があることを確認し、part_typeがあることを確認してから、パーツテーブルに正しい挿入を行います。
私はあなたのプライマリキーフィールドが整数を自動増分していると仮定しています。 nullを挿入すると、MySQLは独自のPKを作成します。
あなたが使用している場合にのみ、常にところで

を作品ヌル、0は時々動作し、時には自分の設定に依存していない、このためnullを使用し、あなたのフィールド名にすべて大文字を使用しないでくださいキーワードがすべて大文字になっているSQL構文に変更してください。

+0

私は複数のインサートを行うことができます。これは簡単です。私が見つけたチュートリアルを拡張しようとしています。シンプルなフォームを使用して、情報をデータベースにどのように追加しますか? –

+0

コメントに質問をしないでください。答えが必要なコメントは大きすぎて実用的ではありません。私は新しい質問でそれを尋ねることをお勧めします。それは本当に別の件ですので – Johan

+1

私はあなたに貼り付け可能なコードをコピーしましたが、何が難しいですか? – Johan

関連する問題