Búsqueda de subcadenas en múltiples atributos -- php campo con object-oriented campo con sql campo con mysql camp codereview Relacionados El problema

Substring search on multiple attributes


1
vote

problema

Español
      public function getData ($term) {         $db = Database::getInstance();          $term = htmlentities($term);          //Kill the script if the term is blank         if ($term == "") {             die();         }          $query = "SELECT * FROM coils WHERE name like '%$term%' or                                              resistance like '%$term%' or                                              wraps like '%$term%' or                                             wire_one like '%$term%' or                                             wire_two like '%$term%' or                                             wire_three like '%$term%' or                                             wire_four like '%$term%' or                                             wire_five like '%$term%' or                                             wire_six like '%$term%'                                              LIMIT 25";         $prepareQuery = $db->getConnection()->prepare($query);         $result = $prepareQuery->execute();         $this->rowCount = $prepareQuery->rowCount();          //Return the Query         return $prepareQuery;     }   
Original en ingles
    public function getData ($term) {         $db = Database::getInstance();          $term = htmlentities($term);          //Kill the script if the term is blank         if ($term == "") {             die();         }          $query = "SELECT * FROM coils WHERE name like '%$term%' or                                              resistance like '%$term%' or                                              wraps like '%$term%' or                                             wire_one like '%$term%' or                                             wire_two like '%$term%' or                                             wire_three like '%$term%' or                                             wire_four like '%$term%' or                                             wire_five like '%$term%' or                                             wire_six like '%$term%'                                              LIMIT 25";         $prepareQuery = $db->getConnection()->prepare($query);         $result = $prepareQuery->execute();         $this->rowCount = $prepareQuery->rowCount();          //Return the Query         return $prepareQuery;     } 
           

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Debe crear índices de búsqueda de texto completo para estos campos y usar ... contra

De esta manera, puede cambiar esta línea a:

  $query = "SELECT * FROM coils MATCH ( name, resistance, wraps, wire_1, wire_2, wire_3, wire_4, wire_5, wire_6) AGAINST ('$term') LIMIT 25";   

Actualizado: Si desea que se suplique a la sustitución de cadenas al montar su $query (como lo hizo), asegúrese de haber desinfectado su 9988776665544335 Variable para prevenir los ataques de inyección de SQL. Pero es altamente recomendado usando bind Solution muy ampliamente expandido a continuación por @ Greg-Burghardt.

Más información sobre la coincidencia En Contra se puede encontrar aquí: > https://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html

 

You should create full text search indexes for these fields and use MATCH ... AGAINST

This way you can change this line to:

$query = "SELECT * FROM coils MATCH ( name, resistance, wraps, wire_1, wire_2, wire_3, wire_4, wire_5, wire_6) AGAINST ('$term') LIMIT 25"; 

Updated: If you want stick to string substitution when mounting your $query (like you did), make sure you have sanitized your $term variable in order to prevent SQL injection attacks. But it's highly recommended using bind solution nicely expanded below by @greg-burghardt.

More information about MATCH AGAINST can be found here: https://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html

 
 
       
       
2
 
vote
  • El nombre del método es getData , que es un nombre muy genérico, y algo así como getCoilsByTerm sería mejor. Como pregunta secundaria, ¿cuál es el nombre de la clase a la que pertenece este método? Saber que puede ayudarnos a encontrar un nombre mejor.

  • El $result se asigna, y luego nunca se usa. Para hacer las cosas aún más confusas, usted está devolviendo el objeto 99887766655443333 en su lugar. ¿No tendría más sentido devolver los resultados de la consulta? Además, sería fácil parametrizar el limit también:

      public function searchCoils($term, $limit = 25) {     if (empty($term)) {         throw new Exception('Term cannot be empty');     }      $db = Database::getInstance();     $query = "SELECT * FROM coils               MATCH (                 name,                 resistance,                 wraps,                 wire_1,                 wire_2,                 wire_3,                 wire_4,                 wire_5,                 wire_6               ) AGAINST (:term)               LIMIT :limit";     $statement = $db->getConnection()->prepare($query);     $statement->bindParam(':term', $term);     $statement->bindParam(':limit', $limit);      return $statement->execute(); }   
  • Por último, no llame die() Si el $term está vacío. Está bien detener la ejecución del programa, pero le da un poco de ayuda a Joe Scotto un poco de ayuda para depurar el fracaso: lanzar una excepción con un mensaje sensible.

Editar: I expandido en el partido de @ davidrissatocruz contra la consulta.

 
  • The method name is getData, which is a very generic name, and something like getCoilsByTerm would be better. As a side question, what is the name of the class to which this method belongs? Knowing that can help us come up with a better name.

  • The $result variable is assigned, and then never used. To make things even more confusing, you are returning the $preparedQuery object instead. Wouldn't it make more sense to return the results of the query? Plus, it would be easy to parameterize the limit as well:

    public function searchCoils($term, $limit = 25) {     if (empty($term)) {         throw new Exception('Term cannot be empty');     }      $db = Database::getInstance();     $query = "SELECT * FROM coils               MATCH (                 name,                 resistance,                 wraps,                 wire_1,                 wire_2,                 wire_3,                 wire_4,                 wire_5,                 wire_6               ) AGAINST (:term)               LIMIT :limit";     $statement = $db->getConnection()->prepare($query);     $statement->bindParam(':term', $term);     $statement->bindParam(':limit', $limit);      return $statement->execute(); } 
  • Lastly, don't call die() if the $term is empty. It's OK to halt the execution of the program, but give Future Joe Scotto a little help in debugging the failure: throw an exception with a sensible message.

Edit: I expanded upon @DavidRissatoCruz's MATCH AGAINST query.

 
 
     
     

Relacionados problema

-1  Buscar una transacción  ( Search for a transaction ) 
¿Podría tener una revisión rápida de mi código para ver si está a salvo de la inyección de SQL, etc. y sugerir alguna enmienda? <html> <head><title>Retriev...

4  Consulta para trazar un histograma de calificaciones de canciones  ( Query to plot a histogram of song ratings ) 
Escribí código para trazar una distribución de calificación, que se parece a esto: La función más importante es el stats Función: function stats($so...

0  ¿Cómo puedo mostrar los resultados de mysql_fetch_assoc en una tabla dinámica?  ( How can i display the results of mysql fetch assoc in a dynamic table ) 
Tengo una base de datos MySQL con varias columnas y dos filas de datos, hasta ahora. Estoy usando mysql_fetch_assoc para devolver los datos en la base de dato...

41  Conexión de la base de datos en constructor y destructor  ( Database connection in constructor and destructor ) 
Estoy jugando con diferentes maneras de hacer la interacción de la base de datos en PHP, y una de las ideas con las que he estado jugando está conectando a la...

7  PHP / Doctrine Bootstrap para revisión  ( Php doctrine bootstrap for review ) 
Aquí está mi bootstrap.php para mi aplicación PHP / MySQL / Doctrine. Es mi primera aplicación PHP, así que estoy interesado en aprender de la experiencia d...

30  Codeigniter Active Record Subqueries  ( Codeigniter active record subqueries ) 
Yo uso CodeIgNiter en el trabajo, y uno de nuestros archivos modelo tuvo muchas subcarías en ella. Originalmente tuve que escribir manualmente cada subconsu...

1  Un sistema similar / a diferencia de MySQL y PDO  ( A like unlike system using mysql and pdo ) 
He creado un sistema similar / a diferencia. El usuario hace clic en uno para indicar un "Me gusta" y hacer clic nuevamente para "A diferencia de". Actualment...

10  Comparando datos en 2 tablas en diferentes servidores con suma de comprobación  ( Comparing data in 2 tables on different servers with checksum ) 
Así que he tenido un problema en el que necesito comparar datos en 2 tablas diferentes en dos servidores diferentes. Ahora, sé que MySQL admite CHECKSUM TABL...

2  Presentar los resultados de la base de datos basados ​​en la presentación del formulario  ( Present database results based on form submission ) 
Cuando seleccionamos la lista 'Info' en el campo Seleccionar, el artículo con la característica de tipo 'Información' apareció automáticamente, y cuando selec...

5  Hibernate Insertar con clave externa  ( Hibernate insert with foreign key ) 
Î ™ tiene la siguiente base de datos: SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; CREATE TABLE IF NOT EXISTS `Authors` (...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos