Forma limpia de hacer esto en PHP

Pues el caso es que el otro día, haciendo un poco de código en PHP me surgio una situación de estas que miras el código y te quedas... joder que mierda, funcionar funcion, pero hace daño a la vista xD

El código era este:
$consulta=mysql_query("select id_autor, alias, edad, imagen from propiedades",$conexion);
   $i=0;
   while($fila=mysql_fetch_array($consulta)){
      if($i==0){
         printf("<tr><td><input type='radio' name='id' value='%s' CHECKED></input></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",$fila['id_autor'],$fila['id_autor'],$fila['alias'],$fila['edad'],$fila['imagen']);
         }else{
            printf("<tr><td><input type='radio' name='id' value='%s'></input></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",$fila['id_autor'],$fila['id_autor'],$fila['alias'],$fila['edad'],$fila['imagen']);
         }
      $i++;   
   }


Que hace? simple, tiene que generar una tabla con datos de una BD, ponerlo un radioButton al lado y dejar el primero marcado por defecto. Esto último es lo que da problemas y obliga a hacer ese if tan feo.

Se me ha ocurrido hcaer una String en la que ponga CHECKED, concatenarsela y al final de la ejecucion dejarla en blanco (""), asi las posteriores vueltas solo dejarian algo que esta en blanco igual que como estaba, pero muy limpio tampoco me parece.

Mi duda es, hay alguna manera de hacerlo algo más elegante?, no soy programador web y no se si habra una función especifica para hacerlo. Como nota, no puedo usar otra cosa que no sea PHP sin frameworks.
Hace mucho q no toco PHP y ya ni me acuerdo de cómo hacía yo esas cosas, pero la opción del string me parece bastante limpia, y ahorras un chorro de código con respecto al if de ahora.

Antes del bucle le das valor, y al final del for lo pones ="" , así solo pondrá el checked en la primera vuelta.

Q sepa no hay nada especifico de PHP para hacer eso, en definitiva estás generando tu propio html de forma dinámica y tienes q poner controles para generar las variaciones.

Un saludo
Evaluar el if en todas las iteraciones cuando por definición del problema sólo se cumplirá en la primera ocasión es un poco basto. Si siempre habrá al menos un registro en la tabla ¿qué tal evaluarlo con el 'checked' fuera del bucle (ya que es la excepción) y luego el resto de filas tal cual dentro del while? Así te ahorras directamente el condicional -y el contador tampoco sería necesario, claro-.

Me refiero a esto:

    $consulta = mysql_query( "select id_autor, alias, edad, imagen from propiedades", $conexion );
    $fila = mysql_fetch_array( $consulta )

    printf( "<tr><td><input type='radio' name='id' value='%s' CHECKED></input></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
        $fila['id_autor'], $fila['id_autor'], $fila['alias'], $fila['edad'], $fila['imagen'] );

    while( $fila = mysql_fetch_array( $consulta ) )
    {
        printf( "<tr><td><input type='radio' name='id' value='%s'></input></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
            $fila['id_autor'], $fila['id_autor'], $fila['alias'], $fila['edad'], $fila['imagen'] );
    }
Lo que comentas de sacarlo fuera es un poco más correcto pero me obliga a evaluar el número de filas, porque es posible que sea 0.
De momento mantengo lo de la String, que es lo menos malo xD.
Lo que comentas de sacarlo fuera es un poco más correcto pero me obliga a evaluar el número de filas, porque es posible que sea 0


No necesitas evaluar el número de filas. Lo de comprobar que haya al menos un registro lo solventas con un condicional que se evalúa una sola vez (aprovechando la primera asignación a $fila mismamente). Tal y como lo has puesto, el condicional se evaluará tantas veces como registros haya.

        $consulta = mysql_query( "select id_autor, alias, edad, imagen from propiedades", $conexion );

        if ( $fila = mysql_fetch_array( $consulta ) )
        {
            printf( "<tr><td><input type='radio' name='id' value='%s' CHECKED></input></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                $fila['id_autor'], $fila['id_autor'], $fila['alias'], $fila['edad'], $fila['imagen'] );
        }

        while( $fila = mysql_fetch_array( $consulta ) )
        {
            printf( "<tr><td><input type='radio' name='id' value='%s'></input></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
                $fila['id_autor'], $fila['id_autor'], $fila['alias'], $fila['edad'], $fila['imagen'] );
        }
Cierto, me gusta porque es autodescriptivo, contra la manera de la string que aunque son solo dos lineas es casi imposible entenderla sin comentarios.
5 respuestas