Saludos ahora vamos a ver en este tutorial, Cómo crear un Foro Php Mysql Bootstrap. Donde dividiremos la parte del login y la parte del foro en carpetas distintas .

La parte del login y registro e usado MDL , posteriormente se irá incorporando MDL en el resto del Foro, separando el diseño del Backend y dejando el código mas limpio.

Funciones:

1.- Para Utilizar el foro se necesitará de un registro de usuario y posteriormente de un login , el inicio de sesión se validará con un código enviado al email de registro usado por el usuario, este constará de 4 dígitos.

2.- Para responder una pregunta de usuario, se necesitará de un formulario de respuesta que contendrá un id asociado para no perder el parent  de respuesta.

3.- Para crear una nueva pregunta, se utilizará un formulario con un id vacío , no se necesitará parent de respuesta ya que será una pregunta solicitada.

4.- Por el momento se está utilizando un editor de texto simple a futuro se implementará un editor de texto WYSIWYG llamado TinyMCE para mejorar su funcionamiento.

foro php mysql

5.- Se validará el ingreso de las preguntas con un captcha de sesión ,en una nueva actualización se usará reCAPTCHA .

6.- Las url’s ingresadas serán rel=»nofollow» para evitar tráficos de web ,podrá ser modificada desde su código fuente como más le convenga, véase.

Comenzamos:

Primero vamos a crear el foro, después veremos como iniciar sesión y registrar usuarios.

tabla foro_php_mysql.- Esta es la tabla que usaremos para crear las preguntas del Foro

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `foro_php_mysql` (
  `id_foro` int(7) NOT NULL,
  `autor_foro` varchar(200) COLLATE utf8_spanish2_ci NOT NULL DEFAULT '',
  `titulo_foro` varchar(200) COLLATE utf8_spanish2_ci NOT NULL DEFAULT '',
  `mensaje_foro` text COLLATE utf8_spanish2_ci NOT NULL,
  `fecha_foro` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `respuestas_foro` int(11) NOT NULL DEFAULT '0',
  `identificador_foro` int(7) NOT NULL DEFAULT '0',
  `ult_resptuesta_foro` datetime DEFAULT NULL
)

conexion.php .- Como ya sabemos necesitamos de una conexión para establecer contacto con la base de datos y posteriormente acceder a los datos de la tabla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
  session_start();
?>
<?php
//conectamos la tabla
$link = mysqli_connect("localhost","root","","database") or die("Error en la consulta" . mysqli_error($link));
?>
<?php if (is_file ('inc/inc.php')){
     include ('inc/inc.php');
    }
    else {
    include ('../inc/inc.php');
    }
?>

Adicional utilizamos un archivo inc.php que utilizaremos para generar funciones php y que utilizaremos dentro del foro . podríamos haber usado funciones de php para sanear los datos pero en una próxima actualización la estaremos usando.

index.php.- El index se encargará de mostrar las preguntas ingresadas por los usuarios determinando que la que se respondió ultimo es la que se mostrará primero.

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
<?php
//conectamos la base de datos
require('conect.php');
//creamos una variable de sesión url para recorrer la web
$_SESSION['url'] = $_SERVER['REQUEST_URI'];
# Nombre: index.php
# Descripcion: Index pagina principal de foro php mysql
# Autor: Bloguero-ec
?>
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!--bootstrap.css desde hosting bloguero-ec.com-->
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<!-- imagenes y fuente-->
<!-- estilo de plantilla-->
<link rel="stylesheet" href="estilo.css">
<!--scripts a usarse -->
<!--jQuery library -->
<!--bootstrap.min.js no usado -->
<script src="bootstrap.min.js"></script>
<!-- jaquery expander y configuración -->
<script src="jquery.expander.js"></script>
<!-- javascript expander-->
<script type="text/javascript">
    $(document).ready(function() {
        // use esta configuracion simple para valores por defecto
        //$('div.expandable p').expander();
        // *** O ***
        // configure de la siguiente manera
        $('div.expandable').expander({
        slicePoint: 30, // si eliminamos por defecto es 100 caracteres
        expandText: '...', // por defecto es 'read more...'
        expandPrefix: ' ', //valor de espacio por defecto es '… ',
        collapseTimer: 5000, // tiempo de para cerrar la expanción si desea poner 0 pra no cerrar
        userCollapseText: '[cerrar]' // por defecto es 'read less...'
      });
    });
  </script>
<title>Foro php mysql free</title>
</head>
<body>
<div class="container" style="margin-top: 35px">
  <div class="page-header page-heading">
    <h1 class="pull-left">Foro Php Mysql ...</h1>
    <!--creamos una OL como semilla de pan para verificar si está seteada la sesión -->
    <ol class="breadcrumb pull-right where-am-i">
      <?php
      if(!empty($_SESSION['Variable_Id']))
        {
        echo '
        <li><a href="index.php">Inicio</a></li>
        <li><a href="#">Nuevo tema</a></li>
        <li><a href="#">Salir</a></li>
        ';
        }
        else{
        echo'
        <li><a href="'.$_SERVER["PHP_SELF"].'">Inicio</a></li>
        <li><a class="active" href="login/">Nuevo Tema</a></li>
        <li><a class="active" href="login/registro.php">Registrarse</a></li>       
        ';
        
        }
       ?>
    </ol>
    <div class="clearfix"></div>
      <?php
      if(!empty($_SESSION['Variable_Id']))
        {
        echo'
        <!--colocamos una semilla de pan mostramos el usuario -->
        <ol class="breadcrumb pull-right where-am-i">
          <li>Usuario :  <a href="#">'.$_SESSION['Variable_usuario'].'</a></li>
        </ol>';
        }
      ?>
    <div class="clearfix"></div>
  </div>
  <p class="lead">Estas en el lugar correcto para comenzar una discusión o expresar ideas, críticas, responda con moderación. Revise las políticas del foro y no realice preguntas duplicadas.</p>
  <table class="table forum table-striped">
    <thead>
      <tr>
        <th class="cell-stat"></th>
        <th>
          <h3>Pregunta</h3>
        </th>
        <th class="cell-stat text-center hidden-xs">Autor</th>
        <th class="cell-stat text-center hidden-xs ">Respuestas</th>
        <th class="cell-stat-2x hidden-xs hidden-sm">Ultimo mensaje</th>
      </tr>
    </thead>
    <tbody>
<?php
$url = $_SERVER['PHP_SELF'];
$consulta = "SELECT * FROM foro_php_mysql WHERE identificador=0" or die("Error en la consulta" . mysqli_error($link));
$resultado = $link->query($consulta);
//$row = $resultado->fetch_assoc();
/* determinar el número de filas del resultado */
$total_registros = $resultado->num_rows;
//Si hay registros
if ($total_registros > 0) {
    //Limito la busqueda
    $TAMANO_PAGINA = 5;
    $pagina = false;
    //examino la pagina 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 paginas
    $total_paginas = ceil($total_registros / $TAMANO_PAGINA);
    
$consulta2 = "SELECT id_foro, autor_foro, titulo_foro, fecha_foro, respuestas_foro, ult_respuesta_foro, mensaje_foro FROM foro_php_mysql WHERE identificador=0 ORDER BY ult_respuesta_foro DESC LIMIT $inicio , $TAMANO_PAGINA" or die("Error en la consulta" . mysqli_error($link));
$res_consulta2 = $link->query($consulta2);
  while
  ($row = $res_consulta2->fetch_array())
    {
        $titulo = $row['titulo_foro'];
        $autor = $row['autor_foro'];
        $respuestas = $row['respuestas_foro'];
        $ult_respuestas = $row['ult_respuesta_foro'];
        //mostramos descripción con
        $d_corta =  html_entity_decode($row['mensaje_foro']);
        //mostrar esta descripcion corta con php.
        //$d_corta = substr($row['mensaje_foro'], 0, 30)."...";
        $id = $row['id_foro'];
      echo'<tr>
        <td class="text-center"><i class="fa fa-question fa-2x text-primary"></i></td>
        <td>
          <h4><a href="./.php?id='.$id.'"> ' .$titulo. '</a>
          <br><small class="hidden-sm hidden-md hidden-lg">Autor :  <a href="#">' .$autor. '</a></small>
          <small class="hidden-xs"><div class="expandable">' .$d_corta. '</div></small>
          <br><small class="hidden-sm hidden-md hidden-lg">Respuestas :  ' .$respuestas. '</small></h4>
        </td>
        <td class="text-center hidden-xs "><a href="#">' .$autor. '</a></td>
        <td class="text-center hidden-xs ">' .$respuestas. '</td>
        <td class="hidden-xs hidden-sm"><small><i class="fa fa-clock-o"></i>    ' .$ult_respuestas. ' </small></td>
      </tr>';
    }
    
echo'<tr>
<td></td>
      <td>
      <nav>
      <ul class="pagination">';
        if ($total_paginas > 1) {
            if ($pagina != 1){
            echo '<li class="enabled"><a href="'.$url.'?pagina='.($pagina-1).'" aria-label="Previous"><span aria-hidden="true">«</span></a></li>';
            }
            else{
            echo '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">«</span></a></li>';
            }
        
        for ($i=1;$i<=$total_paginas;$i++) {
            if ($pagina == $i)
            echo '<li class="active"><a>'.$pagina.'</a></li>';
           else
            echo '<li><a href="'.$url.'?pagina='.$i.'">'.$i.'</a></li>';
            }
            
            
        if ($pagina != $total_paginas) {
        echo '<li class="enabled"><a href="'.$url.'?pagina='.($pagina+1).'" aria-label="Previous"><span aria-hidden="true">»</span></a></li>';
        }
        else{
        echo '<li class="disabled"><a aria-label="Previous"><span aria-hidden="true">»</span></a></li>';
        }
        
        }
      echo '</ul>
    </nav>';
    printf('<small>Total de páginas : </small>' .$total_paginas.'<br> <small> Mostrando página #  </small> '.$pagina);
    echo'<br>';
    printf("<small>Existen</small> %d <small>preguntas</small>.\n", $total_registros);
     echo'</td>
<td class="hidden-xs"></td>
<td class="hidden-xs"></td>
<td class="hidden-xs hidden-sm"></td>
    </tr>';
$resultado->free();
$res_consulta2->free();
}
?>
    </tbody>
  </table>
  <table class="table forum table-striped">
    <thead>
      <tr>
        <th class="cell-stat"></th>
        <th>
          <h3>Bloguero-ec</h3>
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td></td>
        <td colspan="4" class="center">copyright © <a href="http://www.bloguero-ec.com">Bloguero-ec.com</a></td>
      </tr>
    </tbody>
  </table>
</div>
</div>
</body>
</html>

En el index aún no está separado el diseño del backend pero es justo lo que queremos mostrar. Utilizando una tabla bootstrap desplegaremos los items .

foro.php.- Se encargará de mostrar el tema selecciona por el usuario y mostrarlo en pantalla recogiendo su id con un $id_foro = $_GET[«id_foro»]; si deseamos responder al tema , ya lo tendremos seleccionado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
if(mysqli_num_rows($res)>0)
{
  while ($row = $res->fetch_assoc())
    {
    $autor = $row['autor_foro'];
    $fecha = $row['fecha_foro'];
    $titulo = $row['titulo_foro'];
    $mensaje =  html_entity_decode(makeLinks($row['mensaje_foro']));
      echo'<tr>
        <td class="text-center"><i class="fa fa-question-circle fa-2x text-primary"></i></td>
        <td>
          <h4>' .$autor. '<br><small>Enviado el : ' .$fecha. '</small></h4>
        </td>
        <td class="text-left"><span class="titulo">' .$titulo. ' .</span>    
        <hr>' .$mensaje. ' </td>
      </tr>';
    }
$res->free();
}
?>

seleccionamos una tabla para mostrar los datos requeridos.

Deseas saber mas sobre el Foro Php Mysql descargalo :

Estamos trabajando en los enlaces. Gracias.