entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Optimizar codigo para evitar eventuales errores

segun ustedes si voy añadiendo mas tablas podrian haber problemas, como se podria optimizar mi codigo para que sea mas eficiente, como se podrian mostrar el tiempo que paso para hacer la busqueda tipo google, cuales errores podrian surgir en un futuro, valuto cualquier sugerencia y consejo gracias


<form method="get" action="test.php">
 <input type="text" name="busqueda" placeholder="keyword">
 <input type="submit" value="search" name="boton_enviar">
 </form>
 <nav>
    <ul>
        <li><a href="">clothes</a></li>
        <li>madone2012</li>
        <li>verano2012</li>
        <li>verano2013</li>
    </ul>
 </nav>
<?php
if(isset($_GET['boton_enviar']))
{
$consulta = $_GET['busqueda'];
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$sql = mysql_query("SELECT * FROM photos");
$verano2013 = mysql_query("SELECT * FROM verano2013");
$verano2012 = mysql_query("SELECT * FROM verano2012");

$encontrado = false;

while($fila = mysql_fetch_array($verano2012))
{
    if($consulta == $fila['name']){
    $encontrado = true;
    $registro = $fila['path'];
    echo "<img src=".$registro.">";
}

}

while($fila = mysql_fetch_array($verano2013))
{
    if($consulta == $fila['name']){
        $encontrado = true;
        $registro = $fila['path'];
        echo "<img src=".$registro.">";
    }
}

while($fila = mysql_fetch_array($sql))
{
    if($consulta == $fila['name']){
        $encontrado = true;
        $registro = $fila['path'];
        echo "<img src=".$registro.">";
    }
}

if(!$encontrado) { echo "No se encontro ningun resultado";}

     }

    ?>

<style>body{background-color:whitesmoke;}body>img{width:250px;height:250px;}body>img:first-child{transform:rotate(90deg);[email protected] screen and (max-width: 300px) 
{body>img{display:block;}}</style>

Peter comentado Mar 11

Por favor abre una pregunta por duda y no 5 preguntas en una misma.

Saludos.

steven comentado Mar 12

no estoy haciendo nuevas preguntas en una pregunta, estoy comentando el codigo de las respuestas señalando las dudas del codigo no creo que estoy sea considerado como pregunta nueva.

1 Respuesta

2votos

Leonardo-Tadei Puntos207790

Hola @steven,

son muchas cosas... vamos punto por punto:

La optimización hace que el código se ejecute más rápido y consumiendo menos recursos: no tiene nada que ver con evitar errores.

Evitar errores es que un software siempre dé la respuesta que se le pide sin fallar. Para esto hay que sanear las entradas para que no intente ejecutar cosas erróneas, por ejemplo una query con errores de sintaxis.

Las nuevas bibliotecas MySQLi y PDO incluyen opciones de saneo de las querys. Si no querés meterte con la Programación Orientada a Objetos, las mysqli_X tienen una forma de uso estructurada, muy similar a las mysql_X.

Tu código se puede generalizar para que no depende de las tablas que tengas creadas, con lo que al tener menos líneas, será más fácil hacer que tenga menos errores.

La sentencia SQL SHOW TABLES; es una consulta que devuelve todas las tablas que tiene una base de datos. El resultado es semejante a cuando hacés una consulta cualquiera, y te permitiría recorrer todas las tablas sin tener que irlas agregando a tu script.

La sentencia SQL SHOW FILEDS FROM una_tabla; es una consulta que devuelve todos las campos que tiene una tabla. El resultado es semejante a cuando hacés una consulta cualquiera, y te permitiría buscar en todos los campos sin tener que irlos agregando a tu script.

Para calcular el tiempo que tarda la ejecución de un script tenés la función microtime(). La ejecutás al principio, luego al final, y la diferencia de los valores es lo que tardó el script.

Con esto, la estructura de tu código quedaría algo como:

obtener las tablas;
para (todas las tablas){
  obtener los campos;
  para (todos los campos){
    armar la query;
    ejecutarla;
    obtener los resultados;
  }
}

es decir, te quedarían dos bucles anidados.

Por último, es incorrecta tu aproximación de hacer un

SELECT * FROM una_tabla

y recorrerla para buscar un resultado. Lo correcto cuando usás un SGBDR es que sea el propio motor el que haga la búsqueda, es decir, una query del tipo

SELECT * FROM una_tabla WHERE campo1="variable" OR campo2="variable" OR campo..n="variable"

De esta forma TODOS los resultados son los que corresponden, y no hace falta compararlos con el valor a buscar, además de que la DB hace esto mucho más rápido que cualquier bucle en un programa.

Saludos cordiales!

PD: por favor, si tenés preguntas puntuales sobre alguna de todas estas cosas, abrí una nueva pregunta, explicá bien lo que te pasa, poné el código que escribiste y que no funciona o que no hace lo que querés, y aportá los datos suficientes para que entendamos la situación.

steven comentado Mar 12

disculpa pero no pude entender bien la solucion acabo de codificarlo pero no se puede hacer lo que tu dices, ademas creo que no entendi que tipo de bucle debo usar, creo que se necesitan tres bucles el ultimo creo que seria para recorrer las tablas.
no entendi la parte de recorrer los campos, como puedo hacer eso si no lo especifico, por lo que se me ha ocurrido concatenar con el resultado que devolveria mi bucle for, pero tambien aqui no entendi bien si debo pasar el resultado de mi consulta que muestra las tablas o pasar mas variables dentro, segundo tampoco entendi en donde deberia aplicar el segundo bucle for, por lo que lo he omitido y lo he dejado asi.

<form method="get" action="test.php">
 <div id="buscador">
 <input type="text" name="busqueda" placeholder="keyword">
 <input type="submit" value="search" name="boton_enviar">
 </div>
 </form>
 <nav  id="menu">
    <ul>
        <li><a href="">clothes</a></li>
        <li><a href="">madone2012</a></li>
        <li><a href="">verano2012</a></li>
        <li><a href="">verano2013</a></li>
    </ul>
 </nav>
<?php
if(isset($_GET['boton_enviar']))
{
$consulta = $_GET['busqueda'];
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());
$encontrado = false;

$obtener_tablas= mysql_query("SHOW TABLES");
for($obtener_tablas){
    $obtener_campos = mysql_query("SHOW FIELDS FROM".$obtener_tablas);
    $sql = "SELECT * FROM $obtener_tablas WHERE name='$consulta'";
    mysql_query($sql);

}

Leonardo-Tadei comentado Mar 12

Steven,

la sentencia $obtener_tablas= mysql_query("SHOW TABLES"); tiene que ser recorrida, como cualquier otra consulta SQL, para obtener los resultados, con mysql_fetch_array().

Jamás el resultado de un mysql_query() se puede usar directamente en un bucle!!!

Creí que esto ya te quedaba claro de otras consultas a MySQL que tenías...

Luego, lee mi respuesta párrafo por párrafo, y no sigas adelante hasta que no lo entiendas. El pséudicódigo de mi respuesta es correcto y no hay que sacarle nada.

Te sugiero que auqnue no sirva para nada y luego lo tengas que sacar, hagas que tu script vaya mostrando lo que contienen los registros de las querys por pantallas, para que puedas ir viendo el resultado de cada cosa y te ayude a avanzar.

Escribir un script con 3 bucles anidados no es una práctica simple para un novato, pero viendo la salida generada por cada bucle podrás lograrlo!

steven comentado Mar 12

gracias por recormerdame que para ver el resultado de cualquier consulta es necesario antes recorrerla sin embargo todavia sigo obtenienedo errores, esta vez no entiendo porque me muestra todas esas lineas
<?php

$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  echo $tabla;

}
?>

output

Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array
Notice: Array to string conversion in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 7
Array

Leonardo-Tadei comentado Mar 12

Steven! Cómo es que no te das cuenta del error en lo que estás escribiendo?

La función mysql_fetch_array() devuelve un vector con el registro de la consulta, y un vector no se puede mostrar con un echo() o print() porque estas funciones solo pueden mostrar strings.

Diferenciar un vector de un string es algo fundamental para todo programador!

Para mostrar los elementos de un vector, tenés que recorrerlo con un foreach() o para este caso en que solo querés ver el resultado, con las funciones var_dump() o print_r(), que ambas aceptan como entrada un vector...

steven comentado Mar 12

si no me di cuenta porque en mi otro codigo lo puedo ver con un echo y no me tira errores esto creo que tambien hubiese funcionado si le hibiese pasado algo entre corchetes te lo muestro

