tutorial statement prepared preparadas español ejemplos consultas php pdo

statement - php pdo execute



¿Cómo creo una consulta parametrizada PDO con una declaración LIKE? (6)

Lo descubrí justo después de publicar:

$query = $database->prepare(''SELECT * FROM table WHERE column LIKE ?''); $query->execute(array(''value%'')); while ($results = $query->fetch()) { echo $results[''column'']; }

Aquí está mi intento de hacerlo:

$query = $database->prepare(''SELECT * FROM table WHERE column LIKE "?%"''); $query->execute(array(''value'')); while ($results = $query->fetch()) { echo $results[''column'']; }


$query = $database->prepare(''SELECT * FROM table WHERE column LIKE ?''); $query->bindValue(1, "%$value%", PDO::PARAM_STR); $query->execute(); if (!$query->rowCount() == 0) { while ($results = $query->fetch()) { echo $results[''column''] . "<br />/n"; } } else { echo ''Nothing found''; }


También puedes probar este. Me enfrento a un problema similar pero obtuve el resultado después de la investigación.

$query = $pdo_connection->prepare(''SELECT * FROM table WHERE column LIKE :search''); $stmt= $pdo_connection->prepare($query); $stmt->execute(array('':search'' => ''%''.$search_term.''%'')); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($result);


PDO escapa "%" (puede conducir a la inyección sql) : el uso del código anterior dará los resultados deseados cuando se busca hacer coincidir cadenas parciales PERO si un visitante escribe el carácter "%" aún obtendrá resultados incluso si no lo hace t tiene algo almacenado en la base de datos (puede llevar inyecciones sql)

He intentado con muchas variaciones, todo con el mismo resultado. PDO está escapando del "%" liderando los resultados de búsqueda no deseados / no citados.

Pensé que valía la pena compartirlo si alguien ha encontrado una palabra al respecto, por favor compártelo


Esto funciona:

search `table` where `column` like concat(''%'', :column, ''%'')


Para usar Me gusta con% coincidencia parcial también puede hacer esto: column like concat(''%'', :something, ''%'') (en otras palabras, usando signos de% explícitamente no escaneados que definitivamente no son entradas del usuario) con el parámetro nombrado :something

Editar: Una sintaxis alternativa que he encontrado es usar el operador de concatenación: ||, así que se volverá simplemente: where column like ''%'' || :something || ''%'' etc where column like ''%'' || :something || ''%'' etc

@bobince menciona aquí que:

La dificultad surge cuando desea permitir un carácter literal % o _ en la cadena de búsqueda, sin que actúe como un comodín.

Así que eso es algo más a tener en cuenta al combinar me gusta y parametrización.