2010-10-02 61 views
0

確定它在這裏。我有一個來自product_sizes,品牌,類別和供應商表的外鍵的桌面產品。當我顯示產品表到一個HTML。我使用JOIN,以便在產品表中顯示的數據不是外鍵的id,而是相應的名稱..我對添加數據的查詢沒有問題。我的問題是當我嘗試編輯我的編輯查詢數據。它會提示我關於外鍵約束的錯誤。我會張貼我的產品表,也是我的編輯查詢。這就是:編輯與外鍵約束的查詢錯誤

CREATE TABLE IF NOT EXISTS `products` (
    `product_id` int(10) NOT NULL auto_increment, 
    `product_name` varchar(20) default NULL, 
    `product_color` varchar(20) default NULL, 
    `product_description` varchar(100) default NULL, 
    `product_standardPrice` double default NULL, 
    `product_unitPrice` double default NULL, 
    `category_id` int(10) default NULL, 
    `brand_id` int(10) default NULL, 
    `size_id` int(10) default NULL, 
    `supplier_id` int(10) default NULL, 
    PRIMARY KEY (`product_id`), 
    KEY `category_id` (`category_id`), 
    KEY `brand_id` (`brand_id`), 
    KEY `supplier_id` (`supplier_id`), 
    KEY `size_id` (`size_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

-- 
-- Dumping data for table `products` 
-- 

INSERT INTO `products` (`product_id`, `product_name`, `product_color`, `product_description`, `product_standardPrice`, `product_unitPrice`, `category_id`, `brand_id`, `size_id`, `supplier_id`) VALUES 
(1, '12', '12', '12', 212, 1, 3, 22, 3, 1), 
(2, '2', '2', '2', 2, 2, 4, 23, 2, 2); 

-- 
-- Constraints for dumped tables 
-- 

-- 
-- Constraints for table `products` 
-- 
ALTER TABLE `products` 
    ADD CONSTRAINT `products_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`category_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `products_ibfk_2` FOREIGN KEY (`brand_id`) REFERENCES `brands` (`brand_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `products_ibfk_4` FOREIGN KEY (`supplier_id`) REFERENCES `suppliers` (`supplier_id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `products_ibfk_5` FOREIGN KEY (`size_id`) REFERENCES `product_sizes` (`size_id`) ON DELETE CASCADE ON UPDATE CASCADE; 

,這裏是我的編輯查詢:

if(isset($_POST['editproduct'])){ 
$product_id=$_POST["product_id"]; 
$product_name=$_POST["product_name"]; 
$product_color=$_POST["product_color"]; 
$size_name=$_POST["size_name"]; 
$product_description=$_POST["product_description"]; 
$brand_name=$_POST["brand_name"]; 
$category_name=$_POST["category_name"]; 
$supplier_name=$_POST["supplier_name"]; 
$product_standardPrice=$_POST["product_standardPrice"]; 
$product_unitPrice=$_POST["product_unitPrice"]; 
$sql = "UPDATE products SET 
product_name='$product_name' 
,product_color='$product_color' 
,size_id='$size_id' 
,product_description='$product_description' 
,brand_id='$brand_id' 
,category_id='$category_id' 
,supplier_id='$supplier_id' 
,product_standardPrice='$product_standardPrice' 
,product_unitPrice='$product_unitPrice' 
WHERE 
product_id='$product_id'"; 
$result=mysql_query($sql,$connection) or die(mysql_error()); 
header("location: products.php"); 
} 

請幫我與我的問題。我需要儘快解決這些問題。

這裏是我的情況下頁面products.php你需要它

<!--- DISPLAY TABLE --> 
<form method="post"> 
<table class="sortable" id="mytable" align="center"> 
<tr> 
<th><strong>Product #</strong></th> 
<th><strong>Product Name</strong></th> 
<th><strong>Color</strong></th> 
<th><strong>Size</strong></th> 
<th><strong>Description</strong></th> 
<th><strong>Brand</strong></th> 
<th><strong>Category</strong></th> 
<th><strong>Supplier</strong></th> 
<th><strong>Standard Price</strong></th> 
<th><strong>Unit Price</strong></th> 
<th><strong>Action</strong></th> 
</tr> 
<? 
include ("conn.php"); 
$sql="SELECT * 
,product_sizes.size_name as size_id 
,brands.brand_name as brand_id 
,categories.category_name as category_id 
,suppliers.supplier_name as supplier_id 
FROM products 
JOIN 
    product_sizes on product_sizes.size_id=products.size_id 
JOIN 
    brands on brands.brand_id=products.brand_id 
JOIN 
    categories on categories.category_id=products.category_id 
JOIN 
    suppliers on suppliers.supplier_id=products.supplier_id 
ORDER BY product_id"; 
$result=mysql_query($sql,$connection) or die(mysql_error()); 
while($row=mysql_fetch_array($result)) { 
?> 
<tr> 
<td><? echo $row['product_id']; ?></td> 
<td><? echo $row['product_name']; ?></td> 
<td><? echo $row['product_color']; ?></td> 
<td><? echo $row['size_id']; ?> </td> <!---- HOW TO DISPLAY NAME RATHER THAN ID? ---> 
<td><? echo $row['product_description']; ?></td> 
<td><? echo $row['brand_id']; ?></td> <!---- HOW TO DISPLAY NAME RATHER THAN ID? ---> 
<td><? echo $row['category_id']; ?></td> <!---- HOW TO DISPLAY NAME RATHER THAN ID? ---> 
<td><? echo $row['supplier_id']; ?></td> <!---- HOW TO DISPLAY NAME RATHER THAN ID? ---> 
<td>P <? echo $row['product_standardPrice']; ?></td> 
<td>P <? echo $row['product_unitPrice']; ?></td> 
<td><a href="forms.php?product_id=<? echo $row['product_id']?>&mode=editproduct">Edit</a></td> 
</tr> 
<? } ?> 
</table> 
</form> 
<!--- END --> 

和我的繼承人editform

########### EDIT PRODUCT FORM 

if($mode=="editproduct") 
{ 
$product_id=$_GET["product_id"]; 
$sql="SELECT * FROM products WHERE product_id='$product_id'"; 
$result=mysql_query($sql,$connection) or die(mysql_error()); 
while($row=mysql_fetch_array($result)) { 
$product_id=$row['product_id']; 
$product_name=$row['product_name']; 
$product_color=$row['product_color']; 
$size_id=$row['size_id']; 
$product_description=$row['product_description']; 
$brand_id=$row['brand_id']; 
$category_id=$row['category_id']; 
$supplier_id=$row['supplier_id']; 
$product_standardPrice=$row['product_standardPrice']; 
$product_unitPrice=$row['product_unitPrice']; 
} ?> 
<link href="default.css" rel="stylesheet" type="text/css"> 
<form method="post" action="forms.php"> 
<table align="center"> 
<tr> 
<td><strong>Edit Product</strong></td> 
<td><input type="hidden" name="product_id" value="<? echo $product_id ;?>" /></td> 
</tr> 
<tr> 
<td>Product Name</td> 
<td><input type="text" name="product_name" value="<? echo $product_name ;?>" /></td> 
</tr> 
<tr> 
<td>Color</td> 
<td><input type="text" name="product_color" value="<? echo $product_color ;?>" /></td> 
</tr> 
<tr> 
<td>Size</td> 
<td> 
<? 
    $query="SELECT * FROM product_sizes ORDER BY size_id ASC"; 
    $result = mysql_query ($query); 
    echo "<select name=size_id>"; 
    while($nt=mysql_fetch_array($result)) 
    { 
    echo "<option value=$nt[$size_id]>$nt[size_name]</option>"; 
    } 
    echo "</select>"; 
?> 
</td> 
</tr> 
<tr> 
<td>Description</td> 
<td><input type="text" name="product_description" value="<? echo $product_description ;?>" /></td> 
</tr> 
<tr> 
<td>Brand</td> 
<td> 
<? 
    $query="SELECT * FROM brands ORDER BY brand_name ASC"; 
    $result = mysql_query ($query); 
    echo "<select name=brand_id>"; 
    while($nt=mysql_fetch_array($result)) 
    { 
    echo "<option value=$nt[brand_id]>$nt[brand_name]</option>"; 
    } 
    echo "</select>"; 
?> 
</td> 
</tr> 
<tr> 
<td>Category</td> 
<td> 
<? 
    $query="SELECT * FROM categories ORDER BY category_name ASC"; 
    $result = mysql_query ($query); 
    echo "<select name=category_id>"; 
    while($nt=mysql_fetch_array($result)) 
    { 
    echo "<option value=$nt[category_id]>$nt[category_name]</option>"; 
    } 
    echo "</select>"; 
?> 
</td> 
</tr> 
<tr> 
<td>Supplier</td> 
<td> 
<? 
    $query="SELECT * FROM suppliers ORDER BY supplier_name ASC"; 
    $result = mysql_query ($query); 
    echo "<select name=supplier_id>"; 
    while($nt=mysql_fetch_array($result)) 
    { 
    echo "<option value=$nt[supplier_id]>$nt[supplier_name]</option>"; 
    } 
    echo "</select>"; 
?> 
</td> 
</tr> 
<tr> 
<td>Standard Price</td> 
<td><input type="text" name="product_standardPrice" value="<? echo $product_standardPrice ;?>"/></td> 
</tr> 
<tr> 
<td>Unit Price</td> 
<td><input type="text" name="product_unitPrice" value="<? echo $product_unitPrice ;?>" /></td> 
</tr> 
<tr> 
<td><input type="submit" name="editproduct" value="Save" /></td> 
</tr> 
</table> 
</form> 
<? } 

回答

0

除了在評論正在進行的討論,我想建議一些一般性的建議:

  1. 帶走周圍的更新字符串變量的數值引號(例如,改變size_id='$size_id'size_id=$size_id)。
  2. 將UPDATE字符串打印到瀏覽器中,以便您可以確切地看到要求數據庫執行的操作。
  3. 如果連接可能會造成麻煩,請嘗試子查詢甚至單獨查詢標籤(至少作爲測試)。
  4. 只更新與保存的不同字段。不應該真的需要這樣做,但是一個優點是您可以嘗試更改本地列。

  5. [新]更改SELECT *, tab2.foo as bar,...只是SELECT *(同時保持連接等)。

+0

將代碼更改爲「size_id = $ size_id」,因爲您所說的給了我更多的問題。我不善於編程,所以請和我一起裸照。如果你有時間或任何人有足夠的幫助我已經上傳文件到mediafire。請檢查您是否有時間。這裏的鏈接http://www.mediafire.com/file/dk90ggstcgh1ktd/database.zip – 2010-10-04 11:20:46

+0

好的,得到的文件。可能不會經歷一切,但這確實使事情變得更容易。我現在注意到,你有「SELECT *,product_sizes.size_name as size_id ...」,這樣size_id被兩次不同的定義(id和text)取回兩次。當然,其他一些領域也是如此。我現在需要離開,但我會在以後再尋找。 – igelkott 2010-10-04 16:18:18

+0

現在增加了建議#5。這可能使您的腳本更新使用標籤文本來更新ID字段。詢問這些額外的字段是不必要的,因爲「*」也從連接的表中獲取字段。 – igelkott 2010-10-04 19:28:44

0

允許在標記字段的編輯似乎容易出錯(拼寫)。如果您擁有可管理數量的類別(例如供應商),則可以使用帶有可讀名稱的下拉列表作爲標籤和ID號作爲值。

+0

是的,我的編輯窗體是在