1. UNIVERSIDAD DEL TOLIMA
IDEAD PROGRAMA INGENIERIA DE SISTEMAS POR CICLOS
PROYECTO:
DIAGNOSTICACION DE ENFERMEDADES EN EL GANADO BOVINO ASISTIDO
POR UN SOFTWARE DE SISTEMA EXPERTO.
MANUAL DEL PROGRAMADOR
PROYECTO FIN DE CARRERA
REALIZADO POR: EDWIN GEOVANNY SANCHEZ JARAMILLO
GIOVANNI ALEJANDRO GONZALEZ GARAVITO
HENRY MAURICIO ARENAS CANIZALES
OSCAR ANIBAL BERNAL GARCIA
DIRIGIDO POR EL TUTOR: ANGEL ALBERTO CANO
INGENIERO DE SISTEMAS
Ibagué 23 de junio 2013
2. SOFTWARE DE GESTION Y DIAGNOSTICO VIRTUAL DE TRATAMIENTO DE
ENFERMEDADES EN EL GANADO BOVINO
Trabajo presentado como requisito para proyecto de investigación formativa
CICLO PROFESIONAL
EDWIN GEOVANNY SANCHEZ JARAMILLO
GIOVANNI ALEJANDRO GONZALEZ GARAVITO
HENRY MAURICIO ARENAS CANIZALES
OSCAR ANIBAL BERNAL GARCIA
UNIVERSIDAD DEL TOLIMA
INSTITUTO DE EDUCACION A DISTANCIA IDEAD
INGENIERIA DE SISTEMAS POR CICLOS
IBAGUE -TOLIMA
2013
4. INDICE (MANUAL DEL PROGRAMADOR)
1. INTRODUCCION AL MANUAL DEL PROGRAMADOR………………….1
1.- Introducción…………………………………………....1
2. PROGRAMACION………………………….…………………………………2
1.- Fundamentos de Programación……………………..1
2.- Programación del Programa Principal.....……….....2
5. 1. INTRODUCCIO AL MANUAL DEL PROGRAMADOR.
1.- Introducción.
El propósito de este manual del programador, es dar a conocer al lector los
códigos fuentes del programa realizado. Para ello tratamos de forma amena y
concisa cada uno de los códigos junto con la programación utilizada en el
desarrollo del software, esto con el fin de que el usuario pueda modificar a gusto
alguno de los valores y parámetros de las funciones que se encuentran expuestas
en la programación del SBE-ONLINE.
6. 2. PROGRAMACION
1.- Fundamentos de programación.
Para inicial el programa se utilizan dos opciones esenciales, primero registrarse, y
segundo después de estar registrado, Loguearse.
Hemos incluido un ejemplo que ilustrara fácilmente la iniciación de los dos pasos
anteriormente enunciados, esto será utilizado para que los usuarios nuevos se
enteren de cómo se da inicio o arranque al programa.
Primero Registrarse:
Damos clic en, ¿no estas registrado?
7. Segundo paso: al introducir el usuario y la contraseña creada el programa nos da
la bienvenida mostrándonos un menú donde encontraremos las diferentes
funciones que nos ofrece el servicio del programa.
Lo presentado anteriormente es únicamente la forma de inicio necesario para el
programa, la cual es la forma estándar de inicio.
De esta manera estamos dentro del
formulario de registro de usuario
Luego de llenar los espacios damos
registrar
Registros Consultas Diagnostico
8. 2.- Programación del programa principal
user_auth_fns:
mysqli_query:
Realiza una consulta o busqueda(query) en la base de datos.
Para consultas que no sean DML (distintas de INSERT, UPDATE o
DELETE), esta funcion es similar a invocar a mysqli_real_query()
seguida de mysqli_use_result() o mysqli_store_result().
<?
require_once("db_fns.php");
$error;
function register($username, $email, $password, $nombre,
$apellido,$celular)
{
if ($conn = db_connect()) {
// check if username is unique
$result=mysqli_query($conn,"select * from user where
username='$username'");
if (!$result){
global $error;
$error="No se pudo ejecutar la petición";
return false;
exit;
}else{
$num=mysqli_num_rows($result);
9. if($num > 0) {
global $error;
$error= "Ese nombre de usuario ya esta ocupado -
vuelve y elige otro.";
return false;
exit;
}else{
$result=mysqli_query($conn,"insert into user
(username, pass, email, nombre, apellido, celular) values
('$username',
SHA1('$password'), '$email','$nombre','$apellido','$celular')");
if (!$result) {
global $error;
$error="No has podido ser registrado en
la base de datos - por favor inténtalo más tarde.";
return false;
}else return true;
}
}
}
else {
global $error;
$error= "No se puede conectar al servidor de la base de
datos - por favor inténtalo más tarde.";
return false;
}
}
function login($username, $password)
{
if ($conn = db_connect()){
// check if username is unique
$result = mysqli_query($conn,"select * from user where
username='$username' and pass = SHA1('$password')");
$num=mysqli_num_rows($result);
if ($num > 0)
return true;
else
return false;
}
}
function check_valid_user()
// see if somebody is logged in and notify them if not
{
if (isset($_SESSION["valid_user"]))
{
$valid_user = $_SESSION["valid_user"];
10. echo "Logged in como $valid_user";
echo "<br>";
}
else
{
// they are not logged in
do_html_heading("Problema:");
echo "No estás logged in.<br>";
do_html_url("index.php", "Login");
do_html_footer();
exit;
}
}
?>
show_med
<?
require("bovino_fns.php");
session_start();
do_html_header("Medicamentos");
check_valid_user();
$med_array = get_meds($_GET["cod]);
display_meds($med_array);
do_html_footer();
11. ?>
register_new:
Nota:
ECHO no es realmente una función (es una construcción del
lenguaje), por lo que no es necesario utilizar paréntesis con él.
Echo (a diferencia de algunas otras construcciones de lenguaje)
no se comporta como una función, por lo que no siempre puede
ser utilizado en el contexto de una función. Además, si usted
desea pasar más de un parámetro de eco, los parámetros no
deben estar encerrados entre paréntesis.
12. $_POST:
Un array asociativo de variables pasadas al script actual a través
del método HTTP POST.
$HTTP_POST_VARS contiene la misma información inicial, pero
no es una superglobal. (Nótese que $HTTP_POST_VARS y
$_POST son diferentes variables y que PHP las trata de forma
distinta)
<?
require_once("bovino_fns.php");
session_start();
if(isset($_POST) && !empty($_POST))
{
if(filled_out($_POST)){
var_dump($_POST);
$pass = $_POST["pass"];
if (strlen($pass)<6 || strlen($pass) >100)
{
do_html_header("Problema:");
echo "Tu contraseña debe tener minimo 6
caracteres y max 100 ."
."Por favor vuelve e inténtalo de nuevo.";
do_html_footer();
exit;
}
if ($pass != $_POST["passwd2"])
{
do_html_heading("Problema:");
echo "La contraseña que has entrado no concuerda
- por favor vuelve"
." e inténtalo de nuevo.";
do_html_url("register_form.php", "atras");
do_html_footer();
exit;
}
if (!valid_email($_POST["email"]))
{
do_html_header("Problema:");
echo "No es una dirección email válida. Por
favor vuelve "
." e inténtalo de nuevo.";
do_html_footer();
exit;
}
13. $celular = $_POST["celular"];
if (!valid_cel($celular))
{
do_html_header("Problema:");
echo "No es un numero celular válido. Por favor
vuelve "
." e inténtalo de nuevo.";
do_html_footer();
exit;
}
if (strlen($celular)<10)
{
do_html_header("Problema:");
echo "Tu celular debe tener 10 numeros ."
."Por favor vuelve e inténtalo de nuevo.";
do_html_footer();
exit;
}
$reg_result = register($_POST["username"],
$_POST["email"],
$pass,$_POST["nombre"],$_POST["apellido"],$celular);
if ($reg_result){
$valid_user = $_POST["username"];
$_SESSION["valid_user"] = $valid_user;
do_html_header("Registro correcto");
echo "Tu registro se ha hecho correctamente.";
display_user_menu();
do_HTML_URL("member.php", "Ir a la página de
miembros");
do_html_footer();
exit;
}else{
do_html_header("Problema:");
echo"no se pudo registrar el usuario ";
echo $GLOBALS['error'];
do_html_footer();
exit;
}
}else{
do_html_header("Problema:");
echo "No has cubierto el formulario correctamente
- Por favor vuelve e inténtalo de nuevo. ";
do_html_footer();
exit;
}
}
else
{
echo '<script
text="text/javascript">location.href="register_form.php"</script>'
;
}
15. register_ani:
$GLOBALS — Hace referencia a todas las variables disponibles
en el ámbito global
Descripción:
Es un array asociativo que contiene las referencias a todas la
variables que están definidas en el ámbito global del script. Los
nombres de las variables son las claves del array.
<?
require_once("bovino_fns.php");
session_start();
if(isset($_POST) && !empty($_POST))
{
if(filled_out($_POST)){
$username= $_SESSION["valid_user"];
$reg_result = registerAnimal($username,
$_POST["nomanimal"], $_POST["estatura"], $_POST["peso"],
$_POST["color"], $_POST["raza"], $_POST["sexo"],
$_POST["nacimiento"]);
if ($reg_result){
do_html_header("Registro correcto");
17. output_fn:
<INPUT>
La tag <input> define la introducción de variables. Junto a esta
tag encontraremos los siguientes atributos:
type="" Indicará el tipo de variable a introducir.
text Indica que el campo a introducir será un texto. Sus atributos:
maxlenght="" Seguido de un valor que limitará el número máximo
de carácteres a introducir en ese campo.
size="" Seguido de un valor que limitará el numero de carácteres
a mostrar en pantalla.
value="" Indica que no hay valor inicial del campo.
Password Indica que el campo a introducir será una palabra de
paso. Mostrará asteriscos en lugar de letras escritas. Sus
atributos serán los mismos que para text.
18. Checkbox El campo se elegirá marcando de entre varias opciones
una casilla cuadrada.
value="" Entre comillas se indicará el valor de la casilla.
checked La casilla aparecerá marcada por defecto.
Radio El campo se elegirá marcando de entre varias opciones una
casilla circular.
value="" Entre comillas se indicará el valor de la casilla.
Image El campo contendrá el valor en coordenadas del punto de
la imagen que haya pinchado. Atributo obligatorio:
src="" Entre comillas escribiremos el nombre del archivo de
imagen.
hidden El visitante no puede modificar su valor ya que no está
visible. Se manda siempre junto al atributo value= seguido de su
valor entre comillas.
Name="" Indicará el nombre que se asigna a un determinado
campo.
<?php
function do_html_header($title)
{
// print an HTML header
?>
<!DOCTYPE HTML>
<html lang="es">
<head>
<title><?=$title?></title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-
scale=1, maximum-scale=1">
<link rel="stylesheet" href="js/jquery.mobile.structure.css"
/>
<link rel="stylesheet" href="css/jquery.mobile.css" />
<script src="js/jquery.js"></script>
<script src="js/jquery.mobile.js"></script>
<style type="text/css">
li.centrado, h1.centrado,p.centrado{text-align:center;}
</style>
</head>
<body>
<div data-role="page">
<?
if($title)
do_html_heading($title);
19. }
function do_html_footer()
{
// print an HTML footer
?>
</div><!--page-->
</body>
</html>
<?
}
function do_html_heading($heading)
{
// print heading
?>
<header data-role="header">
<h1><?=$heading?></h1>
<a href="#" data-rel="back">atras</a>
<a href="info.php">info</a>
</header>
<?
}
function display_user_menu()
{
// display the menu options on this page
?>
<footer data-role="footer" data-position="fixed">
<nav data-role="navbar">
<ul>
<li><a href="member.php" data-icon="home">Inicio</a></li>
<li><a href="ani_regis_form.php" data-icon="edit">Registrar
animal</a></li>
<li><a href="ani_query_form.php" data-
icon="search">Consultar animales</a></li>
<li><a href="diag_form.php" data-
icon="grid">Diagnosticar</a></li>
<li><a href="logout.php" data-icon="back">Logout</a></li>
</ul>
</nav>
</footer>
<?
}
function do_html_URL($url, $name)
{
// output URL as link and br
?>
<br><a href="<?=$url?>"><?=$name?></a><br>
<?
20. }
function display_site_info()
{
// display some marketing info
?>
<section>
<p class="centrado">
Registra tus animales!
diagnostica sus enfermedades!
</p>
</section>
<?
}
function display_login_form()
{
?>
<article data-role="content">
<h1>Login</h1>
<a href="register_form.php" data-
transition="slidedown">¿No estas registrado?</a>
<form action="member.php" method="post">
<table>
<tr>
<td>Usuario:</td>
<td><input type="text" name=username required
></td>
</tr>
<tr>
<td>Contraseña:</td>
<td><input type="password" name=pass
required></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="conectar"></td>
</tr>
</table>
</form>
</article>
<?
}
function display_registration_form()
{
?>
<article data-role="content">
26. $_SESSION:
Las sesiones son una forma sencilla de almacenar datos para
usuarios de manera individual usando un ID de sesión único. Esto
se puede usar para hacer persistente la información de estado
entre peticiones de páginas. Los ID de sesiones normalmente son
enviados al navegador mediante cookies de sesión, y el ID se usa
para recuperar los datos de sesión existente. La ausencia de un
ID o una cookie de sesión permite saber a PHP para crear una
nueva sesión y generar un nuevo ID de sesión.
Las sesiones siguen un flujo de trabajo sencillo. Cuando una
sesión se inicia, PHP recuperará una sesión existente usando el
ID pasado (normalmente desde una cookie de sesión) o, si no se
pasa una sesión, se creará una sesión nueva. PHP rellenará la
variable superglobal $_SESSION con cualesquiera datos de
sesión de que se inicie la seisón. Cuando PHP se cierra,
automáticamente toma el contenido de la variable superglobal
$_SESSION, la serializa, y la envía para almacenarla usando el
gestor de almacenamiento de sesiones.
<?
// include function files for this application
require_once("bovino_fns.php");
session_start();
if (isset($_POST["username"])) {
$username = $_POST["username"];
$pass = $_POST["pass"];
if (login($username, $pass))
{
// if they are in the database register the user id
$valid_user = $username;
$_SESSION["valid_user"]=$username;
}
else
{
// unsuccessful login
27. do_html_header("Problema:");
echo "No has podido hacer logged in. Debes estar logged in
para ver esta p�gina.";
do_html_url("index.php", "Login");
do_html_footer();
exit;
}
}
do_html_header("Menu");
check_valid_user();
?>
<article data-role="content">
<h1 class="centrado">Bienvenidos al sistema experto bovino
online</h1>
</article>
<?
// give menu of options*/
display_user_menu();
do_html_footer();
?>
28. Logout:
<?
// include function files for this application
require_once("bovino_fns.php");
session_start();
// start output html
do_html_header("Logging Out");
if (!empty($_SESSION["valid_user"]))
{
unset($_SESSION["valid_user"]);
$result_dest = session_destroy();
if ($result_dest)
{
// if they were logged in and are now logged out
echo "chao, vuelve pronto<br>";
do_html_url("index.php", "Login");
}
else
{
// they were logged in and could not be logged out
echo "No hemos podido hacer Log Out.<br>";
29. }
}
else
{
// if they weren't logged in but came to this page somehow
echo "No te encuentras logged in, así que no hemos podido hacer
logged out.<br>";
do_html_url("index.php", "Login");
}
do_html_footer();
?>
Info:
<?
// include function files for this application
require_once("bovino_fns.php");
// start output html
do_html_header("Info");
?>
<ul data-role="listview" data-inset="true">
<li class="centrado">Sistema experto bovino virtual V 1.0<br>
32. do_html_footer();
?>
db_fns:
Arrays
Un array en PHP es realmente un mapa ordenado. Un mapa es un
tipo de datos que asocia valores con claves. Este tipo es
optimizado para varios usos diferentes; puede ser usado como
una matriz real, una lista (vector), una tabla asociativa (una
implementación de un mapa), diccionario, colección, pila, cola, y
posiblemente más. Ya que los valores de un array pueden ser
otros arrays, árboles y también son posibles arrays
multidimensionales.
<?
function db_connect()
{
//$connect = mysqli_connect("localhost", "observat_bovino",
"*1085*sb","observat_sebovino");
$connect = mysqli_connect("localhost", "root", "","login");
if (!$connect){
echo "error al conectar: ".mysqli_connect_error();
return false;
}else
return $connect;
}
function db_result_to_array($result)
{
$res_array = ();
for ($count=0; $row = @mysql_fetch_array($result); $count++)
$res_array[$count] = $row;
return $res_array;
}
?>
33. _____________________________________________________________________
data_valid_fns:
foreach:
El constructor foreach proporciona un modo sencillo de iterar
sobre arrays. foreach funciona sólo sobre arrays y objetos, y
emitirá un error al intentar usarlo con una variable de un tipo
diferente de datos o una variable no inicializada.
<?
function filled_out($form_vars)
{
$flag=true;
foreach ($form_vars as $key => $value)
{
if (empty($value)) {
$flag=false;
}
}
return $flag;
}
function valid_email($address)
{
// check an email address is possibly valid
if (preg_match("#^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-
.]+$#", $address))
return true;
else
return false;
}
function valid_cel($cel){
if (preg_match("#[0-9.]#", $cel))
return true;
else
return false;
}
function valid_string($str){
if (preg_match("#[a-zA-Z]#", $str))
return true;
else
return false;
}
?>
____________________________________________________________________
34. bovino_fns:
<?
// We can include this file in all our files
// this way, every file will contain all our functions
require_once("data_valid_fns.php");
require_once("db_fns.php");
require_once("user_auth_fns.php");
require_once("output_fns.php");
require_once("animal_fns.php");
?>
animal_fns:
35. trigger_error — Generar un mensaje de error/advertencia/aviso de
nivel de usuario
Se usa para provocar una condición de error de usuario, se puede
utilizar junto con el gestor de errores interno o con una función
definida por el usuario que ha sido establecida como el nuevo
gestor de errores.
Esta función es útil cuando se necesita generar una respuesta en
particular a una excepción en tiempo de ejecución
<?
require_once("db_fns.php");
$error;
function registerAnimal($username, $nomanimal, $estatura, $peso,
$color, $raza, $sexo, $nacimiento){
// connect to db
if ($conn = db_connect()) {
// check if nomanimal is unique
$result=mysqli_query($conn,"select * from animal where
username='$username' and nomanimal='$nomanimal'");
if (!$result) {
global $error;
$error= "No se pudo ejecutar la peticion";
return false;
exit;
}else{
$num=mysqli_num_rows($result);
if($num > 0) {
global $error;
$error="Ese nombre de animal ya esta ocupado - vuelve y
elige otro.";
return false;
exit;
}else{
$resultado=mysqli_query($conn,"insert into animal
(username, nomanimal, estatura, peso, color, raza,sexo,nacimiento)
values ('$username','$nomanimal',
'$estatura','$peso','$color','$raza','$sexo','$nacimiento')");
if (!$resultado) {
global $error;
$error= "No has podido hacer el registro en
la base de datos - por favor intentalo mas tarde.";
return false;
}else return true;
}
}
36. }
else {
global $error;
$error="No se ha podido conectar a la base datos";
return false;
}
}
function get_animal($username)
{
//extract from the database all the animals this user has stored
if ($conn = db_connect()) {
$sql="select
nomanimal,estatura,peso,color,raza,sexo,(YEAR(CURDATE())-
YEAR(nacimiento)) - (RIGHT(CURDATE(),5)<RIGHT(nacimiento,5)) as
edad from animal where username = '$username'";
/* $result = $conn->query( "select
nomanimal,estatura,peso,color,raza,sexo,(YEAR(CURDATE())-
YEAR(nacimiento)) - (RIGHT(CURDATE(),5)<RIGHT(nacimiento,5)) as
edad from animal where username = '$username'");*/
$result=mysqli_query($conn,$sql);
if (!$result)
return false;
}
return $result;
};
function get_enfermedad($sin1,$sin2="",$sin3="",$sin4=""){
if ($conn = db_connect()) {
$sql="SELECT e.nombre, count(d.cod_s) as coincide,e.codigo
from enfermedad as e, detalle as d
where e.codigo=d.cod_e
and d.cod_s in('$sin1','$sin2','$sin3','$sin4')
group by e.nombre
order by count(d.cod_s) desc
limit 3";
//$result = $conn->query($sql);
$result=mysqli_query($conn,$sql);
if(!$result)
return false;
return $result;
}
else return false;
}
function get_cod_sin($s){
if ($conn = db_connect()) {
$sql="select codigo_s from sintomas where nombre_s='$s'";
//$result = $conn->query($sql);
$result=mysqli_query($conn,$sql);
37. if (!$result)
return false;
return $result;
}
else
return false;
}
function prepararsintoma($value){
if(!empty($value)){
$value=strip_tags(trim($value));
$valor=addslashes($value);
return $valor;
}
else return false;
}
function codificarsintoma($x){
if($codigo = get_cod_sin($x)){
$array = mysqli_fetch_assoc($codigo);
if(count($array) > 0)
return $array['codigo_s'];
else
return false;
}
else
return false;
}
function get_meds($cod){
if ($conn = db_connect()) {
$sql = "select m.nom_med as nombre
from medicamento as m, tratamiento as t
where t.cod_enf='$cod' and
t.cod_med=m.cod_med";
//$result = $conn->query($sql);
$result=mysqli_query($conn,$sql);
if (!$result)
return false;
//$array = mysqli_fetch_all($result);
if(mysqli_num_rows($result) == 0)
return false;
return $result;
}
else return false;
}
?>
38. ani_regis_form:
session_start — Iniciar una nueva sesión o reanudar la existente
session_start() crea una sesión o reanuda la actual basada en un
identificador de sesión pasado mediante una petición GET o
POST, o pasado mediante una cookie.
Cuando session_start() es llamada o cuando se auto inicia una
sesión, PHP llamará a los gestores de almacenamiento de
sesiones open y read. Éstos serán un gestor de almacenamiento
proporcionado por omisión o por extensiones de PHP (como
SQLite o Memcached); o pueden ser un gestor personalizado
como está definido en session_set_save_handler(). La llamada de
retorno read recuperará cualquier información se de sesión
existente (almacenada en un formato serializado especial) y será
deserializada y usada para rellenar automáticamente la variable
superglobal $_SESSION cuando la llamada de retorno read
devuelva la información de sesión guardada a la gestión de
sesiones de PHP.
39. Para usar una sesión nominada llame a session_name() antes de
llamar a session_start().
<?
// include function files for this application
require_once("bovino_fns.php");
session_start();
// start output html
do_html_header("Registrar Animal");
check_valid_user();
display_add_ani_form();
display_user_menu();
do_html_footer();
?>
_____________________________________________________________________
ani_query_form:
start output: Esta función activará el almacenamiento en búfer de
salida. Mientras dicho almacenamiento esté activo, no se enviará
ninguna salida desde el script (aparte de cabeceras), en su lugar
la salida se almacenará en un búfer interno.
40. El contenido de este búfer interno se puede copiar a una variable
de tipo string usando ob_get_contents(). Para producir la salida
de lo almacenado en el búfer interno se ha de usar
ob_end_flush(). De forma alternativa, ob_end_clean() desechará
de manera silenciosa el contenido del búfer.
<?
// include function files for this application
require_once("bovino_fns.php");
session_start();
// start output html
do_html_header("Consultar animales");
check_valid_user();
if ($ani_array = get_animal($_SESSION["valid_user"])){
display_animal($ani_array);
}
display_user_menu();
do_html_footer();
?>