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

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.

<?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.

<?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
# Url: http://www.bloguero-ec.com
# Descripcion: Index pagina principal de foro php mysql
# Autor: Bloguero-ec
# Autor URL: http://www.bloguero-ec.com/
?>
<!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-->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<!-- estilo de plantilla-->
<link rel="stylesheet" href="estilo.css">
<!--scripts a usarse -->
<!--jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<!--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.

<?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 :

Comprar ver 1.0 Demo ver 1.0 Comprar ver 1.1 Demo ver 1.1 Demo ver 2.0 Comprar ver 2.0