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

SofiaR

UPDATE de uma tabela

9 mensagens neste tópico

Olá a todos.

Tenho de inserir dados na base  dados através de um  formulário, já está feito. Mas também tenho de poder actualizar os dados inseridos através de um formulário, mas estou com bastantes dificuldades e duvidas.O meu objectivo é ter um formulário com uma select box onde podemos seleccionar a planta a editar.Aqui vai o código k fiz

<select name="plant.php">
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'sgbd080916';
mysql_select_db($dbname);

$sql = "SELECT name_sci, name_local FROM plant ".
"ORDER BY name_local";


$rs = mysql_query($sql);

while($row = mysql_fetch_array($rs))
{
  echo "<option value=\"".$row['name_sci']."\">".$row['name_local']."\n  ";
}
?>

Depois de selecionar a planta pretendida quero k apareça um formulário com os dados dessa planta para actualizar. Aconteçe que não sei fazer a ligação entre dois formulários e os dados não me aparecem no ecrã.

Aqui vai o código que tenho do update

<html>
<head>
</head>
<body> 
<?php	
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'sgbd080916';
mysql_select_db($dbname);

$name_sci = $_POST['name_sci'];	
$name_local = $_POST['name_local'];	
$name_en = $_POST['name_en'];	
$description = $_POST['description'];	
$geo_distr = $_POST['geo_distr'];	
$id = $_GET['id'];	
mysql_query("SELECT * FROM plant ORDER BY 'id'");  	if($_GET['act']=="gravar")	{  	
mysql_query("UPDATE plant SET name_sci='$name_sci', name_local= '$name_local' ,name_en='$name_en' , description='$description',geo_distr='$geo_distr' WHERE id=$id");	echo "<center>Dados actualizados</center>"; 	} 	else		{ 	} ?> 
<form id="insere" name="insere" method="GET" action="?act=gravar&id=<?php echo $id; ?>" >
<table width="100%" height="206" border="0" cellpadding="5" cellspacing="0">
<tr> 
<td><span class="style2">Scientific Name:</span></td>
<td><input name="name_sci" class="style2"="text"/></td>
</tr>
<tr> 
<td><span class="style2">Local Name:</span></td>
<td><input name="name_local" type="text" class="style2"/></td>
</tr>
<tr> 
<td><span class="style2">Enghish Name:</span></td>
<td><input name="name_en" type="text" class="style2"/></td>
</tr>
<tr> 
<td><span class="style2">Description:</span></td>
<td><input name="description" type="text" class="style2"/></td>
</tr>
<tr> 
<td><span class="style2">Geographic Distribution:</span></td>
<td><input name="geo_distr" type="text" class="style2"/></td>
</tr> 
<tr> 
<td colspan="2">
<div align="right">
  <input name="Submit" type="submit" class="style2" value="Submit" />
</div></td>
</tr>
</table>
</form>
   
</div>
</body></html>

Agradecia que alguém me ajudasse, não consigo chegar lá sozinha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na primeiro parte do teu código (o primeiro script?) tens um select com o nome "plant.php".

Em princípio o valor escolhido nesse select vai para a segunda parte do teu código (outro script?) que corresponde ao POST dum formulário.

Na parte de código que mostraste não tens nenhum $_POST['plant.php'] (se calhar tem que ser $_POST['plant_php'] porque o PHP converte caracteres inválidos em "_", mas não tenho a certeza se "." é um caracter inválido ou não). Tens um $_GET['id'] (através duma variável) no UPDATE do sql.

As coisas têm que bater certo para funcionar.

Ou é $_POST['plant.php'] ou é $_GET['id'] -- as duas coisas é que não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não está a resultar. O que realmente pretendo é um formulário que apresente uma lista de plantas existentes numa select box(isso está feito no primeiro código). Após submissão do formulário, uma nova página irá ser apresentada, contendo um formulário idêntico ao de inserção de uma planta, já preenchido com os dados da planta seleccionada no passo anterior. Esta é a parte que não estou a conseguir fazer.

Caso seja necessário aqui vai o formulário para inserir planta

<!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>

</head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<!-- TemplateBeginEditable name="doctitle" -->

<title>Untitled Document</title>

<!-- TemplateEndEditable -->

<!-- TemplateBeginEditable name="head" -->

<!-- TemplateEndEditable -->

<style type="text/css">

<!--

body  {

font: 100% Verdana, Arial, Helvetica, sans-serif;

background: #666666;

margin: 0; /* it's good practice to zero the margin and padding of the body element to account for differing browser defaults */

padding: 0;

text-align: center; /* this centers the container in IE 5* browsers. The text is then set to the left aligned default in the #container selector */

color: #000000;

}

/* Tips for Elastic layouts

1. Since the elastic layouts overall sizing is based on the user's default fonts size, they are more unpredictable. Used correctly, they are also more accessible for those that need larger fonts size since the line length remains proportionate.

2. Sizing of divs in this layout are based on the 100% font size in the body element. If you decrease the text size overall by using a font-size: 80% on the body element or the #container, remember that the entire layout will downsize proportionately. You may want to increase the widths of the various divs to compensate for this.

3. If font sizing is changed in differing amounts on each div instead of on the overall design (ie: #sidebar1 is given a 70% font size and #mainContent is given an 85% font size), this will proportionately change each of the divs overall size. You may want to adjust based on your final font sizing.

*/

.twoColElsLtHdr #container {

width: 46em;

margin: 0 auto; /* the auto margins (in conjunction with a width) center the page */

border: 1px solid #000000;

text-align: left; /* this overrides the text-align: center on the body element. */

background-color: #FFFFFF;

background-image: url(plantasMA%20copy.jpg);

}

.twoColElsLtHdr #header {

background: #DDDDDD;  /* this padding matches the left alignment of the elements in the divs that appear beneath it. If an image is used in the #header instead of text, you may want to remove the padding. */

height: 136px;

width: 716px;

padding-top: 0;

padding-right: 10px;

padding-bottom: 0;

padding-left: 10px;

}

.twoColElsLtHdr #header h1 {

margin: 0; /* zeroing the margin of the last element in the #header div will avoid margin collapse - an unexplainable space between divs. If the div has a border around it, this is not necessary as that also avoids the margin collapse */

padding: 10px 0; /* using padding instead of margin will allow you to keep the element away from the edges of the div */

}

/* Tips for sidebar1:

1. Be aware that if you set a font-size value on this div, the overall width of the div will be adjusted accordingly.

2. Since we are working in ems, it's best not to use padding on the sidebar itself. It will be added to the width for standards compliant browsers creating an unknown actual width.

3. Space between the side of the div and the elements within it can be created by placing a left and right margin on those elements as seen in the ".twoColElsLtHdr #sidebar1 p" rule.

*/

.twoColElsLtHdr #sidebar1 {

float: left;

width: 12em; /* top and bottom padding create visual space within this div */

background-color: #87BA37;

padding-top: 10px;

padding-right: 0;

padding-bottom: 10px;

padding-left: 0;

}

.twoColElsLtHdr #sidebar1 h3, .twoColElsLtHdr #sidebar1 p {

margin-left: 10px; /* the left and right margin should be given to every element that will be placed in the side columns */

margin-right: 10px;

}

/* Tips for mainContent:

1. If you give this #mainContent div a font-size value different than the #sidebar1 div, the margins of the #mainContent div will be based on its font-size and the width of the #sidebar1 div will be based on its font-size. You may wish to adjust the values of these divs.

2. The space between the mainContent and sidebar1 is created with the left margin on the mainContent div.  No matter how much content the sidebar1 div contains, the column space will remain. You can remove this left margin if you want the #mainContent div's text to fill the #sidebar1 space when the content in #sidebar1 ends.

3. To avoid float drop, you may need to test to determine the approximate maximum image/element size since this layout is based on the user's font sizing combined with the values you set. However, if the user has their browser font size set lower than normal, less space will be available in the #mainContent div than you may see on testing.

4. In the Internet Explorer Conditional Comment below, the zoom property is used to give the mainContent "hasLayout." This avoids several IE-specific bugs that may occur.

*/

.twoColElsLtHdr #mainContent {

margin: 0 1.5em 0 13em; /* the right margin can be given in ems or pixels. It creates the space down the right side of the page. */

}

.twoColElsLtHdr #footer {

padding: 0 10px; /* this padding matches the left alignment of the elements in the divs that appear above it. */

background:#DDDDDD;

}

.twoColElsLtHdr #footer p {

margin: 0; /* zeroing the margins of the first element in the footer will avoid the possibility of margin collapse - a space between divs */

padding: 10px 0; /* padding on this element will create space, just as the the margin would have, without the margin collapse issue */

}

/* Miscellaneous classes for reuse */

.fltrt { /* this class can be used to float an element right in your page. The floated element must precede the element it should be next to on the page. */

float: right;

margin-left: 8px;

}

.fltlft { /* this class can be used to float an element left in your page */

float: left;

margin-right: 8px;

}

.clearfloat { /* this class should be placed on a div or break element and should be the final element before the close of a container that should fully contain a float */

clear:both;

    height:0;

    font-size: 1px;

    line-height: 0px;

}

.style1 {

color: #003300;

font-weight: bold;

font-size: x-large;

}

#a {

font-family: "Myriad Pro";

font-size: x-large;

font-style: normal;

color: #003300;

text-decoration: none;

}

.style2 {

color: #003300;

font-weight: bold;

font-size: large;

}

.style3 {font-weight: bold}

.style4 {font-size: small}

-->

</style>

<!--[if IE]>

<style type="text/css">

/* place css fixes for all versions of IE in this conditional comment */

.twoColElsLtHdr #sidebar1 { padding-top: 30px; }

.twoColElsLtHdr #mainContent { zoom: 1; padding-top: 15px; }

/* the above proprietary zoom property gives IE the hasLayout it needs to avoid several bugs */

</style>

<![endif]--></head>

<body class="twoColElsLtHdr">

<div id="container">

  <div id="header">

    <h1><img src="HEADER copy.jpg" width="714" height="123" /></h1>

  <!-- end #header --></div>

  <div id="sidebar1">

    <h3> </h3>

    <p class="style4"><a href="plant.html" class="style1" id="a">Plants</a></p>

    <p class="style4"> </p>

    <p class="style4"><a href="remedy.html" class="style1" id="a">Remedys</a></p>

    <p class="style4"> </p>

    <p class="style4"><a href="symptom.html" class="style1" id="a">Symptoms</a></p>

    <p class="style4"> </p>

    <p class="style4"><a href="disease.html" class="style1" id="a">Diseases</a>

      <!-- end #sidebar1 -->

    </p>

    <p class="style1"> </p>

  </div>

  <div id="mainContent">

    <h1 align="center"> </h1>

    <p align="center"> </p>

    <script type="text/javascript">

function validateForm()

{

d = document.plantForm;

      //validate Scientific name

        if (d.name_sci.value == ""){

        alert("The field " + d.name_sci.name + " must be completed!");

                d.name_sci.focus();

                return false;

        }

        //validate local_name

        if (d.name_local.value == ""){

                alert("The field " + d.name_local.name + " must be completed!");

                d.name_local.focus();

                return false;

        }

        //validate English name

        if (d.name_en.value == ""){

                alert("The field " + d.name_en.name + " must be completed!");

                d.name_en.focus();

                return false;

        }

        //validate description

        if (d.description.value == ""){

                alert("The field " + d.description.name + " must be completed!");

                d.description.focus();

                return false;

        }

//validate geodistribution

        if (d.geo_distr.value == ""){

                alert("The field " + d.geo_distr.name + " must be completed!");

                d.geo_distr.focus();

                return false;

        }

//validate information before insert into the database

confirmation=confirm("Is the information correct?\n\nScientific name: "+d.name_sci.value+"\nLocal name: "+d.name_local.value+"\nEnglish Name: "+d.name_en.value+"\nDescription: "+d.description.value+"\nGeographic Distribution: "+d.geo_distr.value);

if(confirmation==false)

{

d.name_sci.focus();

return false;

}

else

return true;

}

</script>

<body>

<form name="plantForm" action="plant.php" method="POST" onSubmit="return validateForm()">

<table width="100%" height="206" border="0" cellpadding="5" cellspacing="0">

<tr>

<td><span class="style2">Scientific Name:</span></td>

<td><input name="name_sci" class="style2"="text"/></td>

</tr>

<tr>

<td><span class="style2">Local Name:</span></td>

<td><input name="name_local" type="text" class="style2"/></td>

</tr>

<tr>

<td><span class="style2">Enghish Name:</span></td>

<td><input name="name_en" type="text" class="style2"/></td>

</tr>

<tr>

<td><span class="style2">Description:</span></td>

<td><input name="description" type="text" class="style2"/></td>

</tr>

<tr>

<td><span class="style2">Geographic Distribution:</span></td>

<td><input name="geo_distr" type="text" class="style2"/></td>

</tr>

<tr>

<td colspan="2">

<div align="right">

  <input name="Submit" type="submit" class="style2" value="Submit" />

</div></td>

</tr>

</table>

</form>

    <p> </p>

    <!-- end #mainContent --></div>

<br class="clearfloat" />

<!-- end #container -->

</div>

</body>

</html>

E o ficheiro php correspondente

<?php

$dbhost = 'localhost';

$dbuser = 'root';

$dbpass = '';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'sgbd080916';

mysql_select_db($dbname);

?>

<!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>SGBD080916</title>

<style type="text/css">

<!--

#a {

font-family: "Myriad Pro";

font-size: x-large;

font-style: normal;

color: #003300;

text-decoration: none;

}

.style1 {

font-family: "Myriad Pro"

}

#img {

}

-->

</style>

</head>

<body>

<?php

//Busca as variaveis utilizando o array associative $_POST

$name_sci = $_POST['name_sci'];

$name_local=$_POST['name_local'];

$name_en=$_POST['name_en'];

$description=$_POST['description'];

$geo_distr=$_POST['geo_distr'];

//Efectua o query

mysql_query("INSERT INTO plant(name_sci, name_local,name_en,description,geo_distr) VALUES ('$name_sci', '$name_local', '$name_en', '$description', '$geo_distr');");

if(!mysql_query) {

die ("Erro ao inserir na base de dados!");

}

mysql_close($conn);?>

<h3 class="style1">The information was introduced successfully!</h3>

<h3 align="center"><a href="index.html" id="a">Home Page </a></h3>

</body>

</html>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta por o código seguinte na página que recebe o formulário.

<?php
echo '<pre>', print_r($_POST, true), '</pre>';
?>

Substitui $_POST por $_GET se o formulário não tiver method="post"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depois da inserção, no ficheiro php correspondente, ele mostra isto

<h3 class="style1">The information was introduced successfully!</h3>
<h3 align="center"><a href="index.html" id="a">Home Page </a></h3>[/quote]

... ou não?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então está a funcionar :P

Essa é a única informação que o ficheiro PHP manda para o browser.

Só tens que acrescentar (ou substituir) a informação da linha adicionada. Por exemplo:

<h3 class="style1">The information was introduced successfully!</h3>
<h3 align="center"><a href="index.html" id="a">Home Page </a></h3>


<?php
$sql = "select * from plant where name_sci='$name_sci'";
$res = mysql_query($sql);
while ($row = mysql_fetch_row($res)) {
  echo '[', implode(']; [', $row), ']';
}
mysql_free_result($res);
?>


</body>
</html>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vamos lá ver se percebo. Já tou meia baralhada :P

Esta informação

<h3 class="style1">The information was introduced successfully!</h3>

<h3 align="center"><a href="index.html" id="a">Home Page </a></h3>

Aparece quando insiro qualquer coisa na base de dados. Esta parte da inserção está a funcionar correctamente. Nesta parte não há dúvida. O Código que me deu em que parte coloco?

Relembro que o formulario que contém a select box(com todas as plantas já inseridas até ao momento na base de dados) é este

select name="plant.php">

<?php$dbhost = 'localhost';$dbuser = 'root';$dbpass = '';$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql'); $dbname = 'sgbd080916';mysql_select_db($dbname); $sql = "SELECT name_sci, name_local FROM plant "."ORDER BY name_local";  $rs = mysql_query($sql); while($row = mysql_fetch_array($rs)){  echo "<option value=\"".$row['name_sci']."\">".$row['name_local']."\n  ";}?>

A partir daqui não sei como fazer quando selecciono uma planta que me dê um formulário igual ao de inserção mas já com os dados preenchidos, para que possa alterar. Não sei se me estou a explicar bem :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Metes no ficheiro php que mete a informação na base de dados.

Logo a seguir a

<h3 class="style1">The information was introduced successfully!</h3>
<h3 align="center"><a href="index.html" id="a">Home Page </a></h3>

e imediatemente antes de

</body>
</html>

É claro que tens que lhe dar outra formatação para ficar de acordo com o resto do site. A forma que eu proponho não é nada agradável :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