Estoy tratando de consultar una determinada cadena / palabra y consultar un montón de resultados relacionados con ella, pero tengo un problema con la declaración SQL.
Por ejemplo: cuando intento buscar property_code "TA001" con el código actual, volverá a consultar TA001, CTA001, JTA001, etc. Solo quiero el resultado exacto enviado.

Intenté reemplazar la función LIKE con un = y también eliminar el comodín% 's, pero no devolví ningún resultado. Cualquier ayuda sería apreciada. aquí está el código:

<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');
$search_output = "";
if(isset($_POST['searchquery']) && $_POST['searchquery'] != ""){
$searchquery = preg_replace('#[^a-z 0-9]-#i', '', trim(strtoupper($_POST['searchquery'])));
if($_POST['filter1'] == "properties"){
    $sqlCommand = "(SELECT id, property_code, street, street2, city, state, zip FROM properties WHERE property_code LIKE '% $searchquery %')";
} else if($_POST['filter1'] == "vendor"){
    $sqlCommand = "SELECT id, vendor_name FROM vendor WHERE vendor_name LIKE '%$searchquery%'";
} 
    include_once("database.php");
    $query = mysql_query($sqlCommand) or die(mysql_error());
$count = mysql_num_rows($query);
if($count > 1){
    $search_output .= "<hr />$count results for <strong>$searchquery</strong><hr />$sqlCommand<hr />";
    while($row = mysql_fetch_array($query)){
        $id = $row["id"];
        $property_code = $row["property_code"];
        $street = $row["street"];
        $street2 = $row["street2"];
        $city = $row["city"];
        $state = $row["state"];
        $zip = $row["zip"];
        $search_output .= "Item ID: $id: - $property_code, $street, $street2, $city, $state $zip<br />";
            } // close while
} else {
    $search_output = "<hr />0 results for <strong>$searchquery</strong><hr />$sqlCommand";
}
}
?>
0
sammich 12 abr. 2012 a las 00:43
1
Si quieres exacto, ¿por qué estás usando LIKE y comodín%
 – 
user557846
12 abr. 2012 a las 00:46
Tienes razón, debería ser: WHERE property_code = '$ searchquery' .. ¿estás seguro de que tienes una fila con esa información? También debe asegurarse de tener cuidado con XSS al hacer eco de sus resultados.
 – 
tcole
12 abr. 2012 a las 00:47
Reemplazar la consulta LIKE con una = (etc.) es exactamente lo que habría sugerido. Debe mirar los valores en esa columna para ver si hay espacios en blanco u otros caracteres inesperados que están causando que falle la coincidencia exacta. Además, debe utilizar declaraciones preparadas (PDO) para evitar la inyección de SQL.
 – 
Matt Ball
12 abr. 2012 a las 00:47

1 respuesta

La mejor respuesta

En esta línea:

   $sqlCommand = "(SELECT id, property_code, street, street2, city, state, zip FROM properties WHERE property_code LIKE '% $searchquery %')";

Tiene un espacio en la condición LIKE entre '% y $ searchquery; ese es el problema uno.

Y si desea buscar solo registros que comiencen con $ searchquery string, tal vez intente así:

if($_POST['filter1'] == "properties"){
$sqlCommand = "SELECT id, property_code, street, street2, city, state, zip FROM properties WHERE property_code LIKE '{$searchquery}%'";
} else if($_POST['filter1'] == "vendor"){
    $sqlCommand = "SELECT id, vendor_name FROM vendor WHERE vendor_name LIKE '{$searchquery}%'";
} 

Y si quieres una coincidencia exacta, prueba esto:

if($_POST['filter1'] == "properties"){
    $sqlCommand = "SELECT id, property_code, street, street2, city, state, zip FROM properties WHERE property_code = '{ $searchquery'";
} else if($_POST['filter1'] == "vendor"){
    $sqlCommand = "SELECT id, vendor_name FROM vendor WHERE vendor_name = '{$searchquery}'";
} 
1
castor 12 abr. 2012 a las 01:21
Gracias chicos. Buscaré en todo este tomm y veré qué puedo encontrar que funcione.
 – 
sammich
12 abr. 2012 a las 02:06