PHP - URL amigables, varios parámetros con paginación

 
Vista:
Imágen de perfil de sergio
Val: 29
Ha aumentado su posición en 8 puestos en PHP (en relación al último mes)
Gráfica de PHP

URL amigables, varios parámetros con paginación

Publicado por sergio (12 intervenciones) el 22/06/2019 12:49:33
Hola muy buenas a todos, espero me podáis ayudar.

Estoy haciendo las URL amigables de: dominio/p?id=1&?clase=home&pagina=4

Este es mi htacces;
RewriteRule ^p/(.+)$ p.php?id=$1
RewriteRule ^p/(.+)/(.+)$ p.php?id=$1&clase=$2


He conseguido omitir los parámetros del ?id=1... dominio/p/1... pero tengo varios problemas.

1 Cuando intento pasar la clase home a url amigable en htacces /p/1/home&pagina=7 me da un error en la consulta mysql, creo que es porque no consigo pasar por $_GET las clases del segundo parámetro en la url.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql    = "SELECT id, clases, url, imagen FROM clase_palabras ORDER BY id ASC";
    $result = mysqli_query($con, $sql) or die('Consulta fallida: ' . mysqli_error());
 
$id_registro = isset($_GET['id']) ? $_GET['id'] : 'n';
if ($id_registro == 'n') {
 
    while ($line = mysqli_fetch_array($result)) {
 
        echo "<a href=\"p/" . $line['id'] . '/clase/' . $line['clases']  . "\">" . $line['clases'] . "</a>";
    }
 
} else {
 
    $sql    = "SELECT * FROM palabras WHERE id_clase=" . $id_registro;
    $result = mysqli_query($con, $sql) or die('Consulta fallida: ' . mysqli_error());

2 En la paginación no consigo que aparezca la variable clase=home: /p/1&?clase=&pagina=7 debe de ser por consecuencia del primer punto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
$url                 = $id_registro . '/clase/' . $line['clases'] . "&";
    $num_total_registros = mysqli_num_rows($result);
 
    if ($num_total_registros > 0) {
        //Limito la busqueda
        $tamano_pagina = 8;
        $pagina        = false;
 
//examino la página a mostrar y el inicio del registro a mostrar
        if (isset($_GET["pagina"])) {
            $pagina = $_GET["pagina"];
        }
 
        if (!$pagina) {
            $inicio = 0;
            $pagina = 1;
        } else {
            $inicio = ($pagina - 1) * $tamano_pagina;
        }
 
//calculo el total de páginas
        $total_paginas = ceil($num_total_registros / $tamano_pagina);
 
        $sql    = "SELECT id_clase, ingles, espanol FROM palabras WHERE id_clase=$id_registro ORDER BY id_clase LIMIT " . $inicio . "," . $tamano_pagina;
        $result = mysqli_query($con, $sql) or die('Consulta fallida: ' . mysqli_error());
 
        echo '<table class="width200">';
        while ($line = mysqli_fetch_array($result)) {
            if (isset($_GET['id'])) {
                if ($id_registro == $line['id_clase']) {
 
                    $url_check = $url . 'pagina=' . $pagina;
 
                    echo "<form action=\"" . $url_check . "\" method=\"POST\">";
                    echo '<tr>';
 
                    echo '<td>';
                    echo $line['espanol'];
                    echo '</td>';
 
                    echo "<input type=\"hidden\" name=\"ingles\" value='" . $line['ingles'] . "'> ";
                    echo "</form>";
                }
            }
        }
        echo "<br>";
        echo '</table>';
 
        if ($total_paginas > 1) {
            if ($pagina != 1) {
                echo '<a href="' . $url . 'pagina=' . ($pagina - 1) . '"><i class="fa fa-chevron-left" aria-hidden="true"></i></a>';
            }
 
            for ($i = 1; $i <= $total_paginas; $i++) {
                if ($pagina == $i)
                //si muestro el indice de la página actual, no coloco enlace
                {
                    echo $pagina;
                } else
                //si el indice no corresponde con la pagina mostrada actualmente,
                //coloco el enlace para ir a esa pagina
                {
                    echo '  <a  href="' . $url . 'pagina=' . $i . '">' . $i . '</a>  ';
                }
 
            }
 
            if ($pagina != $total_paginas) {
                echo '<a href="' . $url . 'pagina=' . ($pagina + 1) . '"><i class="fa fa-chevron-right" aria-hidden="true"></i></a>';
            }
 
        }
    }
 
}

Siento soltaros este chorro de código, pero no se explicarme de otra manera!! Espero que me podáis ayudar...Un saludos y gracias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

URL amigables, varios parámetros con paginación

Publicado por Mauro (1037 intervenciones) el 23/06/2019 00:37:50
Me parece que tienes un problema en las expresiones regulares que usas para el matching...

Fíjate que

1
^p/(.+)$

Matchea todo lo que comience con p/

Con lo cual, nunca se va a aplicar la segunda regla.

Un poco lo mismo sucede con:

1
^p/(.+)/(.+)$

Debes usar un patrón que no contemple la /,algo como:

1
^p/([^/]+)/(.+)$
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de sergio
Val: 29
Ha aumentado su posición en 8 puestos en PHP (en relación al último mes)
Gráfica de PHP

URL amigables, varios parámetros con paginación

Publicado por sergio (12 intervenciones) el 23/06/2019 12:06:39
Hola Mauro gracias, he conseguido dejar la url así http://localhost/ingles/p/1/pagina/11... pero me da este error... Consulta fallida: Unknown column 'pagina' in 'where clause'

l htacces lo he dejado así finalmente, parece que eso está bien:

RewriteRule ^p/(.+)$ p.php?id=$1
RewriteRule ^p/(.+)/(.+)$ p.php?id=$1&pagina=$2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
} else {
 
    $sql    = "SELECT * FROM palabras WHERE id_clase=" . $id_registro;
    $result = mysqli_query($con, $sql) or die('Consulta fallida: ' . mysqli_error($con));
 
    $url                 = $id_registro . '/';
    $num_total_registros = mysqli_num_rows($result);
 
    if ($num_total_registros > 0) {
        //Limito la busqueda
        $tamano_pagina = 8;
        $pagina        = false;
 
//examino la página a mostrar y el inicio del registro a mostrar
if (isset($_GET["pagina"])) {
            $pagina = $_GET["pagina"];
        }
 
        if (!$pagina) {
            $inicio = 0;
            $pagina = 1;
        } else {
            $inicio = ($pagina - 1) * $tamano_pagina;
        }
 
//calculo el total de páginas
        $total_paginas = ceil($num_total_registros / $tamano_pagina);
 
        $sql    = "SELECT * FROM palabras WHERE id_clase=$id_registro ORDER BY id_clase LIMIT " . $inicio . "," . $tamano_pagina;
        $result = mysqli_query($con, $sql) or die('Consulta fallida: ' . mysqli_error());
 
        echo '<table class="width200">';
        while ($line = mysqli_fetch_array($result)) {
            if (isset($_GET['id'])) {
                if ($id_registro == $line['id_clase']) {
 
                    $url_check = $url . 'pagina' . '/' . $pagina;
 
                    echo "<form action=\"" . $url_check . "\" method=\"POST\">";
                    echo '<tr>';
 
                    echo '<td>';
                    echo $line['espanol'];
                    echo '</td>';
 
                    echo '<td>';
                    echo "<input class=\"texto\" type=\"text\" name=\"respuesta\" placeholder=\"Escríbelo en inglés...\"autocomplete=\"off\"> ";
                    echo '</td>';
 
                    echo "<input type=\"hidden\" name=\"ingles\" value='" . $line['ingles'] . "'> ";
 
                    echo '<td>';
                    echo "<input class=\"button\" type=\"submit\" value=\"check\">";
                    echo '</td>';
 
                    echo '<td>';
                    echo "<input class=\"button\" type=\"submit\" name=\"solucion\"value=\"show answer\">";
                    echo '</td>';
 
                    echo '</tr>';
                    echo "</form>";
                }
            }
        }
        echo "<br>";
        echo '</table>';
 
        if ($total_paginas > 1) {
            if ($pagina != 1) {
                echo '<a href="' . $url . 'pagina' . '/'. ($pagina - 1) . '"><i class="fa fa-chevron-left" aria-hidden="true"></i></a>';
            }
 
            for ($i = 1; $i <= $total_paginas; $i++) {
                if ($pagina == $i)
                //si muestro el indice de la página actual, no coloco enlace
                {
                    echo $pagina;
                } else
                //si el indice no corresponde con la pagina mostrada actualmente,
                //coloco el enlace para ir a esa pagina
                {
                    echo '  <a  href="' . $url . 'pagina' . '/' . $i . '">' . $i . '</a>  ';
                }
 
            }
 
            if ($pagina != $total_paginas) {
                echo '<a href="' . $url . 'pagina' . '/' . ($pagina + 1) . '"><i class="fa fa-chevron-right" aria-hidden="true"></i></a>';
            }
 
        }
    }
 
}

¿Alguien tiene alguna idea de este error? Muchas gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar