2011-05-29 5 views
-1

J'essaie de mettre à jour une base de données en utilisant un formulaire, mais ce n'est pas en ajoutant l'élément ou la mise à jour. La suppression de l'élément fonctionne mais c'est tout. Qu'est-ce que je fais de mal et comment puis-je faire pour résoudre ce problème?PHP/MYSQL Comment insérer/mettre à jour plusieurs tables

enter image description here Merci d'avance votre aide est appréciée.

INSERT ARTICLE PAGE

<?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 PAGE ARTICLE

<?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

Vous devriez ajouter le 'ou mourir (mysql_error());' pour la mise à jour, et voir pourquoi il n'est pas mis à jour. Vous devriez aussi lancer l'ID de l'intérieur vers l'INT ou l'échapper aussi. –

+0

ne voulez-vous pas faire: '$ PART_DESC = mysql_real_escape_string ($ row [" PART_DESC "]);' ou ces données proviennent-elles de votre base de données? – Johan

+0

il vient de la base de données –

Répondre

1

Ce code semble bizarre:

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())" 

Le tableau parts a que des champs:

part_id 
, part_desc 
, serial_num 
, rack_num 
, part_type_id 

Ce sont donc les seuls champs que vous pouvez insérer. Les clés étrangères ne répandent pas les inserts de façon magique sur plusieurs tables, vous devez le faire vous-même.
Les clés étrangères seulement vous empêchent d'insérer des données pendantes (FK qui ne lient rien) dans vos tables, c'est l'informatique.

Comment vous pouvez toujours faire ce que vous voulez avec un insert
Si vous êtes l'enfer lié à faire l'insert en une seule fois, (que je recommande) procédez comme suit:
Créer une table blackhole qui contient tous les champs que vous voulez insérer.
Créez un after insert trigger sur la table blackhole et effectuez la logique d'insertion dans celle-ci.
Cela mettra automatiquement toute votre logique d'insertion en une seule transaction, donc même si vous utilisez des tables MyISAM, vous avez toujours des transactions ACID en toute sécurité :-).

/*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 ; 

Comment cela fonctionne
Tout ce que vous insérez dans une table de trou noir se fait oublier, mais déclencheurs ne sont congédiés.
J'ai donc fait une gâchette qui se déclenche après chaque insertion de chaque rangée.
Le déclencheur s'assure qu'il y a un emplacement dans le rack et s'assure qu'il y a un part_type, puis insère correctement dans les tables de pièces.
Je suppose que vos champs de clés primaires sont des entiers auto-incrémentés. Si vous insérez un null MySQL créera un PK unique pour vous.
Utilisez uniquement null pour cela, 0 fonctionne parfois et parfois ne pas en fonction de votre configuration, null fonctionne toujours

BTW, s'il vous plaît ne pas utiliser tous les bouchons pour vos noms de champs, si vous utilisez à la syntaxe SQL où KEYWORDS sont tous en majuscules, ça fait mal à la tête

+0

Je peux faire plus d'une insertion s'il est plus facile im nouveau à cette substance et im essayant de développer un tutoriel que j'ai trouvé. Comment ajouteriez-vous l'information à la base de données en utilisant un simple formulaire? –

+0

S'il vous plaît ne pas poser une question dans un commentaire, le commentaire que je dois répondre est trop gros pour être pratique. Je recommande de poser cette question dans une nouvelle question. Parce que c'est vraiment un sujet différent – Johan

+1

En plus je vous ai juste donné un code modifiable, quelle difficulté? – Johan

Questions connexes