2013-06-21 30 views
0

嗨我正在嘗試echo產品的名稱從Product Table而不是它echo而不是Category table的名稱。 他們是否可以阻止這個改變名稱從兩個表中的一個?PHP回顯錯誤值

Table: Product 

    Pid  Name 
    1  man 
    2  woman 
    3  child 


Table: Category 

    CatID Name  Pid 
    1  pen  1 
    2  pen  1 
    3  pencil  2 
    3  red_pen 3 


Table: active_product 

    ATpid size pid price 
    1  12 1  10 
    2  14 2  15 
    3  16 3  20 
    4  18 4  30 

PDO:

$stmt = $conn->prepare(" 
    SELECT Product.Name, Category.Name, size, Price 
    FROM active_Product, Product, Category 
    WHERE Product.ProdID ='$item_id' 
    AND size = '$size ' 
    AND Category.Name = '$pcategory' 
    Limit 1"); 
$stmt->bindParam('$item_id',$item_id); 
$stmt->bindParam('$size',$size); 
$stmt->bindParam('$pcategory',$pcategory); 
$stmt->execute(); 
foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row){ 
    $product_name = $row["Name"]; 
+0

@ A.S。羅馬尼亞新問題 – Emily

+2

'姓名'是不明確的。您需要使用'SELECT Product.Name as Name',或者更好的方法是'SELECT Product.Name as ProductName',然後執行'$ product_name = $ row ['ProductName'];' – jraede

+0

此外,該代碼不應該起作用。如果你運行它,你會得到一個「名稱不明確」的錯誤。更不用說'Name'不是你正在選擇的表,所以'Name.Category'也會失敗。 – jraede

回答

1

試試這個:

SELECT Product.Name AS PName, Category.Name AS CName, size, price 
FROM active_product, Product, Category 
WHERE Product.pid=1 AND size=10 AND Name.Category="pen" Limit 1 

然後在你的PHP,這樣做:

$product_name = $row["PName"]; 

所以您的最終產品應該是這樣的:

$stmt = $conn->prepare(" 
    SELECT Product.Name AS PName, Category.Name AS CName, size, Price 
    FROM active_Product, Product, Category 
    WHERE Product.ProdID ='$item_id' 
    AND size = '$size ' 
    AND Category.Name = '$pcategory' 
    Limit 1"); 

... 

foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row){ 
    $product_name = $row["PName"]; 
+0

感謝您的幫助。效果很好 – Emily

0

當你獲取的值,PHP不使用表格來限定名稱。它將使用最後的值,因此Name將引用類別名稱。您可以撤銷您選擇Product/Category名稱的順序,但使用別名更有意義。

SELECT Product.Name AS proName, Category.Name AS catName 

$product_name = $row['proName']; 
+0

感謝您的幫助 – Emily

0

除了更正已經提到,你沒有約束力ny變量,你只需要在你的sql語句中注入它們。

你應該使用:

$stmt = $conn->prepare(" 
SELECT Product.Name as productName, Category.Name as categoryName, size, Price 
FROM active_Product, Product, Category 
WHERE Product.ProdID =:item_id 
AND size = :size AND Category.Name = :pcategory Limit 1"); 
$stmt->bindParam(':item_id',$item_id); 
$stmt->bindParam(':size',$size); 
$stmt->bindParam(':pcategory',$pcategory); 

相反的:

$stmt = $conn->prepare(" 
SELECT Product.Name, Category.Name, size, Price 
FROM active_Product, Product, Category 
WHERE Product.ProdID ='$item_id' 
AND size = '$size ' AND Category.Name = '$pcategory' Limit 1"); 
$stmt->bindParam('$item_id',$item_id); 
$stmt->bindParam('$size',$size); 
$stmt->bindParam('$pcategory',$pcategory); 

請注意,您需要使用:代替$和你不需要引用您的變量。

+0

,因爲這個查詢是針對購物籃的'$尺寸'是在代碼上面定義的。但如果不是這樣,我通常會用你剛纔指出的方式。歡呼聲 – Emily

+1

現在看起來很好看,我明白了爲什麼這不是最好的方法...因爲sql注入。再次感謝 – Emily