2013-06-21 51 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