Autor Tema: Sistema de Noticias Simple - 2ª Parte  (Leído 6997 veces)

Desconectado naveda

  • Administrador General
  • PHPero Master
  • *****
  • Mensajes: 2.282
  • Karma: 165
  • Sexo: Masculino
    • Ver Perfil
    • naveda.me
Sistema de Noticias Simple - 2ª Parte
« en: 19 de Noviembre de 2006, 15:00:02 pm »
En la 1ª Parte de este tutorial, dedicado a aprender a crear un Sistema de Noticias Simple basado en MySQL, aprendimos a crear el envio y la muestra de noticias.

En esta 2ª Parte aprenderemos a crear un Simple Panel de Administracion para las noticias. El objetivo fundamental de nuestro Panel será la Edicion y Eliminación de Noticias, pero como buen panel de Administración necesita un minimo de seguridad para que solo el administrador pueda acceder al panel.

Objetivos del tutorial:
  • Identificacion del Administrador
  • Edicion de Noticias
  • Eliminacion de Noticias

Vamos a comenzar creando un archivo al que llamaremos... admin_noticias.php aunque podemos llamarlo como queramos ya que no influirá en su funcionamiento.

El panel de administracion necesita un formulario de acceso para comprobar que el administrador es el unico que accede al panel, por lo tanto vamos a crearlo.

