2013-06-21 2 views
0

Salut J'essaie de echo Le nom du produit du Product Table mais à la place il echo le nom du Category table à la place. Est-ce que c'est un moyen d'empêcher cela de changer le nom d'une des deux tables?PHP écho fausse valeur

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 

AOP:

$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. Roma nouvelle question – Emily

+2

'Nom' est ambigu. Vous devez utiliser 'SELECT Product.Name as Name', ou mieux,' SELECT Product.Name comme ProductName', puis faire '$ product_name = $ row ['ProductName'];' – jraede

+0

En outre, ce code ne devrait pas fonctionner. Vous obtiendrez une erreur "Nom est ambigu" si vous l'exécutez. Sans oublier que 'Name' n'est pas une table que vous sélectionnez, donc' Name.Category' échouerait aussi. – jraede

Répondre

1

Essayez ceci:

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 

Ensuite, dans votre PHP, faites ceci:

$product_name = $row["PName"]; 

Ainsi, votre produit final devrait être le suivant:

$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

merci pour votre aide. fonctionne très bien – Emily

0

Lorsque vous allez chercher les valeurs, PHP n'utilise pas la table pour qualifier le nom. Il utilisera la dernière valeur, donc Name se référera au nom de la catégorie. Vous pouvez inverser l'ordre que vous sélectionnez Product/Category noms, mais il est plus logique d'utiliser un alias.

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

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

merci pour votre aide – Emily

0

En dehors de la corrections déjà mentionnées, vous n'engagez pas ny variables, vous les injectez simplement dans votre instruction sql.

Vous devez utiliser:

$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); 

Au lieu de:

$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); 

Notez que vous devez utiliser le : au lieu du $ et que vous n'avez pas besoin de citer vos variables.

+0

parce que cette requête est pour un panier, la «taille $» est définie au-dessus du code. mais si ce n'était pas pour cela, j'utilise normalement la façon dont vous venez de le signaler. acclamations – Emily

+1

juste pris un très bon coup d'oeil maintenant et je vois pourquoi ce n'était pas la meilleure approche ... à cause de l'injection sql. Merci encore – Emily