sql >> Base de Datos >  >> RDS >> Mysql

PHP:¿buscar en la base de datos mysql usando múltiples listas desplegables de selección?

$clause = " OR ";//Change  to OR after 1st WHERE

El operador OR anterior hará que su criterio de dónde seleccione un registro incluso si 1 palabra clave coincide con el campo attr. Cámbielo a " AND " para esperar que se apliquen todas las palabras clave.

Además, el criterio ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" parece aplicarse a todas las palabras clave, por lo que este criterio debe agregarse una vez, no en cada iteración del bucle. $currentproduct =$_POST['product']; la fila también debe moverse al frente del bucle.

EDITAR:para reflejar el cambio del operador a AND y no devolver filas.

...ATTRIBUTES.attr LIKE BINARY '$c'...

Si no hay comodines en $c, entonces el criterio anterior requerirá que la palabra coincida con el campo attr como si se hubiera usado el operador =, lo que es poco probable que suceda. Deben incluirse comodines en la búsqueda:'%$c%'

Además, algo de protección contra la inyección de sql también estaría bien.

EDIT2:si cada atributo se almacena en su propio registro, entonces complica un poco las cosas, ya que el criterio where se evalúa en un solo registro, no en una colección de ellos.

Le daré un comando de selección de muestra, pero tendrá que incorporarlo en su código php.

select product_details.* FROM product_details INNER JOIN
    (select product_details.id, count(ATTRIBUTES.id) as total
     FROM `product_details`
     INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id
     WHERE ATTRIBUTES.attr in (...)
     GROUP BY product_details.id
     HAVING total=...) as t
on t.id=product_details.id

La subconsulta cuenta cuántos atributos coincidieron para un producto y los elimina, donde el recuento no es igual a la cantidad de parámetros enviados a través del formulario. La consulta externa obtiene los detalles del producto para aquellos en los que coincidió el conteo.

Para ... en la cláusula in(), debe proporcionar una lista de palabras clave separadas por comas, como:"'computadora', 'manzana'". Utilice la función implode() en php y la concatenación sztring para obtener los resultados.

Para ... en la cláusula de tener, sustituya el número de palabras clave en la matriz $_POST['keyword'] (sin embargo, debe verificar en el código si es una matriz o solo un valor único).

Aún así, debe considerar el impacto de la inyección de sql en su código.