El codigo del admin_noticias.php es el siguiente:
<?PHP
/* ANTES DE TODO EL CODIGO HAY QUE CONECTAR A LA BASE DE DATOS */
if(isset($_POST[&#39;login&#39;]) && isset($_POST[&#39;user&#39;]) && isset($_POST[&#39;pass&#39;])) {
	
$admin = array("usuario","pass"); //Ejemplo
	
if (
$admin[0] == $_POST[&#39;user&#39;] && $admin[1] == $_POST[&#39;pass&#39;]) {
	
	
//Acceso Concedido
	
	
setcookie("admin",$_POST[&#39;pass&#39;],time()+3600); //El acceso durará "1 hora (3600 segundos)"
	
} else {
	
	
exit(
"Datos erroneos, acceso denegado");
	
}
}
if (!isset(
$_COOKIE[&#39;admin&#39;])) {
?>
<form action="<?=$_SERVER[&#39;PHP_SELF&#39;];?>" method="POST">
<input type="text" name="user" value="usuario"> <input type="password" name="pass" value="pass"><br>
<input type="submit" name="login" value="Acceder">
</form>
<?PHP
exit();
}
echo &
#39;<p align="center"><a href="&#39;.$_SERVER[&#39;PHP_SELF&#39;].&#39;">Principal</a></p><hr>&#39;; //Enlace en cada pagina hacia la principal
if (isset($_GET[&#39;borrar&#39;])) { //Borrado de Noticias
	
if (
is_numeric($_GET[&#39;borrar&#39;])) {
	
	
//Borrado de las noticia con id = a $_GET[&#39;borrar&#39;]
	
	
$borrando "DELETE FROM `noticias` WHERE id = &#39;".$_GET[&#39;borrar&#39;]."&#39;";
	
	
if (
mysql_query($borrando)) {
	
	
	
echo 
"La noticia #".$_GET[&#39;borrar&#39;]." ha sido borrada";
	
	
} else {
	
	
	
exit(
"Ha ocurrido algún error, la noticia no se ha borrado");
	
	
}
	
} else {
	
	
exit(
"Error: Noticia Inexistente");
	
}
} elseif (isset(
$_GET[&#39;editar&#39;])) { //Edicion de Noticias
	
if (!
is_numeric($_GET[&#39;editar&#39;])) {
	
	
exit(
"Error: Noticia Inexistente");
	
}
	
if (isset(
$_POST[&#39;edit_form&#39;])) {
	
	
$sql "UPDATE `noticias` SET titulo = &#39;".$_POST[&#39;titulo&#39;]."&#39;, ";
	
	
$sql.= "autor = &#39;".$_POST[&#39;autor&#39;]."&#39;, ";
	
	

	
	
$sql.= "fecha = &#39;".$_POST[&#39;fecha&#39;]."&#39;, ";
	
	
$sql.= "noticia = &#39;".$_POST[&#39;noticia&#39;]."&#39; WHERE id = &#39;".$_GET[&#39;editar&#39;]."&#39;";
	
	
if (
mysql_query($sql)) {
	
	
	
echo 
"La noticia #".$_GET[&#39;editar&#39;]." ha sido editada";
	
	
} else {
	
	
	
exit(
"Error: La noticia no se ha editado");
	
	
}
	
} else {
	
	
$sql mysql_query("SELECT * FROM `noticias` WHERE id = &#39;".$_GET[&#39;editar&#39;]."&#39;");
	
	
if (!
mysql_num_rows($sql)) {
	
	
	
exit(
"Error: Noticia Inexistente");
	
	
}
	
	
$noticia mysql_fetch_assoc($sql);
	
?>
	
<form action="<?=$_SERVER[&#39;PHP_SELF&#39;];?>?editar=<?=$_GET[&#39;editar&#39;];?>" method="POST">
	
	
Titulo: <input type="text" name="titulo" value="<?=$noticia[&#39;titulo&#39;];?>"><br>
	
	
Autor: <input type="text" name="autor" value="<?=$noticia[&#39;autor&#39;];?>"><br>
	
	
Fecha: <input readonly type="text" name="fecha" value="<?=$noticia[&#39;fecha&#39;];?>"><br>
	
	
<textarea name="noticia"><?=$noticia[&#39;noticia&#39;];?></textarea><br>
	
	
<input type="submit" name="edit_form" value="Editar Noticia">
	
</form>
	
<?PHP
	
	
mysql_free_result($noticia);
	
}
} else { 
//Listado de Noticias
	
$query mysql_query("SELECT * FROM `noticias` ORDER BY `id` DESC"); //Se extraen las noticias en orden reciente
	
if (
mysql_num_rows($query)) { // Se comprueba si hay alguna noticia publicada
	
	
while (
$noticia mysql_fetch_array($query)) { //Se hace un bucle para mostrar cada noticia una a una
	
	
	
echo &
#39;<table border="0" width="100%">
	
	
	
	
<
tr><td align="center">&#39;.$noticia[&#39;titulo&#39;].&#39;</td></tr>
	
	
	
	
<
tr><td>&#39;.$noticia[&#39;noticia&#39;].&#39;</td></tr>
	
	
	
	
<
tr><td>Enviada por &#39;.$noticia[&#39;autor&#39;].&#39; || Fecha: &#39;.$noticia[&#39;fecha&#39;].&#39;</td></tr>
	
	
	
	
<
tr><td><b>Opciones Admin:</b> &#39;;
	
	
	
echo &
#39;<a href="&#39;.$_SERVER[&#39;PHP_SELF&#39;].&#39;?borrar=&#39;.$noticia[&#39;id&#39;].&#39;">Borrar</a> || 
	
	
	
	
<
a href="&#39;.$_SERVER[&#39;PHP_SELF&#39;].&#39;?editar=&#39;.$noticia[&#39;id&#39;].&#39;">Editar</a></td></tr>
	
	
	
</
table><hr>&#39;;
	
	
}
	
} else {
	
	
echo 
"No hay ninguna noticia publicada";
	
}
	
mysql_free_result($noticia); //Se borran los datos usados
}
?>


EXPLICACIÓN

Bueno antes de empezar la explicación detallada voy a resumir las funciones que han sido utilizadas en esta 2ª parte.
Funciones Utilizadas:
    isset(); //Comprueba si una variable existe
    array(); //Crea una matriz
    setcookie(); //Crea, Modifica o Elimina Cookies
    time(); //Extrae la fecha y hora del servidor
    exit(); //Cierra el Proceso del codigo
    is_numeric(); //Comprueba si una variables es numerica
    mysql_query(); //Procesa el codigo SQL en la base de datos
    mysql_fetch_assoc(); //Extrae datos de MySQL en una matriz
    mysql_free_result(); //Libera los datos extraidos de la base de datos
    mysql_num_rows(); //Extrae el numero de filas segun el codigo SQL
    mysql_fetch_array(); //Extrae datos de MySQL en una matriz
    [/list]

    Ahora voy a explicar paso a paso el proceso que sigue el codigo de una forma sencilla.
    • Conexión a la base de datos MySQL
    • Se comprueba mediante usuario y contraseña
      • Si es admin, Se crea una cookie llamada admin
      • Si no es admin, se finaliza el proceso avisando "Acceso Denegado"
      • Se comprueba si la cookie admin existe (si existe es admin)
        • Si EXISTE:
          • Se muestra el enlace superior para ir a la principal
        • Se comprueba si se ha elegido borrar alguna noticia
          • Si ha sido elegido borrar:
            • Se comprueba si el numero de la noticia es valido, si no se finaliza el proceso.
            • Se borra la noticia elegida
          • Si NO se ha elegido borrar:
            • Se comprueba si ha elegido editar alguna noticia
          • Si ha elegido EDITAR
            • Se comprueba si el numero de la noticia es valido, si no se finaliza el proceso.
            • Se comprueba si se ha pulsado el boton "editar" del formulario de edición
            • Si se HA PULSADO, se edita la noticia
            • Si NO se ha pulsado, se muestra el formulario de edición
        • Si no se ha elegido ni BORRAR, ni EDITAR, se muestra el listado de noticias
        • Si la cookie "admin" no existe, se muestra el formulario de identificación y se finaliza el proceso siguiente
        [/list]

        « Última modificación: 05 de Febrero de 2008, 00:15:08 am por naveda »
        Por favor, leete las Normas


        Comunidad PHPeros

        Sistema de Noticias Simple - 2ª Parte
        « en: 19 de Noviembre de 2006, 15:00:02 pm »

        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #1 en: 09 de Diciembre de 2006, 23:21:08 pm »
        naveda en esto tengo una duda.. cuando subo el admin_noticias
        sale lo del login pero que datos hay que poner? :S

        Desconectado Revancha

        • PHPero Avanzado
        • ****
        • Mensajes: 375
        • Karma: 22
        • Sexo: Masculino
          • Ver Perfil
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #2 en: 09 de Diciembre de 2006, 23:34:13 pm »
        naveda en esto tengo una duda.. cuando subo el admin_noticias
        sale lo del login pero que datos hay que poner? :S

        Debes modificar esa linea:

        $admin = array("usuario","pass"); //Ejemplo

        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #3 en: 10 de Diciembre de 2006, 00:17:56 am »
        ami me pone datos incorrectos i a raken provo con mis datos i le sale en blanco dice que por culpa de las cokies
        « Última modificación: 10 de Diciembre de 2006, 00:29:47 am por Drek »

        Desconectado Keon

        • PHPer@ Fijo
        • ***
        • Mensajes: 105
        • Karma: 0
          • Ver Perfil
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #4 en: 10 de Diciembre de 2006, 21:22:49 pm »
        Muy buenos,

        haces tu los scripts??




        Respeta las normas ;)

        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #5 en: 10 de Diciembre de 2006, 21:38:22 pm »
        a quien le dices a naveda? supongo que si los hara el

        Desconectado Keon

        • PHPer@ Fijo
        • ***
        • Mensajes: 105
        • Karma: 0
          • Ver Perfil
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #6 en: 10 de Diciembre de 2006, 22:48:26 pm »
        Tengo un error:

        Cuando voy ha enviar una noticia me pone esto:

          Ha ocurrido un error, no se ha procesado la noticia




        Respeta las normas ;)

        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #7 en: 10 de Diciembre de 2006, 23:19:35 pm »
        as echo el conectar? i as puesto include?

        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #8 en: 29 de Diciembre de 2006, 19:33:56 pm »
        pues yo tengo un problema, aora, al entrar en admin_noticias me sale esto:


        Warning: mysql_query(): Access denied for user 'admin114495'@'localhost' (using password: NO) in /home/virtual/sitio114495/www/admin_noticias.php on line 66

        Warning: mysql_query(): A link to the server could not be established in /home/virtual/sitio114495/www/admin_noticias.php on line 66

        Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio114495/www/admin_noticias.php on line 67
        No hay ninguna noticia publicada
        Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio114495/www/admin_noticias.php on line 80

        Desconectado naveda

        • Administrador General
        • PHPero Master
        • *****
        • Mensajes: 2.282
        • Karma: 165
        • Sexo: Masculino
          • Ver Perfil
          • naveda.me
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #9 en: 29 de Diciembre de 2006, 19:39:12 pm »
        Access denied for user => Acceso denegado al usuario

        Esto quiere decir, como su misma traducción indica, que no ha conectado a la base de datos y por tanto las funciones mysql_query, mysql_num_rows y mysql_free_result no han funcionado...

        Solucion: Conectar correctamente a la base de datos
        Por favor, leete las Normas


        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #10 en: 29 de Diciembre de 2006, 19:43:21 pm »
        bueno faltava el include conectar pero de tantos errores emos pasado a :


        Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /home/virtual/sitio114495/www/admin_noticias.php on line 80

        Desconectado naveda

        • Administrador General
        • PHPero Master
        • *****
        • Mensajes: 2.282
        • Karma: 165
        • Sexo: Masculino
          • Ver Perfil
          • naveda.me
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #11 en: 29 de Diciembre de 2006, 19:46:50 pm »
        Eso debe suceder porque no tienes noticias publicadas y esta intentando liberar una variable inexistente, la solución es poner el simbolo @ frente a la funcion mysql_free_result();
        Por favor, leete las Normas


        Desconectado Drek

        • PHPer@ Fijo
        • ***
        • Mensajes: 193
        • Karma: 0
        • Sexo: Masculino
          • Ver Perfil
          • radiogoods
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #12 en: 29 de Diciembre de 2006, 19:52:47 pm »
        eso es colega ya esta listo gracias seguramente en el otro apartado de los bbcodes tambien necesite jaj

        Desconectado x.mara.x

        • PHPero Master
        • ******
        • Mensajes: 1.364
        • Karma: 57
        • Sexo: Femenino
          • Ver Perfil
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #13 en: 29 de Septiembre de 2007, 18:44:30 pm »
        Antes en las noticias me salia Enviado Por Autor.. y queria que saliera el nombre que pusieran en el form asi que puse en

        form.html

        <form action="enviar.php" method="POST">
        <input type="text" name="titulo" value="Titulo de la noticia"><br>
        <input type="text" name="autor" value="Tu Nombre"><br>
        <textarea name="noticia">El texto de la noticia</textarea><br>
        <input type="submit" name="enviar" value="Enviar Noticia">
        </form>

        y en
        enviar.php


        <?PHP
        include ("conectar.php");
        if (isset(
        $_POST[&#39;enviar&#39;])) { //Se comprueba si el boton enviar ha sido pulsado
        	
        if (!empty(
        $_POST[&#39;titulo&#39;]) && !empty($_POST[&#39;noticia&#39;])) { //Se comprueba si los campos no estan vacios
        	
        	
        $sql "INSERT INTO `noticias` (titulo,noticia,autor,fecha) values"//Definimos el codigo para...
        	
        	
        $sql.= "(&#39;".$_POST[&#39;titulo&#39;]."&#39;,&#39;".$_POST[&#39;noticia&#39;]."&#39;,&#39;".$_POST[&#39;autor&#39;]."&#39;,&#39;".time()."&#39;)"; //...Ingresar los datos del formulario en la DB
        	
        	
        if (
        mysql_query($sql)) { //Aquí se ingresa y se comprueba si se ha ingresado bien
        	
        	
        	
        echo 
        "Noticia Enviada Correctamente";
        	
        	
        } else { 
        //Si algo ha fallado
        	
        	
        	
        echo 
        "Ha ocurrido un error, no se ha procesado la noticia";
        	
        	
        }
        	
        } else { 
        //Si faltan campos por completar
        	
        	
        echo 
        "La noticia no se ha enviado, completa el formulario";
        	
        }
        } else { 
        ?>
        <form action="enviar.php" method="POST">
        <input type="text" name="titulo" value="Titulo de la noticia"><br>
        <textarea name="noticia">El texto de la noticia</textarea><br>
        <input type="submit" name="enviar" value="Enviar Noticia">
        </form>
        <? ?>


        Tal vez no tenga ningun uso.. y tal vez fue una cosa super novata de mi parte.. pero no me doy credito para nada.. esto fue echo por naveda yo solo descubri algo y lo quise postear como soy muy novata xd pero bueno para los novatos como yo (sin ofender) espero que les sirva
        « Última modificación: 29 de Septiembre de 2007, 20:12:59 pm por mOrK »

        Desconectado x.mara.x

        • PHPero Master
        • ******
        • Mensajes: 1.364
        • Karma: 57
        • Sexo: Femenino
          • Ver Perfil
        Re: Sistema de Noticias Simple - 2ª Parte
        « Respuesta #14 en: 29 de Septiembre de 2007, 19:10:20 pm »
        Ahora me sale 1 problema.. dice que en la linea 80 de admin_noticias.php sale algo de mysql_free_result() y dice que es un error..

        « Última modificación: 29 de Septiembre de 2007, 19:55:45 pm por x.mara.x »