Comunidad PHPeros
Lenguajes => PHP => Tutoriales PHP => Mensaje iniciado por: naveda 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['login']) && isset($_POST['user']) && isset($_POST['pass'])) {
$admin = array("usuario","pass"); //Ejemplo
if ($admin[0] == $_POST['user'] && $admin[1] == $_POST['pass']) {
//Acceso Concedido
setcookie("admin",$_POST['pass'],time()+3600); //El acceso durará "1 hora (3600 segundos)"
} else {
exit("Datos erroneos, acceso denegado");
}
}
if (!isset($_COOKIE['admin'])) {
?>
<form action="<?=$_SERVER['PHP_SELF'];?>" 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 '<p align="center"><a href="'.$_SERVER['PHP_SELF'].'">Principal</a></p><hr>'; //Enlace en cada pagina hacia la principal
if (isset($_GET['borrar'])) { //Borrado de Noticias
if (is_numeric($_GET['borrar'])) {
//Borrado de las noticia con id = a $_GET['borrar']
$borrando = "DELETE FROM `noticias` WHERE id = '".$_GET['borrar']."'";
if (mysql_query($borrando)) {
echo "La noticia #".$_GET['borrar']." ha sido borrada";
} else {
exit("Ha ocurrido algún error, la noticia no se ha borrado");
}
} else {
exit("Error: Noticia Inexistente");
}
} elseif (isset($_GET['editar'])) { //Edicion de Noticias
if (!is_numeric($_GET['editar'])) {
exit("Error: Noticia Inexistente");
}
if (isset($_POST['edit_form'])) {
$sql = "UPDATE `noticias` SET titulo = '".$_POST['titulo']."', ";
$sql.= "autor = '".$_POST['autor']."', ";
$sql.= "fecha = '".$_POST['fecha']."', ";
$sql.= "noticia = '".$_POST['noticia']."' WHERE id = '".$_GET['editar']."'";
if (mysql_query($sql)) {
echo "La noticia #".$_GET['editar']." ha sido editada";
} else {
exit("Error: La noticia no se ha editado");
}
} else {
$sql = mysql_query("SELECT * FROM `noticias` WHERE id = '".$_GET['editar']."'");
if (!mysql_num_rows($sql)) {
exit("Error: Noticia Inexistente");
}
$noticia = mysql_fetch_assoc($sql);
?>
<form action="<?=$_SERVER['PHP_SELF'];?>?editar=<?=$_GET['editar'];?>" method="POST">
Titulo: <input type="text" name="titulo" value="<?=$noticia['titulo'];?>"><br>
Autor: <input type="text" name="autor" value="<?=$noticia['autor'];?>"><br>
Fecha: <input readonly type="text" name="fecha" value="<?=$noticia['fecha'];?>"><br>
<textarea name="noticia"><?=$noticia['noticia'];?></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 '<table border="0" width="100%">
<tr><td align="center">'.$noticia['titulo'].'</td></tr>
<tr><td>'.$noticia['noticia'].'</td></tr>
<tr><td>Enviada por '.$noticia['autor'].' || Fecha: '.$noticia['fecha'].'</td></tr>
<tr><td><b>Opciones Admin:</b> ';
echo '<a href="'.$_SERVER['PHP_SELF'].'?borrar='.$noticia['id'].'">Borrar</a> ||
<a href="'.$_SERVER['PHP_SELF'].'?editar='.$noticia['id'].'">Editar</a></td></tr>
</table><hr>';
}
} 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]
-
naveda en esto tengo una duda.. cuando subo el admin_noticias
sale lo del login pero que datos hay que poner? :S
-
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
-
ami me pone datos incorrectos i a raken provo con mis datos i le sale en blanco dice que por culpa de las cokies
-
Muy buenos,
haces tu los scripts??
-
a quien le dices a naveda? supongo que si los hara el
-
Tengo un error:
Cuando voy ha enviar una noticia me pone esto:
Ha ocurrido un error, no se ha procesado la noticia
-
as echo el conectar? i as puesto include?
-
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
-
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
-
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
-
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();
-
eso es colega ya esta listo gracias seguramente en el otro apartado de los bbcodes tambien necesite jaj
-
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['enviar'])) { //Se comprueba si el boton enviar ha sido pulsado
if (!empty($_POST['titulo']) && !empty($_POST['noticia'])) { //Se comprueba si los campos no estan vacios
$sql = "INSERT INTO `noticias` (titulo,noticia,autor,fecha) values"; //Definimos el codigo para...
$sql.= "('".$_POST['titulo']."','".$_POST['noticia']."','".$_POST['autor']."','".time()."')"; //...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
-
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..
-
Sucede por una simple razón.
En la tabla donde se guardan las noticias no hay ninguna entrada, con lo cual al usar la funcion mysql_free_result() estamos pidiendo al codigo que libere la memoria usada pero, claro, al no haber ninguna entrada no hay datos que liberar de la memoria, con lo cual, esto conlleva a un error que es mejor ocultar y olvidarse de él.
¿Como ocultar este error tan simple?
Con un @ frente a la aplicación de esa función solucionamos el problema.
Ejemplo:
@mysql_free_result($array);
-
muchisimas gracias naveda :D .. ahora la fecha em da error :(
-
Como comprenderás necesito que me digas que error... aun no tengo poderes de adivinacion jajajaja ;)
-
haha disculpa mira.. esque no sale la fecvha sale un numero raro algo oxcmo 117799 o no se unos numeros alli raros, pero la fecha no sale :S
-
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]
¿De donde sacaste eso, lo inventaste vos, lo descubriste, como?
-
php.net/nombre_funcion
...
-
autorojo como revancha a "indicado" se puede conocer las acciones de cada funcion mirandolo en www.php.net
-
sincermente no entiendo :S:S :( eso salia en el codigo :S
-
Noticias Mejorado :o
Haci se Mostrara la Fecha Bien:
<style type="text/css">
.estilotabla{
background-color:ffffff;
border-style:solid;
border-color:666666;
border-width:1px;
align: center;
}
.estilocelda{
background-color:ddeeff;
color:333333;
font-weight:bold;
font-size:10pt;
align: center;
}
</style>
<?PHP
include("conectar.php");
include("funciones.php");
$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
$fecha = $noticia[fecha] ;
$mesesano = array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
"Septiembre","Octubre","Noviembre","Diciembre") ;
$diames = date(j,$fecha) ; $mesano = date(n,$fecha) - 1 ; $ano = date(Y,$fecha) ;
$fecha = "$diames de $mesesano[$mesano] del $ano" ;
echo '<table width=280 height=18 cellpadding=2 cellspacing=2 class="estilotabla" align="center">
<tr><td align="center" border="1">'.filtro_palabras(bbcode($noticia['titulo'])).'</td></tr></table>
<table width=280 height=18 cellpadding=2 cellspacing=2 class="estilotabla" align="center"><tr><td>'.filtro_palabras(bbcode($noticia['noticia'])).'</td></tr>
<tr><td>Enviada por '.$noticia['autor'].' || Fecha: '.$fecha.'</td></tr>
</table><hr>';
}
} else {
echo "No hay ninguna noticia publicada";
}
@mysql_free_result($noticia); //Se borran los datos usados
?>
Saludos, Dacan ;)
-
Estimado dacan, ya que tu decias que mi mini-tuto de "defined" era de electros, y es mentira, ahora yo te dire
Lo de las noticias en español, es de las noticias de electros!!!
-
Cierto, no ha cambiado ni los nombres de las variables, ni el orden de las variables... ejejje
-
Si es Cierto pongan la fuente se me olvido :S..
-
Error
Warning: Cannot modify header information - headers already sent by (output started at /srv/disk10/1149158/www/alexz.medianewsonline.com/panel.php:9) in /srv/disk10/1149158/www/alexz.medianewsonline.com/panel.php on line 36
if ($admin[0] == $_POST['user'] && $admin[1] == $_POST['pass']) {
setcookie("admin",$_POST['pass'],time()+3600); // En esta linea si pongo un @setcookie Directamente ni va el formulario xD
} else {
exit("Datos erroneos, acceso denegado");
Creo que es el servidor!!