Solucionado

3935 visitas 15 respuestas

Mostrar registros popr columnas...

Buen día! Disculpen si es molesta mi consulta, solo que llevo algunos días buscando y probando y no he podido con lo siguiente:

Tengo una base de datos la cual al consultarla (mostrarla en la web) muestra los resultados de esta forma:

EMPLEADO : 05488601
FIRST NAME : Juan
LAST NAME : Gomez
SECOND NAME : Reyes
DEPARTAMENTO : Abarrotes
PUESTO : Intendente
TURNO : Dia

EMPLEADO : 15649553
FIRST NAME : Fernando
LAST NAME : Tejeda
SECOND NAME : Perez
DEPARTAMENTO : Verduras
PUESTO : Asistente
TURNO : Tarde

Pero yo quisiera verlo asi:

ID EMPLEADO FIRST NAME LAST NAME SECOND NAME DEPARTAMENTO PUESTO TURNO

1 05488601 Juan Gomez Reyes Abarrotes Intendente Dia

2 15649553 Fernando Tejeda Perez Verduras Asistente Tarde

Este es el código (que por cierto lo encontré buscando , no lo hice yo). (He probado con otros, pero me gusta este porque no tengo que estar indicando los nombres de los campos, pero si ustedes los que saben me recomiendan otra cosa, intentare.)

<? // Buscador para tablas MySQL escrito en PHP. Por Alex para www.webtaller.com // Creado el 13-10-2003

//////////////////////////// // Configuración ///////////////////////////

//modifica estas variables según tu servidor de MySQL

$bd_servidor = "localhost";

$bd_usuario = "myuser";

$bd_contrasenya = "mypass";

$bd_bdname = "negocio";

$bd_tabla = "empleados"; // Tabla donde se harán las búsquedas

// Conexión y selección de la base de datos

$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);

mysql_select_db($bd_bdname,$link);

//////////////////////////// // Formulario ///////////////////////////

?>

Introduce las palabras para la búsqueda

Buscar en: <?php //Con este query obtendremos los campos por los cuales el usuario puede buscar $result = mysql_query("SHOW FIELDS FROM `$bd_tabla`",$link); while($row = mysql_fetch_row($result)) { // en $row[0] tenemos el nombre del campo // de esta manera no necesitamos conocer el nombre de los campos // por lo que cualquier tabla nos valdrá ?> <?php echo $row[0]; ?> <?php } ?> Palabra(s):

<?

//////////////////////////// // Proceso del Formulario /////////////////////////// /VARIABLES POR POST /

$numero2 = count($_POST); $tags2 = array_keys($_POST); // obtiene los nombres de las varibles $valores2 = array_values($_POST);// obtiene los valores de las varibles

// crea las variables y les asigna el valor for($i=0;$i<$numero2;$i++){ $$tags2[$i]=$valores2[$i]; }

if(isset($_POST['enviar'])) {

// Solo se ejecuta si se ha enviado el formulario

$query = "SELECT * from $bd_tabla WHERE {$_POST['campo']} LIKE '%{$_POST['palabra']}%'";

$result = mysql_query($query,$link);

$found = false; // Si el query ha devuelto algo pondrá a true esta variable

while ($row = mysql_fetch_array($result)) {

$found = true;

echo "

";

foreach($row as $nombre_campo => $valor_campo) {

// Tenemos que mostrar todos los campos de las filas donde se haya // encontrado la búsqueda.

if(is_int($nombre_campo)) {

continue; //Cuando hacemos mysql_fetch_array, php genera un array // con todos los valores guardados dos veces, uno con // índice numérico y otro con índice el nombre del campo. // Solo nos interesa el del nombre del campo.

}

echo "".$nombre_campo." : ".$valor_campo.""; }

echo "

"; //Este enlace no es necesario porque siempre tenemos disponible el formulario de busqueda. //echo "Realizar busqueda en limpio.";

}

if(!$found) {

echo "No se encontró la palabra introducida"; //Este enlace no es necesario porque siempre tenemos disponible el formulario de busqueda. //echo "Realizar otra busqueda."; }

} ?>

Espero que se muestre bien el mensaje y que alguien tenga tiempo de ayudarme.

De antemano gracias!

por mty28q

hace: 01 May 09

Respuestas

Prueba poniendolo Así>

Nombre del campoContenido del campo
1

Lleva razón hahahano, yo, por si las moscas había preparado un script que te lo sacara en columnas, aunque tuve que cambiar más cosas, puesto que pareces estar usando variables globales. He movido el hilo a PHP pues es el tema es realmente PHP y HTML. Este es el script:

<?php $bd_servidor = "localhost"; $bd_usuario = "root"; $bd_contrasenya = "contraseña"; $bd_bdname = "nombrebase"; $bd_tabla = "nombretabla"; // Tabla donde se harán las búsquedas

// Conexión y selección de la base de datos

$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);

mysql_select_db($bd_bdname,$link); $listacampos=array(); $palabra = $_POST['palabra']; $campo=$_POST['campo']; $datos= array();

//////////////////////////// // Formulario ///////////////////////////

?>

Introduce las palabras para la búsqueda

Buscar en: <?php //Con este query obtendremos los campos por los cuales el usuario puede buscar $result = mysql_query("SHOW FIELDS FROM `$bd_tabla`",$link); while($row = mysql_fetch_row($result)) { $listacampos[]=$row[0];//cargamos los nombres de los campos en un array // en $row[0] tenemos el nombre del campo // de esta manera no necesitamos conocer el nombre de los campos // por lo que cualquier tabla nos valdrá ?> <?php echo $row[0]; ?> <?php } ?> Palabra(s):

<?php

if(isset($palabra) && !empty($palabra) && isset($campo) && !empty($campo)) {//si hemos elegido un campo y hemos escrito palabra

// Solo se ejecuta si se ha enviado el formulario

$query2 = "SELECT * from $bd_tabla WHERE {$campo} LIKE '%{$palabra}%'";//consulta buscando en el campo elegido la palabra escrita $result2 = mysql_query($query2,$link); echo "

"; $total=count($listacampos);//cuento los elementos de la listacampos foreach ($listacampos as $valor) {echo "$valor";}//primero mostramos en la primera línea de una tabla con los nombresde los campos echo ""; echo ""; do {for ($i=0;$i <= $total-1 ;$i++) {//mostramos los datos de cada línea echo "".$datoscampos[$i]."";} echo "";} while ($datoscampos= mysql_fetch_array($result2)); //mostramos todas las líneas echo ""; } ?>
1

por jurena

hace: 02 May 09

Buscando en el listado general me encuentro este mismo item; se supone que estaba en otro "hilo" o algo asi, podrian indicarme donde esta ??

De otra parte, el form de este ultimo codigo envia a "busca.php", pero no esta este codigo.

Agradezco su colaboracion. Saludos!

0

Que tal ! Pues muchas gracias por haberme ayudado, en verdad les agradezco el poco ó mucho tiempo que se hayan tomado para ayudarme .

Les tengo otras preguntas.

Al código le agregué "trim" para eliminar los espacios en blanco, por aquello de que tecleen mal, sin embargo no se si se pueda ó deba hacer de otra forma, yo lo hice así:

mysql_select_db($bd_bdname,$link); $listacampos=array(); //No se si aquí hubiera podido colocar el trim, pero lo intenté y no pude hacerlo funcionar $palabra = $_POST['palabra']; $campo=$_POST['campo']; $datos= array(); //Aquí agregué el "trim" y aunque funciona no se si sea lo correcto ó lo mejor $palabra = trim($palabra);

Y por otra parte quisiera orientación de que puedo hacer para que este ó cualquier otro código (script) sea más seguro y no sea tan fácil que me hackeen.

Para "Jureno":

está bien usar variables globales ó es mejor especificarlas? Que me recomiendan?

Para "Kubuntero":

este mismo script sirve de formulario y de action, es decir, no ocupas dos archivos, solo éste, a este mismo archivo lo guardas con el nombre "busca.php" para que él mismo se ejecute, es decir, el nombre que le des a este script, debe ir en el "action=", auqnue también puedes ponerle cualquier nombre al script y en action="" dejar solo las comillas.

Saludos y mil gracias a todos!

0

por mty28q

hace: 02 May 09

No es recomendable usar variables globales. He puesto el trim, aunque sin probarlo. He añadido algunos controles. Lo he hecho en un mismo archivo, porque pensé que era lo que querías. Lo del busca.php es el nombre de mi archivo de prueba. Me olvidé de cambiarlo (pido disculpas). Tampoco puse ninguna atención al uso más preciso de comillas y a evitar la sql injection. Echa un vistazo a la función mysql_real_escape_string(); y también al artículo sobre el uso de comillas.

<?php $bd_servidor = "localhost"; $bd_usuario = "root"; $bd_contrasenya = ""; $bd_bdname = "nombrebase"; $bd_tabla = "nombretabla"; // Tabla donde se harán las búsquedas

// Conexión y selección de la base de datos

$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);

mysql_select_db($bd_bdname,$link); mysql_query("set names 'utf8'"); $listacampos=array(); $palabra = trim($_POST['palabra']); $campo=$_POST['campo']; $datos= array();

//////////////////////////// // Formulario ///////////////////////////

?>

Introduce las palabras para la búsqueda

Buscar en: <?php //Con este query obtendremos los campos por los cuales el usuario puede buscar $result = mysql_query("SHOW FIELDS FROM `$bd_tabla`",$link); while($row = mysql_fetch_row($result)) { $listacampos[]=$row[0];//cargamos los nombres de los campos en un array // en $row[0] tenemos el nombre del campo // de esta manera no necesitamos conocer el nombre de los campos // por lo que cualquier tabla nos valdrá ?> <?php echo $row[0]; ?> <?php } ?> Palabra(s):

<?php

if(isset($palabra) && !empty($palabra) && isset($campo) && !empty($campo)) {//si hemos elegido un campo y hemos escrito palabra

// Solo se ejecuta si se ha enviado el formulario

$query2 = "SELECT * from $bd_tabla WHERE {$campo} LIKE '%{$palabra}%'";//consulta buscando en el campo elegido la palabra escrita $result2 = mysql_query($query2,$link); $conta=mysql_num_rows($result2);

if ($conta==false) {echo "no se ha encontrado nada";} else { echo "

"; $total=count($listacampos);//cuento los elementos de la listacampos foreach ($listacampos as $valor) {echo "$valor";}//primero mostramos en la primera línea de una tabla con los nombresde los campos echo ""; echo ""; do {for ($i=0;$i <= $total-1 ;$i++) {//mostramos los datos de cada línea $datcamp=$datoscampos[$i]; if (is_null($datcamp)==true){$datcamp="--";} else {$datcamp = $datcamp;} echo "".$datcamp."";} echo "";} while ($datoscampos= mysql_fetch_array($result2)); //mostramos todas las líneas echo ""; } } else {echo "seleccione un campo y escriba una palabra";} ?>
1

por jurena

hace: 02 May 09

Gracias Jurena! Por mí está bien en un solo archivo (un solo script), de todos modos lo puedo cambiar a dos archivos, pero yo creo que es igual (a menos que ustedes me indiquen lo contrario), esa respuesta era para Kubuntero.

Solo me quedó una duda de tu última respuesta Jurena: No comprendo la parte que dice:

$datcamp=$datoscampos[$i];

if (is_null($datcamp)==true){$datcamp="--";} else {$datcamp = $datcamp;}

Ya que me imprime los dos signos negativos en la primera fila en todas las columnas en cualquier busqueda encontrada.

Bueno, no es necesario que respondan, ya mucho me han ayudado y se los agradezco!

Saludos y buen fín de semana!

0

por mty28q

hace: 02 May 09

Eso es para que cuando en un campo tengas el valor null ponga marco a la casilla; si no haces eso verás la casilla o espacio, pero sin marco. Si quieres el espacio en blanco, escribes, como he hecho en esta versión, &nbsp. Además, he observado que salía una primera línea con todo en blanco, y lo he corregido sustituyendo el do...while por while... Naturalmente, siempre es preferible separar en dos documentos, uno para proceso y otro con el html. Te faltarían algunas cosillas, como lo que te dije de seguridad contra injection y alguna validación, pero lo primero era que entendieras la lógica del php en la cronología del envío de datos al servidor y recogida de ellos.

<?php $bd_servidor = "localhost"; $bd_usuario = "root"; $bd_contrasenya = ""; $bd_bdname = "nombrebase"; $bd_tabla = "nombretabla"; // Tabla donde se harán las búsquedas

// Conexión y selección de la base de datos

$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);

mysql_select_db($bd_bdname,$link); mysql_query("set names 'utf8'"); $listacampos=array(); $palabra = trim($_POST['palabra']); $campo=$_POST['campo']; $datos= array();

//////////////////////////// // Formulario ///////////////////////////

?>

Introduce las palabras para la búsqueda

Buscar en: <?php //Con este query obtendremos los campos por los cuales el usuario puede buscar $result = mysql_query("SHOW FIELDS FROM `$bd_tabla`",$link); while($row = mysql_fetch_row($result)) { $listacampos[]=$row[0];//cargamos los nombres de los campos en un array // en $row[0] tenemos el nombre del campo // de esta manera no necesitamos conocer el nombre de los campos // por lo que cualquier tabla nos valdrá ?> <?php echo $row[0]; ?> <?php } ?> Palabra(s):

<?php

if(isset($palabra) && !empty($palabra) && isset($campo) && !empty($campo)) {//si hemos elegido un campo y hemos escrito palabra

// Solo se ejecuta si se ha enviado el formulario

$query2 = "SELECT * from $bd_tabla WHERE {$campo} LIKE '%{$palabra}%'";//consulta buscando en el campo elegido la palabra escrita $result2 = mysql_query($query2,$link); $conta=mysql_num_rows($result2);

if ($conta==false) {echo "no se ha encontrado nada";} else { echo "

"; $total=count($listacampos);//cuento los elementos de la listacampos foreach ($listacampos as $valor) {echo "$valor";}//primero mostramos en la primera línea de una tabla con los nombresde los campos echo ""; echo ""; while ($datoscampos= mysql_fetch_array($result2)) {for ($i=0;$i <= $total-1 ;$i++) {//mostramos los datos de cada línea $datcamp=$datoscampos[$i]; if (is_null($datcamp)==true){$datcamp="&nbsp";} else {$datcamp = $datcamp;} echo "".$datcamp."";} echo "";} //mostramos todas las líneas echo ""; } } else {echo "seleccione un campo y escriba una palabra";} ?>
1

por jurena

hace: 03 May 09

Perfecto! Estuve leyendo acerca del tema, ya tenía algunos conceptos y con su colaboración y lo que he leído últimamente, pues creo que ahí la llevo. Así dejé el script en dos archivos:

Este es el formulario.htm

<center>

Introduce las palabras para la búsqueda

Buscar en: IDEMPLEADOFIRSTNAMELASTNAMESECONDNAME PUESTODEPARTAMENTOTURNO< SUPERVISOROBSERVACIONES Palabra(s):

Seleccione un campo y escriba una palabra

Este es el archivo buscar.php

<?php $bd_servidor = "localhost"; $bd_usuario = "myuser"; $bd_contrasenya = "mypass"; $bd_bdname = "mydatabase"; $bd_tabla = "mytabla"; // Tabla donde se harán las búsquedas

// Conexión y selección de la base de datos

$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);

mysql_select_db($bd_bdname,$link); mysql_query("set names 'utf8'"); $listacampos=array("ID","N° de Empleado","Nombre","Apellido","2° apellido","Puesto","Departamenton","Turno","Supervisopr"); $palabra = trim($_POST['palabra']); $campo=$_POST['campo']; $datos= array();

////Aquí es donde antes estaba el formulario////

if(isset($palabra) && !empty($palabra) && isset($campo) && !empty($campo)) {//verifica si hemos elegido un campo y hemos escrito palabra

// Solo se ejecuta si se ha enviado el formulario

$query2 = "SELECT * from $bd_tabla WHERE {$campo} LIKE '%{$palabra}%'";//consulta buscando en el campo elegido la palabra escrita $result2 = mysql_query($query2,$link); $conta=mysql_num_rows($result2);

if ($conta==false) {echo "No se ha encontrado nada";} else { echo "

"; $total=count($listacampos);//cuento los elementos de la listacampos foreach ($listacampos as $valor) {echo "$valor";}//primero mostramos en la primera línea de una tabla con los nombres de los campos y les dí formato echo ""; echo ""; while ($datoscampos= mysql_fetch_array($result2)) {for ($i=0;$i <= $total-1 ;$i++) {//mostramos los datos de cada línea $datcamp=$datoscampos[$i]; if (is_null($datcamp)==true){$datcamp="--";} else {$datcamp = $datcamp;} echo "".$datcamp."";} echo "";} //mostramos todas las líneas echo ""; } } else {echo "Seleccione un campo y escriba una palabra";} ?>

Espero que sea correcto lo que hice, si tienen tiempo de un comentario ú observación, estaré atento. También trataré de hacerlo con variables definidas en vez de globales.

Me falta leer sobre validación y seguridad para evitar inyección mysql, así como el uso correcto de las comillas, claro, me falta mucho más que eso. Como esto me sirve para mi empleo, también buscaré como pasar consultas php-mysql a Excel.

Saludos y gracias!

0

por mty28q

hace: 04 May 09

mty28q, respondo en el foro a la pregunta que me hacías por memo, por si a alguien más le sirve. Decías que tenías problemas cuando buscabas un campo numérico, pues te traia si buscabas el 1, tanto el 1, como el 21, como el 211, etc. Bien, la solución es traerte en la consulta no field, sino columns (observa SHOW columns ...) y cargar en el array tanto el nombre field como el type, los dos primeros datos que te traes con el columns, y condicionar la consulta a que el type comience por int o no, para hacer una búsqueda exacta o con like '%palabra%'. Naturalmente, habría que ver qué tipos de campos numéricos usas en las tablas para contemplar todas las posibilidades, pero si por ej. usas solo int, esto funciona:

<?php $bd_servidor = "localhost"; $bd_usuario = "root"; $bd_contrasenya = ""; $bd_bdname = "tubase"; $bd_tabla = "tutabla"; // Tabla donde se harán las búsquedas

// Conexión y selección de la base de datos

$link = mysql_connect($bd_servidor,$bd_usuario,$bd_contrasenya);

mysql_select_db($bd_bdname,$link); mysql_query("set names 'utf8'"); $listacampos=array(); $palabra = $_POST['palabra']; $campo=$_POST['campo']; $datos= array();

//////////////////////////// // Formulario ///////////////////////////

?>

Introduce las palabras para la búsqueda

Buscar en: <?php //Con este query obtendremos los campos por los cuales el usuario puede buscar $result = mysql_query("SHOW columns FROM `$bd_tabla`",$link); $listacampos=array(); while($row = mysql_fetch_array($result)) { $listacampos[$row[0]]=$row[1];//cargamos los nombres de los campos en un array // en $row[0] tenemos el nombre del campo // de esta manera no necesitamos conocer el nombre de los campos // por lo que cualquier tabla nos valdrá ?> <?php echo $row[0]; ?> <?php } ?> Palabra(s):

<?php //print_r($listacampos);

if(isset($palabra) && !empty($palabra) && isset($campo) && !empty($campo)) {//si hemos elegido un campo y hemos escrito palabra // Solo se ejecuta si se ha enviado el formulario

$query2 = "SELECT * from $bd_tabla WHERE {$campo} "; if (substr($listacampos[$campo],0,3)!="int") {$query2.="LIKE '%{$palabra}%'";} else {$query2.=" = '{$palabra}'";}//consulta buscando en el campo elegido la palabra escrita $result2 = mysql_query($query2,$link); $conta=mysql_num_rows($result2);

if ($conta==false) {echo "no se ha encontrado nada";} else { echo "

"; $total=count($listacampos);//cuento los elementos de la listacampos foreach ($listacampos as $key => $valor) {echo "$key";}//primero mostramos en la primera línea de una tabla con los nombresde los campos echo ""; echo ""; while ($datoscampos= mysql_fetch_array($result2)) {for ($i=0;$i <= $total-1 ;$i++) {//mostramos los datos de cada línea $datcamp=$datoscampos[$i]; if (is_null($datcamp)==true){$datcamp="&nbsp";} else {$datcamp = $datcamp;} echo "".$datcamp."";} echo "";} //mostramos todas las líneas echo ""; } } else {echo "seleccione un campo y escriba una palabra";} ?>
1

por jurena

hace: 04 May 09

De hecho no me refería a eso, pero la verdad que está excelente, mis respetos para tu trabajo. De hecho me parece más importante con los números (INT) que con el texto.

Yo me refería a que cuando en algunos campos no tengo info, estos me aparece sin celda, ya probé este nuevo código que acabas de poner y me sigue apareciendo igual (claro, se que modificaste la busqueda exacta en un INT excelente). No puedo decir que las celdas aparecen en blanco, ya que ni celda aparece.

Saludos y gracias de nuevo!

0

por mty28q

hace: 04 May 09

dime qué valor por defecto tienes cuando no escribes los campos, pues variará, para unos tendrás null, para otros otro. Eso habrá que controlarlo con ese array de columnas que también te trae el valor por defecto, pero hay que cargarlo en el array y luego compararlo, teniendo en cuenta la posibilidad de que lo dejes en blanco. Entiendo que es una cuestión de formato que tendremos que resolver con programación. Aunque tal vez sean pocos y podamos controlarlos desde la condición, si cargar en array.

0

por jurena

hace: 04 May 09

Esto solo sucede con las columnas SECONDNAME, PUESTO y UBICACION que no tienen datos introducidos. Asi se vé la tabla de estructura: SECONDNAME........ .VARCHAR(60)......utf8_unicode_ci.....YES.....NULL PUESTO................ VARCHAR(60)......utf8_unicode_ci......YES....NULL UBICACION............VARCHAR(60)......utf8_unicode_ci.......NO....

El campo OBSERVACIONES aparece como sigue, y si se visualizan las celdas aunque no tenga datos introducidos: OBSERVACIONES......VARCHAR(500)......utf8_unicode_ci......YES......NULL

Saludos!

0

por mty28q

hace: 04 May 09

deberías probar, se me ocurre, con if ($datcamp==NULL || $datcamp=="")

para ver qué ocurre.

1

por jurena

hace: 04 May 09

Me había resignado a rellenar por fuerza esos campos siempre para que no aparecieran así, pero ya quedó con tu última indicación. Busqué en Google para ver que significan los caracteres ||, busqué también en tutoriales php pero sigo sin saberlo.

Seguiré leyendo acerca de seguridad y otras cosas que me indicaste. De hecho acabo de encontrar un hilo de seguridad en este http://www.psicofxp.com/forums/desarrollo-web.264/348684-tu-codigo-es-seguro-consejos-seguridad.html

Saludos y muchas gracias a todos!

0

por mty28q

hace: 04 May 09

|| significa OR, igual que && significa AND; son dos modos distintos de escribir lo mismo. La condición que he puesto es que cuando el campo sea Null o esté en blanco, escriba "$nbsp". Necesito escribir el espacio vacío forzado para que le ponga marco. Lee el artículo sobre el echo de este foro: es magnífico. Te ayudará a usar bien las comillas. Suerte.

1

por jurena

hace: 04 May 09

o busca en nuestros foros