• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

deathseeker25

Como chamar funções como action de um formulário ?

17 mensagens neste tópico

Pessoal estou com um problema aqui há já algumas horas. O que queria era fazer com que fosse chamada uma função num formulário html. Tenho a certeza que isto não é difícil de fazer, no entanto estou já há algum tempo a tentar alternativas e ainda não os resultados pretendidos.

Aqui está o código completo da página que estou a escrever, um pouco desorganizado é verdade, mas também foi todo escrito em duas horas e meia pelo que ainda não tratei de o organizar devidamente.

error_reporting(E_ALL);

session_start();
ob_start();
if (isset($_SESSION["username"]) AND isset($_SESSION["password"]) AND isset($_SESSION["permissao"])) 
{
$username = $_SESSION["username"];
$password = $_SESSION["password"];
$permissao = $_SESSION["permissao"];
$_SESSION["data"] = date("d/m/Y g:i a");

$script_base = dirname($_SERVER['SCRIPT_FILENAME']);  //define o root do ficheiro...
define('SCRIPT_BASE', $script_base);

include SCRIPT_BASE.'/includes/mysql.class.php';
include 'config.php';		//inclui o ficheiro de instalacao
$error = array(); //array que vai armazenar os erros...

function select_action($action)
{
if(!isset($action))
{
	$action = $_GET["select_action"];
}
else
{
	switch($action)
	{
		case "addNoticia":
			$html ='<div id="form">
				<form method = "POST" id = "addNoticia" value = "addNoticia" action="'modNoticia();'">
				<div id = "Titulo">
				<input type = "text" name = "titulo" id = "titulo">Titulo:
				</div>
				<div id = "texto">Texto:
				<input type = "text" name = "texto" id = "texto">
				</div>
				</form>
				</div>';
			$titulo = $_POST["titulo"];
			$texto = $_POST["texto"];
			$utilizador = $_SESSION["username"];
			$data = date("Y-m-d");
			break;

		case "modNoticia":
			$html = '<div id = "lista">';
			$BD = new MySQL_DB_CONNECTOR;
			$conn = $BD->connect($host, $username, $password);

			mysql_select_db($database) or die("Erro ao ligar à base de dados: ".mysql_error());
			$query = 'SELECT * FROM noticias';
			$resultado = mysql_query($query);

			$num_resultados = mysql_num_rows($resultado);

			if($num_resultados != 0)
			{
				$html .= '<form method="post" id="escolhe_registo" name="escolhe_registo" action="'modNoticia();'">';
				for($i=1; $i<=$num_resultados; $i++)
				{		
					$arr = mysql_fetch_array($resultado, MYSQL_ASSOC);
					$html .= '<div id="noticia'.$arr["id"]'">
							<a href="../noticias.php?modNoticia&id='.$arr["id"].'>'.$arr["id"].'</a>
							</div>
							<div id="titulo'.$arr["id"]'">'.$arr["titulo"].'</div>
							<div id="data'.$arr["data"]'">'.$arr["data"].'</div>';
					$html .= '<br />';
				}
				$html .= '</form></div>';

			}
			else
			{
				$error[] = "A consulta não devolveu resultados ...";
				return $error;
			}
			break;

			case "delNoticia":
			$html = '<div id = "lista">';
			$BD = new MySQL_DB_CONNECTOR;
			$conn = $BD->connect($host, $username, $password);

			mysql_select_db($database) or die("Erro ao ligar à base de dados: ".mysql_error());
			$query = 'SELECT * FROM noticias';
			$resultado = mysql_query($query);

			$num_resultados = mysql_num_rows($resultado);

			if($num_resultados != 0)
			{
				$html .= '<form method="post" id="escolhe_registo" name="escolhe_registo" action="'delNoticia();'">';
				for($i=1; $i<=$num_resultados; $i++)
				{		
					$arr = mysql_fetch_array($resultado, MYSQL_ASSOC);
					$html .= '<div id="noticia'.$arr["id"]'">
							<a href="../noticias.php?modNoticia&id='.$arr["id"].'>'.$arr["id"].'</a>
							</div>
							<div id="titulo'.$arr["id"]'">'.$arr["titulo"].'</div>
							<div id="data'.$arr["data"]'">'.$arr["data"].'</div>';
					$html .= '<br />';
				}
				$html .= '</form></div>';

			}
			else
			{
				$error[] = "A consulta não devolveu resultados ...";
				return $error;
			}
			break;
		}
	}
}

function addNoticia()
{
$query = "INSERT INTO noticias(titulo, texto, utilizador, data) VALUES('$titulo', '$texto', '$utilizador', '$data')";

$ligacao = new MySQL_DB_CONNECTOR;
$conn = $ligacao->connect($host,$username,$password);

if(!mysql_select_db($database,$conn))
{
	$error[] = "Impossivel ligar à base de dados. Erro: ".mysql_error();
	return $error;
}
else
{
	mysql_query($query,$conn);
	print "Registo inserido com sucesso !<br />";
}
}
function modNoticia()
{
$id = $_POST["id"];
$query = "SELECT * FROM noticias WHERE id='$id'";

$ligacao = new MySQL_DB_CONNECTOR;
$conn = $ligacao->connect($host, $username, $password);

if(!mysql_select_db($database, $conn))
{
	$error = "Impossivel ligar à base de dados. Erro: ".mysql_error();
	return $error;
}
else
{
	$resultado = mysql_query($query, $conn);
	$arr = mysql_fetch_array($resultado, MYSQL_ASSOC);

	printf("<div id=\"form\">
				<div id = \"Titulo\">
				<form name=\"alterar\" id = \"alterar\" method = \"POST\" action = \""altera();"\">
				<input type = \"text\" name = \"titulo\" id = \"titulo\" value=\"".$arr["titulo"]."\">Titulo:
				</div>
				<div id = \"texto\">Texto:
				<input type = \"text\" name = \"texto\" id = \"texto\" value =\"".$arr["texto"]."\">
				</div>
				<div id=\"Update\">
				<input type = \"submit\" name = \"alterar\" value = \"Alterar\">
				</div>
				</form>
				</div>");
}
}

function altera()
{
$titulo = $_POST["titulo"];
$texto = $_POST["texto"];
$utilizador = $_SESSION["username"];
$data = date("Y-m-d");

$query = "UPDATE noticias SET titulo = '$titulo', texto = '$texto', utilizador = '$utilizador', data = '$data' WHERE id='".$arr["id"]."'";

if(!mysql_select_db($database, $conn))
{
	$error = "Impossivel ligar à base de dados. Erro: ".mysql_error();
	return $error;
}
else 
{
	$resultado = mysql_query($query, $conn);

	if($resultado)
	{
		print "Registo alterado com sucesso !<br />";
	}
	else
	{
		$error[] = "Não foi possível alterar o registo. Contacte o administrador ou verifique as configurações. <br />";
		return $error;
	}
}
}

function delNoticia()
{
$id = $_POST["id"];
$query = "DELETE * FROM noticias WHERE id='$id'";

$ligacao = new MySQL_DB_CONNECTOR;
$conn = $ligacao->connect($host, $username, $password);

if(!mysql_select_db($database, $conn))
{
	$error[] = "Impossivel ligar à base de dados. Erro: ".mysql_error();
	return $error;
}
else
{
	mysql_query($query);
	print "Registo apagado com sucesso !<br />";
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Identa o código que vês logo que o 1º if() não está fechado (ou assim me parece) :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, o 1º if não está fechado visto que não coloquei o código todo (são 350 linhas), no entanto cá fica, desta vez sem estar com o syntax highlighter:

<?php
error_reporting(E_ALL);

session_start();
ob_start();
if (isset($_SESSION["username"]) AND isset($_SESSION["password"]) AND isset($_SESSION["permissao"])) 
{
$username = $_SESSION["username"];
$password = $_SESSION["password"];
$permissao = $_SESSION["permissao"];
$_SESSION["data"] = date("d/m/Y g:i a");

$script_base = dirname($_SERVER['SCRIPT_FILENAME']);  //define o root do ficheiro...
define('SCRIPT_BASE', $script_base);

include SCRIPT_BASE.'/includes/mysql.class.php';
include 'config.php';		//inclui o ficheiro de instalacao
$error = array(); //array que vai armazenar os erros...

function select_action($action)
{
	if(!isset($action))
	{
		$action = $_GET["select_action"];
	}
	else
	{
		switch($action)
		{
			case "addNoticia":
				$html ='<div id="form">
				<form method = "POST" id = "addNoticia" value = "addNoticia" action="'modNoticia();'">
				<div id = "Titulo">
				<input type = "text" name = "titulo" id = "titulo">Titulo:
				</div>
				<div id = "texto">Texto:
				<input type = "text" name = "texto" id = "texto">
				</div>
				</form>
				</div>';
				$titulo = $_POST["titulo"];
				$texto = $_POST["texto"];
				$utilizador = $_SESSION["username"];
				$data = date("Y-m-d");
				break;

			case "modNoticia":
				$html = '<div id = "lista">';
				$BD = new MySQL_DB_CONNECTOR;
				$conn = $BD->connect($host, $username, $password);

				mysql_select_db($database) or die("Erro ao ligar à base de dados: ".mysql_error());
				$query = 'SELECT * FROM noticias';
				$resultado = mysql_query($query);

				$num_resultados = mysql_num_rows($resultado);

				if($num_resultados != 0)
				{
					$html .= '<form method="post" id="escolhe_registo" name="escolhe_registo" action="'modNoticia();'">';
					for($i=1; $i<=$num_resultados; $i++)
					{		
						$arr = mysql_fetch_array($resultado, MYSQL_ASSOC);
						$html .= '<div id="noticia'.$arr["id"]'">
							<a href="../noticias.php?modNoticia&id='.$arr["id"].'>'.$arr["id"].'</a>
							</div>
							<div id="titulo'.$arr["id"]'">'.$arr["titulo"].'</div>
							<div id="data'.$arr["data"]'">'.$arr["data"].'</div>';
						$html .= '<br />';
					}
					$html .= '</form></div>';

				}
				else
				{
					$error[] = "A consulta não devolveu resultados ...";
					return $error;
				}
				break;

				case "delNoticia":
				$html = '<div id = "lista">';
				$BD = new MySQL_DB_CONNECTOR;
				$conn = $BD->connect($host, $username, $password);

				mysql_select_db($database) or die("Erro ao ligar à base de dados: ".mysql_error());
				$query = 'SELECT * FROM noticias';
				$resultado = mysql_query($query);

				$num_resultados = mysql_num_rows($resultado);

				if($num_resultados != 0)
				{
					$html .= '<form method="post" id="escolhe_registo" name="escolhe_registo" action="'delNoticia();'">';
					for($i=1; $i<=$num_resultados; $i++)
					{		
						$arr = mysql_fetch_array($resultado, MYSQL_ASSOC);
						$html .= '<div id="noticia'.$arr["id"]'">
							<a href="../noticias.php?modNoticia&id='.$arr["id"].'>'.$arr["id"].'</a>
							</div>
							<div id="titulo'.$arr["id"]'">'.$arr["titulo"].'</div>
							<div id="data'.$arr["data"]'">'.$arr["data"].'</div>';
						$html .= '<br />';
					}
					$html .= '</form></div>';

				}
				else
				{
					$error[] = "A consulta não devolveu resultados ...";
					return $error;
				}
				break;
			}
		}
}

function addNoticia()
{
	$query = "INSERT INTO noticias(titulo, texto, utilizador, data) VALUES('$titulo', '$texto', '$utilizador', '$data')";

	$ligacao = new MySQL_DB_CONNECTOR;
	$conn = $ligacao->connect($host,$username,$password);

	if(!mysql_select_db($database,$conn))
	{
		$error[] = "Impossivel ligar à base de dados. Erro: ".mysql_error();
		return $error;
	}
	else
	{
		mysql_query($query,$conn);
		print "Registo inserido com sucesso !<br />";
	}
}
function modNoticia()
{
	$id = $_POST["id"];
	$query = "SELECT * FROM noticias WHERE id='$id'";

	$ligacao = new MySQL_DB_CONNECTOR;
	$conn = $ligacao->connect($host, $username, $password);

	if(!mysql_select_db($database, $conn))
	{
		$error = "Impossivel ligar à base de dados. Erro: ".mysql_error();
		return $error;
	}
	else
	{
		$resultado = mysql_query($query, $conn);
		$arr = mysql_fetch_array($resultado, MYSQL_ASSOC);

		printf("<div id=\"form\">
				<div id = \"Titulo\">
				<form name=\"alterar\" id = \"alterar\" method = \"POST\" action = \""altera();"\">
				<input type = \"text\" name = \"titulo\" id = \"titulo\" value=\"".$arr["titulo"]."\">Titulo:
				</div>
				<div id = \"texto\">Texto:
				<input type = \"text\" name = \"texto\" id = \"texto\" value =\"".$arr["texto"]."\">
				</div>
				<div id=\"Update\">
				<input type = \"submit\" name = \"alterar\" value = \"Alterar\">
				</div>
				</form>
				</div>");
	}
}

function altera()
{
	$titulo = $_POST["titulo"];
	$texto = $_POST["texto"];
	$utilizador = $_SESSION["username"];
	$data = date("Y-m-d");

	$query = "UPDATE noticias SET titulo = '$titulo', texto = '$texto', utilizador = '$utilizador', data = '$data' WHERE id='".$arr["id"]."'";

	if(!mysql_select_db($database, $conn))
	{
		$error = "Impossivel ligar à base de dados. Erro: ".mysql_error();
		return $error;
	}
	else 
	{
		$resultado = mysql_query($query, $conn);

		if($resultado)
		{
		print "Registo alterado com sucesso !<br />";
		}
		else
		{
			$error[] = "Não foi possível alterar o registo. Contacte o administrador ou verifique as configurações. <br />";
			return $error;
		}
	}
}

function delNoticia()
{
	$id = $_POST["id"];
	$query = "DELETE * FROM noticias WHERE id='$id'";

	$ligacao = new MySQL_DB_CONNECTOR;
	$conn = $ligacao->connect($host, $username, $password);

	if(!mysql_select_db($database, $conn))
	{
		$error[] = "Impossivel ligar à base de dados. Erro: ".mysql_error();
		return $error;
	}
	else
	{
		mysql_query($query);
		print "Registo apagado com sucesso !<br />";
	}
}

?>		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
<!--
body {
margin: 0;
background-color : 
}
#header {
background-color: #CCCCCC;
height: 125px;
}
#left {
position: absolute;
left: 10px;
top: 145px;
width: 180px;
background-color: #CCCCCC;
}
#center {
margin: 20px 205px 0 205px;
background-color: #CCCCCC;
}
#right {
position: absolute;
right: 10px;
top: 145px;
width: 180px;
background-color: #CCCCCC;
}
div.nav-box {
border: 1px solid #000000;
padding: 5px;
background-color: #FFFFFF;
}
div.nav-header {
background-color: #CCCCCC;
height: 22px;
padding: 3px 0 0 5px;
}
div.nav-body {
margin-top: 5px;
background-color: #F2F2F2;
text-align: center;
}
div.nav-body-login {
margin-top: 5px;
background-color: #F2F2F2;
text-align: left;
}
div.center-body {
padding: 10px;
background-color: #F2F2F2;
}
div.nav-menu {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-style: normal;
font-weight: bolder;
color: #333333;
font-size: 14px;
text-align: center;
}
div.admin-title {
font-size: 16px;
color: #333333;
background-color: #CCCCCC;
letter-spacing: normal;
word-spacing: normal;
white-space: normal;
font-size: 14px;
font-weight: bold;
}

-->
</style>
</head>
<body>


<?php
if($permissao == 1)
{
?>		
<div id="header"></div>
<div id="left">
<div class="nav-box">
<div class="nav-header">Admin Panel</div>
<div class="nav-menu"><a href="../admin/noticias.php">Notícias</a></div>
<div class="nav-menu"><a href="../admin/users.php">Utilizadores</a></div>
<div class="nav-menu"><a href="../admin/torneios.php">Torneios</a></div>
<div class="nav-menu"><a href="../admin/concursos.php">Concursos</a></div>
<div class="nav-menu"><a href="../admin/sugestoes.php">Sugestões</a></div>
</div>
</div>

<div class="admin-title" id="center">Admin Panel
<div class="center-body">
<form action="<?php select_action(); ?>" id="select_action" name="select_action" method="GET">
<a href="?addNoticia"><img src="/images/adicionar_noticia.png" width="75" height="70" value="addNoticia"></a>
<a href="?modNoticia"><img src="/images/modificar_noticia.png" width="75" height="70" value="modNoticia"></a>
<a href="?delNoticia"><img src="/images/apagar_noticia.png" width="75" height="70" value="delNoticia"></a>
</form>
</div>
</div>

<div id="right">
<div class="nav-box">
<div class="nav-header">Sessão</div>
<div class="nav-body-login">
Bem-vindo, <?php $username ?>! <br />
</div>
</div>
</div>
</div>

<?php
}

if($permissao == 2)
{
	?>
	<script language="javascript">
		window.location = "../index.php";
		</script>
	<?php
	}
else
	{
	$permissao == 2;
	}
}
}
else //se nao estiverem definidas as sessoes...
{
	?>
	<script language="javascript">
	window.location = "../index.php";
	</script>
	<?php
}
?>		
  