while($fila = mysql_fetch_array($verano2012))
{
    if($consulta == $fila['name']){
    $encontrado = true;
    $registro = $fila['path'];
    echo "<img src=".$registro.">";
}

respecto a lo nuestro todavia obtengo un error, creo que es por mi bucle anidado

<?php 
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  print_r($tabla);
  $obtener_campos = mysql_query("SHOW FIELDS FROM".$tabla)
  while($campo = mysql_fetch_array($obtener_campos) ){
    var_dump($campo);
  }

}
?>

output

Parse error: syntax error, unexpected 'while' (T_WHILE) in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 9
la line 9 es de mi segundo bucle while

Leonardo-Tadei comentado Mar 12

Steven,

en tu código, la variable $fila es una vector y el elemento del vector $fila['name'] es un string... distinguís la diferencia entre un vector y un elemento de un vector? Te queda claro que el elemento de un vector puede ser de cualquier tipo, por ejemplo un string, pero que un vector es únicamente de tipo vector?

Tu afirmación de que "en mi otro codigo lo puedo ver con un echo y no me tira errores" me hace pensar que pierdo mi tiempo respondiéndote :-(

Volviendo a tu problema original, en tu código $tabla es un vector y mostrás el resultado con print_r($tabla);, pero luego en la línea

...
$obtener_campos = mysql_query("SHOW FIELDS FROM".$tabla)
...

lo concatenás como si fuera un string!!! La variable $tabla es un vector!!!

Por otra parte, el error de sitaxis que tenés es simple: te falta un punto y coma al terminar la línea que está antes del WHILE interior...

En la salida de print_r() está la clave de cómo tenés que seguir en el WHILE anidado...

steven comentado Mar 12

lo concateno porque la sentencia no funciona si no le paso una tabla, no puedo dejarlo porque me puede botar un error, sin embargo dejate explicar un poco mejor como es eso de la clave, si la funcion print_r es solo para hacer un preview de mi array como lo podria hacer para mostrar todos los registros de mi tablas
disculpa si te hago perder la paciencia, soy un poco lento para entender

Leonardo-Tadei comentado Mar 12

Steven: no se puede concatenar un array a un string. Punto.

Copianos la salida de un print_r($tabla); así vemos el resultado...

steven comentado Mar 12

<?php 
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  print_r($tabla);
  // $obtener_campos = mysql_query("SHOW FIELDS FROM");
  // while($campo = mysql_fetch_array($obtener_campos) ){
  //    var_dump($campo);
  // }

}
?>

output

Array ( [0] => example [Tables_in_test] => example ) Array ( [0] => inventario [Tables_in_test] => inventario ) Array ( [0] => migrations [Tables_in_test] => migrations ) Array ( [0] => password_resets [Tables_in_test] => password_resets ) Array ( [0] => photos [Tables_in_test] => photos ) Array ( [0] => users [Tables_in_test] => users ) Array ( [0] => usuarios [Tables_in_test] => usuarios ) Array ( [0] => verano2012 [Tables_in_test] => verano2012 ) Array ( [0] => verano2013 [Tables_in_test] => verano2013 )

disculpa por el retraso, ahi esta el resultado, me gustaria poder omitir las tablas del sistema y buscar solo en mis tablas

steven comentado Mar 12

@Leonardo-Tadei si compilo mi codigo completo me devuelve un error

Array ( [0] => example [Tables_in_test] => example )
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 9

<?php 
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  print_r($tabla);
  $obtener_campos = mysql_query("SHOW FIELDS FROM");
  while($campo = mysql_fetch_array($obtener_campos) ){
    var_dump($campo);
  }

}
?>

Leonardo-Tadei comentado Mar 12

Claro que te va a devolver ese error @steven !

La query "SHOW FIELDS FROM" es inválida, porque debe ser "SHOW FIELDS FROM nombre_de_la_tabla".

Luego $obtener_campos tendrá valor FALSE porque la query no se ejecuta, y al usarla luego en mysql_fetch_array($obtener_campos) genera este error... en mi respuesta te digo claramente la forma de la query a ejecutar: no lo leíste? no lo entendiste? te habías perdido antes de llegar a esa parte?

Lo que tenés que hacer es concatenar al SHOW FIELDS FROM el nombre de la tabla que tenés en cada elemento del vector $obtener_tablas.

PD: te aseguro que lo que te pasa no es que seas lento para entender: estás queriendo viajar a la luna y todavía no sabés el nombre de las calles de tu barrio... es de veras muy difícil querer usar bases de datos sin manejar bien los conceptos de variable, constante, tipos de variables, vectores, matrices y funciones :-(

steven comentado Mar 13

no te entendi, en mi codigo anterior cuando lo concateno con mis tablas me decis que eso no se puede porque es un string y ahora me decis lo contrariom, disculpa estoy un poco confundido podrias poner el codigo correcto para ver en que estoy fallando gracias

Leonardo-Tadei comentado Mar 13

Lee bien @steven: lo que te digo es que no se puede concatenar un array a un string. Lo digo justo arriba de este comentario!

Lo que tenés que concatenar es el string SHOW FIELDS FROM con el elemento del array, que sí es un string en este caso.

Sabés lo que es una variable?
Sabés que las variables pueden ser de diferentes tipos?
Sabés cómo se usan los diferentes tipos de variables y qué se puede hacer con cada tipo?
Sabés lo que es un vector o array?
Sabés como se usa un vector y cómo se puede acceder a cada elemento?

Claro que puedo poner el código!

Pero no lo haré porque sería inútil: si vos entendés las cosas, podrás escribirlo sin problemas o con un poco de ayuda. Si no entendés las cosas, tendrás un pedazo más de código que funciona y seguirás igual de ignorante que antes.

Yo quiero ayudarte a que entiendas. Si querés pedazos de código para usar sin entender, buscalos en internet que abundan y no perdamos tiempo ni vos ni yo con este intercambio. Si querés entender bien todo esto, tal vez no debas hacer preguntas genéricas o complejas, sino ir preguntando de a una cosa con ejemplos concretos de código, y así ir construyendo de mejor manera el conocimiento de base para soportar el conocimiento que sigue.

Saludos cordiales.

steven comentado Mar 13

empiezo respondiedo con las preguntas del millon, una variable es un dato que puede ir cambiando en el trascurso del programa hay de dos tipos variables locales y globales luego un array y un vector son casi lo mismo los datos se guardan a travez de indices numericos y empieza desde cero
luego estan los arrays asociativos y los arrays multidimensionales que pueden contener en su su interior otros arrays, creo que esto puede bastar.
respecto al codigo todavia no lo entendi como deberia hacerlo, acaso debo de trasformar mi vector en un string, dame una pista para seguir
si mi variable tabla es un vector y no lo puedo concatenar con la consulta entonces que dato debo pasarle, acaso debo crear una nueva variable y poner dentro el print-r te pido que seas un poco mas comprensivo

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  print_r($tabla);
  $obtener_campos = mysql_query("SHOW FIELDS FROM"); // 
  while($campo = mysql_fetch_array($obtener_campos) ){
    var_dump($campo);
  }

}
?>

steven comentado Mar 13

hola @Leonardo-Tadei que fue lo que dije para que me votaras negativo, respondi bien a todas tus preguntas quizas te esperabas algo mas dejame entender en que estoy mal, si te digo que estoy probando de todo es asi no voy a copiar codigo sin antes enteder jamas porfa ayudame a seguir con mi proyecto, no tengo a nadie mas y no me puedo pagar un curso por problemas economicos, espero que puedas comprender mi situacion
cordiales saludos

Leonardo-Tadei comentado Mar 13

Perfecto @steven ! Falta la cuestión de los tipos de variables, pero es un buen comienzo (salvo que hayas copiado y pegado esto de algún lugar).

Por como podés ver en toda esta larguísima respuesta, soy uno de los ser seres más comprensivos del Universo...

Volviendo al problema del primer WHILE, lo que tenés que hacer es concatenar el primer elemento del array $tabla, que es el que tiene el nombre de la tabla, al string "SHOW FIELDS FROM" para que la query tenga sentido y funcione.

Saludos cordiales

Leonardo-Tadei comentado Mar 13

Querido @steven: no te voté negativo. Ni a vos ni a nadie jamás en ED voté negativa ni una pregunta, ni una respuesta, ni un comentario.

Además en ED no aparece el nombre del usuario que vota negativo, así que pudo ser cualquiera de los otros cientos de usuarios...

Por nada.

steven comentado Mar 13

si pero como rescato ese valor de mi array si con print_r lo que hago es imprimir la estructura de mi array, como deberia de sacar solo el nombre de la tabla, es aqui donde no puedo avanzar, no entendi si debo almacenar mi funcion en una variable para luego mostrarla o hacer otro bucle dentro de mi funcion
hablando en codigo creo que se seria lo siguiente

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  $elemento= print_r($tabla);
  $obtener_campos = mysql_query("SHOW FIELDS FROM".$elemento); // 
  while($campo = mysql_fetch_array($obtener_campos) ){
    var_dump($campo);
  }

}

steven comentado Mar 13

no hay problema no te preocupes a lo mejor fue otro usuario sospecho de uno en especial pero no quiero decirlo no vaya ser que se moleste, de todos modos muchas gracias por todo algun dia seras recompensado cuando visite argentina te puedo pasar a saludar si es que se da la posibilidad

Leonardo-Tadei comentado Mar 13

Hola de nuevo @steven,

El print_r() es nada más para ver la salida, tal como te digo casi al principio de nuestra larga conversación. Sirve solo para eso, y cuando entiendas lo que hace el script y cómo lo hace ya no hará más falta y será borrado.

Pregunto: si $tabla es un array devuelto por mysql_fetch_array(), como se hace en PHP para asignar el primer valor de este array a una variable???

steven comentado Mar 13

me lo pones un poco dificil, si solo quisiera recuperar el primer elemento de mi array lo que aray es acceder por medio el indice array(0) pero si quisiera recorrer todos los elementos hacer un bucle for y seria algo asi i=0; i<array.length; i++ y luego lo imprimiria con la funcion print, pero de todos modos no creo que esto sea la respuesta correcta

steven comentado Mar 13

@Leonardo-Tadei no entendi bien la pregunta, como es eso de asignar el primer elemento del array a una variable, si no es como te respondi entonces como seria cual es la solucion

Leonardo-Tadei comentado Mar 14

Hola @steven, en tu respuesta hay dos opciones. Como podés ver en la salida del print_r(), el vector tiene un solo elemento.

Cómo se asigna a una variable el primer elemento de un vector?

steven comentado Mar 14

ahora me doy cuenta que todas mis tablas estan con el indice cero, es algo curioso creia que cada tabla llevaba su indice propio, sin embargo no conosco la respuesta porque no puede ser como lo hice
$tabla = tabla[0] no se si existen otras maneras de hacerlo

Leonardo-Tadei comentado Mar 14

Hola @steven,

no es que todas tus tablas tengan índice 0, sino que la query que ejecutás devuelve, igual que cualquier SELECT, un montón de regristros. En este caso la "tabla resultante" es la lista de los nombres de las tablas, como si fuera una tabla real que tuviera 1 sola columna.

La repuesta entonces tiene varios registros, cada registro es un vector devuelto por mysql_fetch_array(), y cada registro/vector tiene 1 solo elemento.

La asignación de variable que estás planteando está bien, salvo que si el vector se llama $tabla y la variable se llama $tabla, vas a perder el vector por la sobrescritura...

En resumen, podemos avanzar con el bucle interior así:

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  // $elemento= print_r($tabla); <- ya no hace falta
  $elemento = $tabla[0];
  // Arma la query que sigue usando el nombre de la tabla.
  $obtener_campos = mysql_query("SHOW FIELDS FROM $elemento");
  // Muestra la query a ejecutar, solo para control durante el desarrollo
  print("La query generada es:  SHOW FIELDS FROM $elemento<br>");
  while($campo = mysql_fetch_array($obtener_campos) ){
    var_dump($campo); // <- solo para ver qué devuelve!
    //
    // acá seguirá el código
    //
  }
}

Se entiende la idea? Esto te devoverá cada query que generes dentro del primer bucle y el resultado que devuelva cada SHOW FIELDS mostrado por el var_dump()

Saludos cordiales

steven comentado Mar 15

la salida de mi segundo while devuelve tres arrays te muestro solo uno porque sino seria muy largo mi comentario

La query generada es: SHOW FIELDS FROM photos
array(12) { [0]=> string(2) "id" ["Field"]=> string(2) "id" [1]=> string(7) "int(11)" ["Type"]=> string(7) "int(11)" [2]=> string(2) "NO" ["Null"]=> string(2) "NO" [3]=> string(3) "PRI" ["Key"]=> string(3) "PRI" [4]=> NULL ["Default"]=> NULL [5]=> string(14) "auto_increment" ["Extra"]=> string(14) "auto_increment" } array(12) { [0]=> string(4) "name" ["Field"]=> string(4) "name" [1]=> string(11) "varchar(10)" ["Type"]=> string(11) "varchar(10)" [2]=> string(3) "YES" ["Null"]=> string(3) "YES" [3]=> string(0) "" ["Key"]=> string(0) "" [4]=> NULL ["Default"]=> NULL [5]=> string(0) "" ["Extra"]=> string(0) "" } array(12) { [0]=> string(4) "path" ["Field"]=> string(4) "path" [1]=> string(11) "varchar(20)" ["Type"]=> string(11) "varchar(20)" [2]=> string(3) "YES" ["Null"]=> string(3) "YES" [3]=> string(0) "" ["Key"]=> string(0) "" [4]=> NULL ["Default"]=> NULL [5]=> string(0) "" ["Extra"]=> string(0) "" } array(12) { [0]=> string(6) "points" ["Field"]=> string(6) "points" [1]=> string(7) "int(11)" ["Type"]=> string(7) "int(11)" [2]=> string(3) "YES" ["Null"]=> string(3) "YES" [3]=> string(0) "" ["Key"]=> string(0) "" [4]=> NULL ["Default"]=> NULL [5]=> string(0) "" ["Extra"]=> string(0) "" }

ahora sigue nuestro problema, cuando hago el escaneo a todos los campos de mi tablas buscando un elemento este no me devuelve la ruta de mi imagen y me devuelve un error extraño, te muestro primero el codigo y luego el error

<?php 
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  // print_r($tabla);
  $elemento = $tabla[0];
  $obtener_campos = mysql_query("SHOW FIELDS FROM $elemento");
  print("La query generada es:  SHOW FIELDS FROM $elemento<br>");
  // echo gettype($elemento); 
  while($campo = mysql_fetch_array($obtener_campos) ){
    // var_dump($campo);

    // print_r($consulta);
    $elemento_campo = $campo[0];
    // echo gettype($elemento_campo);
    print $elemento_campo;

    $sql = "SELECT * FROM $elemento WHERE $elemento_campo='jacket' OR name = 'jacket'";
    $consulta = mysql_query($sql);
    if($consulta){
    echo "la ruta de la imagen es :".$path = $elemento_campo['path'];
    // echo "<img src='$path'>";
    }
  }

}
?>

output

La query generada es: SHOW FIELDS FROM photos
id
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :iname
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :npath
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :ppoints
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :pLa query generada es: SHOW FIELDS FROM verano2012
name
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :npath
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :ppoints
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :pLa query generada es: SHOW FIELDS FROM verano2013
name
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :npath
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :ppoints
Warning: Illegal string offset 'path' in F:\xamp\htdocs\local\beta\estudio\bucles.php on line 21
la ruta de la imagen es :p

antes de esto he probado a crear otro bucle anidado pero este me muestra las imagenes repetidas con algunos errores te lo muestro

<?php 
$conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
mysql_select_db('test', $conexion) or die(mysql_error());

$obtener_tablas = mysql_query("SHOW TABLES");
while($tabla = mysql_fetch_array($obtener_tablas)){
  // print_r($tabla);
  $elemento = $tabla[0];
  $obtener_campos = mysql_query("SHOW FIELDS FROM $elemento");
  print("La query generada es:  SHOW FIELDS FROM $elemento<br>");
  // echo gettype($elemento); 
  while($campo = mysql_fetch_array($obtener_campos) ){
    // var_dump($campo);

    $elemento_campo = $campo[0];
    print $elemento_campo;

    $sql = "SELECT * FROM $elemento WHERE $elemento_campo='jacket' OR name = 'jacket'";
    $consulta = mysql_query($sql);
    if($fila = mysql_fetch_array($consulta)){
    echo "la ruta de la imagen es :".$path = $fila['path'];
    }
  }

}
?>

output

La query generada es: SHOW FIELDS FROM photos
idla ruta de la imagen es :clothes/jacket.jpgnamela ruta de la imagen es :clothes/jacket.jpgpathla ruta de la imagen es :clothes/jacket.jpgpointsla ruta de la imagen es :clothes/jacket.jpgLa query generada es: SHOW FIELDS FROM verano2012
namepathpointsLa query generada es: SHOW FIELDS FROM verano2013
namepathpoints

steven comentado Mar 15

hola @Leonardo-Tadei tengo mi codigo casi terminado lo unico que me hace falta es imprimir la ruta de la imagen en mi pagina, por algun motivo no es posible aqui te dejo el codigo completo

<form method="get" action="buscador-beta.php">
 <div id="buscador">
 <input type="text" name="busqueda" placeholder="keyword">
 <input type="submit" value="search" name="boton_enviar">
 </div>
 </form>
 <nav  id="menu">
    <ul>
        <li><a href="">clothes</a></li>
        <li><a href="">madone2012</a></li>
        <li><a href="">verano2012</a></li>
        <li><a href="">verano2013</a></li>
    </ul>
 </nav>
<?php
if(isset($_GET['boton_enviar']))
{
  $consulta = $_GET['busqueda'];
  $conexion = mysql_connect('localhost', 'root', 'admin') or die(mysql_error());
  mysql_select_db('test', $conexion) or die(mysql_error());

  $obtener_tablas = mysql_query("SHOW TABLES");
  while($tabla = mysql_fetch_array($obtener_tablas)){
   $elemento = $tabla[0];
   $obtener_campos = mysql_query("SHOW FIELDS FROM $elemento");

    while($campo = mysql_fetch_array($obtener_campos) ){

      $elemento_campo = $campo[0];

       $sql = "SELECT * FROM $elemento WHERE $elemento_campo='$consulta' ";
       $consulta = mysql_query($sql);

        while($fila = mysql_fetch_array($consulta)){
        echo $ruta= $fila['path'];
        echo "<img src='$ruta'>";
    }
  }
}
}
?>

Peter comentado Mar 15

@steven ¿Y esto último que tiene que ver con optimizar codigo para evitar eventuales errores?

Por favor para tus dudas que no tienen nada que ver con la original, abre preguntas nuevas.

Saludos.

steven comentado Mar 15

si pero visto que se trata del mismo codigo y esta casi terminado es decir que despues de esto cierro la pregunta no creo que sea el caso de abrir mas preguntas

Peter comentado Mar 15

Un mismo bloque de código se puede utilizar para 600 cosas diferentes y no se pueden tratar en la misma pregunta.

Si tu duda es como optimizar codigo para evitar eventuales errores, esa es la duda, se resuelve y se abre otra.

Por favor abre una pregunta nueva por cada duda que tengas.

Saludos.

steven comentado Mar 15

ok peter lo hare pero no me podrias dar tu la respuesta a esta duda asi evitamos de crear mas preguntas sobre preguntas, porfa peter cumpleme este deseo todavia me falta mucho para completar mi proyecto pero acabar en esta parte seria un progreso
no te lo tomes a mal la peticion, despues de todo esramos en esta comunidad para ayudarnos mutuamente, cordiales saludos

Peter comentado Mar 15

No hay que evitar crear mas preguntas. Si una duda es como hacer helado de chocolate y la otra como cambiarle el aceite a un coche, son dos cosas completamente diferentes, así es que no lo evites. Si son cosas diferentes, por favor abre preguntas diferentes.

Cuando alguien con la misma duda "original" entra, se encuentra otra cosa, cuando alguien entra a ayudar con la duda "original" se encuentra otra cosa, lo que hace es perjudicar a todos, así es que por favor, para dudas diferentes, preguntas diferentes.

Saludos.

steven comentado Mar 15

@Leonardo-Tadei acabo de encontrar la solucion, antes de hacer eso comente mi ultima duda y luego lo instancie en una nueva pregunta y me di cuenta en ese momento del error, te mencione en la respuesta y te vuelvo a dar las gracias.
cordiales saluditos

Leonardo-Tadei comentado Mar 15

Hola @steven,

estuve ocupado hoy y no pude pasar por ED.
Me alegra que hayas podido avanzar con el código.

Espero que nuestra larga interacción te haya servido!!!

Saludos cordiales.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta