Tu problema sucede porque estás usando los mismos nombres para los campos de las dos tablas, lo que es una muy mala costumbre. Y encima, estás pidiendo (innecesariamente) por TODOS los campos de las dos tablas, sin importar como se llaman.
Como la base devuelve todo, y tu no le has puesto alias para identificarlos mejor, el lenguaje de programación no puede adivinar cual es el correcto.
Es conveniente que los campos ID de tablas diferentes NO SE LLAMEN DE LA MISMA FORMA. Lo usual es ponerles un prefijo o sufijo que permita una mejor identificación del campo.
En la práctica, lo conveniente es que jamás exista un campo entre dos tablas, cuyo nombre sea exactamente el mismo, a menos que ese campo sea PK en uno y FK en la otra (método para relacionar las FK de forma segura).
Hay dos soluciones posibles:
1) Indicas uno a uno los campos en el SELECT, poniendo alias a aquellos que puedan ser ambiguos, y usando esos alias para la aplicación.
2) Cambias los nombres de los campos de la tabla de modo que sean unocos para la base.
El primer caso sería por ejemplo:
Código SQL:
Ver originalSELECT p.id producto_id, p.nombre producto_nombre, cat.id categ_id, cat.nombre categ_nombre
FROM productos P INNER JOIN categorias cat ON p.categoria = cat.id
WHERE cat.categoria = $cat
La segunda:
Cita: PRODUCTOS(prod_id, prod_nombre. categ_id)
CATEGORIA (categ_id, categ_nombre, ...)
De esa forma nunca habrá campos ambiguos.
¿Se va entendiendo?
Posdata: Que lo hagas en PHP es
irrelevante. Tendrías el mismo rpoblema en cualquier lenguaje...