Nueva pregunta

Pregunta:

Fecha: 13-12-2017 06:52:00 (En Español)

Error en autocomplete[Resuelta]

Hola,

Tengo un extraño no se si error o que será, pero en la base de datos todo parece bien, no hay espacios ni antes ni después ni tiene caracteres ocultos y ni están vacíos los campos solicitados, pero cuando hago una búsqueda por nombre dentro del campo del autocomplete no me aparece la persona o las personas homónimas a la que se busca, no es solo con ese nombre...es más, son varios nombres que me aparecen en null cuando el campo tiene un nombre, o apellido, cuando la busco por medio del id si aparece el id, pero el nombre sale null. Dentro del buscador que está en la misma hoja si aparece, más no en el autocomplete, la base es pequeña, tiene solo 32000 clientes. Les dejo unas capturas y el código utilizado, espero me puedan ayudar.

No creo que llegue a un limite de muestras, ya que luego de mostrar varios en null por medio de la consola vuelve a aparecer otros homónimos bien, con id mucho después de esa serie en null.... por ejemplo me muestra bien 150 homónimos luego pasan como 50 en null y al final se recupera y me muestra otros 10, 5 , etc con el nombre bueno.

EDITADO: pongo los link ya que no sé porque no se ven las imágenes

en el autocomplete por medio del id en el formulario / link 1 autocomplete 1 / link 2 autocomplete 2

[url=https://ibb.co/k7FOC6][/url]

[url=https://imgbb.com/][/url]

En el autocomplete por medio del id en la consola me sale esto / / link consola

[url=https://ibb.co/jGedem][/url]

En el buscador si aparece / / link buscador

[url=https://imgbb.com/][/url]

Imagen del id en la base / / link base

[url=https://imgbb.com/][/url]

Acá el código JS
	$('#clienteId').autocomplete({
		source: "scripts/cliente.php",
		minLength: 1,
		select:function(evt, ui){
			this.form.nombre.value = ui.item.nombre;
		}
	});


Acá el llamado a la base
<?php
	include_once($_SERVER['DOCUMENT_ROOT'] . '/inc/configs.php');
	if(isset($_REQUEST['term']) && !empty($_REQUEST['term'])){
		$search = trim(strip_tags($_REQUEST['term']));
 
		$search_terms = explode(" ", $search);
		$term_count = 0;
		$q = "";
		$result = array();
		$i = 0;
 
		foreach ($search_terms as $term) {
			$term_count++;
			if($term_count === 1){
				$q .= "CONCAT(`nombre`,' ',`apellido`) LIKE '%$term%' "; 
   			}else{
   				$q .= "AND CONCAT(`nombre`,' ',`apellido`) LIKE '%$term%' ";
   			}
  		}
 
  		$sql = $conn->query("SELECT `idCliente`, CONCAT(`nombre`,' ',`apellido`) AS nombre FROM `CLIENTES` WHERE $q");
 
  		$num = $sql->rowCount();
 
  		if($num > 0){
  			while($row = $sql->fetch(PDO::FETCH_ASSOC)){
  				$result[$i] =  array(
  					'value' => $row['nombre'],
  					'idCliente' => $row['idCliente']
  				);
  				$i++;
   			}
  		}
 
  		$json_result = json_encode($result);
  		echo $json_result;
 	}
?>
Etiquetas: Autocompletar (Autocomplete) - MySQL - PHP - Pregunta Votos: 0 - Respuestas: 5 - Vistas: 5 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 13-12-2017 07:29:47 Tu problema casi estoy seguro es la codificacion, codifica cada elemento del arreglo , ejemplo basico:

    variable arrayresultados=array();
    resultados while(resultado) {
    variablearray = array();
    variablearray['nombre']=resultado['nombre'];
    variablearray['id']=resultado['id'];
    arrayresultados[]=json_encode(variablearray);
    }

    $json_result = json_encode($arrayresultados);

    Pues no solo debes codificar al final enviar, sino cada uno que esta dentro (inclusive dever verificar la asentuacion, utf8, si estan bien)

    Saludos...

    Stryfe™
      Votos: 0 - Link respuesta
     
  • Fecha: 13-12-2017 07:45:18 Ya el utf8 lo tengo pre codificado en la llamada de la base, acá te dejo el código, también me muestra tanto nombres acentuados como los que no lo tengan o no se los hayan puesto... es raro el error

    
    		$conn = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME."",DB_USER,DB_PASS);
    		$conn->exec("set names utf8");
    		$conn->exec('SET lc_time_names = "es_ES"');
    		$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    			
    
      Votos: 0 - Link respuesta
     
  • Fecha: 13-12-2017 08:16:24 No es lo mismo en la bd, que requieras, a lo que el php te muestra, intenta entrar desde la liga normalmente, o en <pre> para que veas exactamente lo que te regresa, y has lo que te comento de codificar el arreglo primero y al final la matriz, no solo la matriz...
    Saludos :)
      Votos: 0 - Link respuesta
     
  • Fecha: 13-12-2017 09:32:05 Hola,
    Hice como me lo mencionaste e igual me deja los registros en null fijate en la imagen, más abajo el código:
    [url=https://imgbb.com/][/url]

     		$num = $sql->rowCount();
     
      		if($num > 0){
      			while($row = $sql->fetch(PDO::FETCH_ASSOC)){
      				$variablearray = array();
      				$variablearray['nombre']=$row['nombre'];
      				$variablearray['idCliente']=$row['idCliente'];
      				$arrayresultados[]=json_encode($variablearray);
       			}
      		}
     
      		$json_result = json_encode($arrayresultados);
      		echo $json_result;
    
      Votos: 0 - Link respuesta
     
  • Fecha: 13-12-2017 09:57:44 Ya encontré el error... al parecer cuando haces un CONCAT y entre las filas hay valores NULL (que no esten vacíos ' ' , sino que explíxitamente diga NULL) al parecer no lo agrega correctamente y muestra el NULL como resultado final.

    Para arreglar eso se debe de agregar COALESCE a cada fila del concat, por ejemplo:

    CONCAT(COALESCE(`nombre`,''),' ',COALESCE(`apellido`,''))
    
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com