</body>
</html>

O output continua a ser tudo em branco. Não consigo perceber o que está mal aí... :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que estas a tentar fazer não da para fazer. :confused:

dar ate dá mas não assim. tens de fazer uma pequena mudança.

$html ='<div id="form">
              <form method = "POST" id = "action" value = "addNoticia" action="'.$_SERVER['PHP_SELF'].'">

depois é no file onde fores executares a função fazes!

$_POST['action']();

tenho aqui um exemplo para veres se percebeste.

$_POST['action'] = 'nomedafuncao'; // o valor da variavel é o nome da função
function nomedafuncao() {
echo "função executada";
}
$_POST['action']();

O que o código faz é executar a função.

espero ter ajudado  :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

RayBacK, tu estás a tentar fazer uma função lambda style? :o

hmm lambda?

tive a procura e não a percebo o que queres dizer com o isso..  :down:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não estou a fazer uma função lambda style, valor de $_POST['action'] é um nome de uma função e o código $_POST['action'](); é para executar o função que tem como nome o valor da variável!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é super inseguro... ;)

Pois é isso que também ia dizer..

Para isso podemos usar este código:

if (function_exists($_POST['action']) {
    $_POST['action']();
} else {
   echo "invalid action";
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para isso podemos usar este código:

if (function_exists($_POST['action']) {
    $_POST['action']();
} else {
   echo "invalid action";
}

Tenta:

$_POST['action'] = "exit";

Como queres fazer, é preferivel analizar a array da função get_defined_functions() ;)

Ex:

$arr=get_defined_functions();
if (in_array($_POST['action'], $arr['user']) {
    $_POST['action']();
} else {
   echo "invalid action";
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é super inseguro... ;)

Pois é isso que também ia dizer..

Para isso podemos usar este código:

if (function_exists($_POST['action']) {
    $_POST['action']();
} else {
   echo "invalid action";
}

Tenta:

$_POST['action'] = "exit";

:)

Eu e o RayBacK falamos deste assunto: tens de usar o get_defined_functions() para sacar um array com as funções internas e definidas pelo utilizador.

Depois verificas se a função obtida pelo POST se encontra na array. :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu e o RayBacK falamos deste assunto: tens de usar o get_defined_functions() para sacar um array com as funções internas e definidas pelo utilizador.

Depois verificas se a função obtida pelo POST se encontra na array. :biggrin:

Sim, eu sei, eu já tava de volta disso, só depois de editar o meu post é q vi o teu ;)
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só é preciso usar o seguinte código para que isto se torne seguro

<?php
if (function_exists($_POST['action'])) {
        call_user_func( $_POST['action'] );
}
?>

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só é preciso usar o seguinte código para que isto se torne seguro

<?php
if (function_exists($_POST['action'])) {
        call_user_func( $_POST['action'] );
}
?>

;)

Sim, isso resolve em parte o problema, mas um exit ainda passa pelo if embora seja morto no call_user_func.

O ideal era ter uma array com uma lista de funções q podes executar e depois if(in_array($_POST['action'], $allowed)) $_POST['action'](); :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora