Ajuda em php + xml + sql Posted by kabonga - 2008/07/15 23:56 Boas, Estou aqui com um problema com um php. Tenho de gerar um formulário, e ter a validação com mensagens do tipo: "dados inseridos com sucesso" ou "faltam dados". O problema é que ele mostra a mensagem "faltam dados" na primeira vez que acedo ao formulário! Sabem como posso fazer com que essa msg não apareça? lancar.php header ('Content-type: text/xml'); echo '<?xml version="1.0" encoding="utf-8"'; echo '<?xml-stylesheet type="text/xsl" href="lancar.xsl"'; $server = "localhost"; $server_ip = "localhost"; $user = "root"; $pass = ""; $db = "bdescola"; $cod_professor = $_POST; $cod_aluno = $_POST; $cod_disciplina = $_POST; $nota = $_POST; $data = $_POST; <Lancar> if($_request){ if ($_REQUEST and $_REQUEST and $_REQUEST and $_REQUEST and $_REQUEST) { $connection = mysql_connect($server, $user, $pass) or die ("Unable to connect!"â«â»); mysql_select_db($db) or die ("Unable to select database!"â«â»); $sql1 = "INSERT INTO lancarnotas (cod_professor,cod_aluno,cod_disciplina,nota,data) VALUES ('$cod_professor','$cod_aluno','$cod_disciplina','$nota','$data')"; $resultado1 = mysql_query($sql1) or die (mysql_error()); echo '<msg>dados enviados com Sucesso!</msg>'; echo "<cod_professor></cod_professor>"; echo "<cod_disciplina></cod_disciplina>"; echo "<cod_aluno></cod_aluno>"; echo "<nota></nota>"; echo "<data></data>"; else { echo '<erro>campos por preencher!</erro>'; echo "<cod_professor>$cod_professor</cod_professor>"; echo "<cod_disciplina>$cod_disciplina</cod_disciplina>"; echo "<cod_aluno>$cod_aluno</cod_aluno>"; echo "<nota>$nota</nota>"; echo "<data>$data</data>";
else{ echo "<cod_professor></cod_professor>"; echo "<cod_disciplina></cod_disciplina>"; echo "<cod_aluno></cod_aluno>"; echo "<nota></nota>"; echo "<data></data>"; </Lancar> lancar.xsl <?xml version="1.0" encoding="utf-8" <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:include href="base.xsl"/> <xsl:template match="lancar"> <form action="lancar.php" method="post"> <xsl:apply-templates select="cod_professor"/> <xsl:apply-templates select="cod_disciplina"/> <xsl:apply-templates select="cod_aluno"/> <xsl:apply-templates select="nota"/> <xsl:apply-templates select="data"/> <input type="submit" name="botao" value="enviar"/> <xsl:apply-templates select="msg"/> <xsl:apply-templates select="erro"/> </form> <xsl:template match="cod_professor"> Codigo do Professor: <input type="text" name="cod_professor" value="{text()"/> <xsl:template match="cod_disciplina"> Codigo da Disciplina: <input type="text" name="cod_disciplina" value="{text()"/> <xsl:template match="cod_aluno"> Codigo do Aluno: <input type="text" name="cod_aluno" value="{text()"/> <xsl:template match="nota"> Nota: <input type="text" name="nota" value="{text()"/> <xsl:template match="data"> Data: <input type="text" name="data" value="{text()"/> </xsl:stylesheet> lancar.xml <?xml version="1.0" encoding="utf-8" <?xml-stylesheet type="text/xsl" href="lancar.xsl"
<Lancar> <cod_professor></cod_professor> <cod_disciplina></cod_disciplina> <cod_aluno></cod_aluno> <nota></nota> <data></data> <erro></erro> <msg></msg> </Lancar> Posted by kabonga - 2008/07/16 15:57 Já consegui resolver esse problema. Mas agora apareceu outro e não sei como fazer! Eu queria que, por exemplo, inserimos os dados todos no form e enviamos para a base de dados. Mas enganei-me na atribuição da nota: coloquei o 4 mas queria dar 3. Tornava a inserir os dados do aluno, mas colocava a nota correcta, e o php alterava a nota que já existia na base de dados. Como posso fazer isso? Posted by diogo.antunes - 2008/07/16 18:13 Boas... O ideal seria criares uma funcionalidade de update. ou seja, o professor teria acesso a uma listagem de notas lançadas. Depois um botao de acção para editar onde passas o id da tabela para ir buscar os dados. Depois fazes simplesmente um update. Se pretenderes a solução que propuseste o melhor será onde tens $sql1 = "INSERT INTO lancarnotas (cod_professor,cod_aluno,cod_disciplina,nota,data) VALUES ('$cod_professor','$cod_aluno','$cod_disciplina','$nota','$data')"; $resultado1 = mysql_query($sql1) or die (mysql_error()); fazes $sql_check = "select count(*) as count from lancarnotas where cod_professor='$cod_professor' and cod_aluno='$cod_aluno' and cod_disciplina='$cod_disciplina' and data='$data'"; $resultado_check = mysql_query($sql_check) or die (mysql_error()); $res=mysql_fetch_object($resultado_check); if($res->count > 0){ $sql1 = "update lancarnotas set nota='$nota' where cod_professor='$cod_professor' and cod_aluno='$cod_aluno' and cod_disciplina='$cod_disciplina' and data='$data'"; else { $sql1 = "INSERT INTO lancarnotas (cod_professor,cod_aluno,cod_disciplina,nota,data) VALUES ('$cod_professor','$cod_aluno','$cod_disciplina','$nota','$data')"; $resultado1 = mysql_query($sql1) or die (mysql_error());
Espero que não tenha muitos erros que eu fiz este código aqui no post directamente. Mas a funcionalidade está lá e espero que ajude. Abraço Posted by kabonga - 2008/07/16 19:10 Obrigadão. Com umas correcções já está a funcionar! :) Ele está a actualizar a nota, mas eu quero que actualize também a data. Mas não é obrigatório que se actualizem os dois campos! Se coloco data diferente, ele cria um novo dado na base de dados. Posted by kabonga - 2008/07/16 23:49 diogo.antunes wrote: Boas... O ideal seria criares uma funcionalidade de update. ou seja, o professor teria acesso a uma listagem de notas lançadas. Depois um botao de acção para editar onde passas o id da tabela para ir buscar os dados. Depois fazes simplesmente um update. Esta ideia que referiste parece-me ser interessante. Ou seja, fazia um output onde ele me dava uma tabela com as notas de cada turma. Em frente de cada aluno teria um botão para actualizar a nota. Consegues-me fazer esse código? Dificilmente consigo fazer um código de base, mas alterar e fazer umas correcções já vou conseguindo. Desde já, o meu MUITO OBRIGADO! :) Posted by diogo.antunes - 2008/07/17 09:51 Em relação à primeira questão, basta fazeres uma pequena alteração. No $sql_check Em vez de: $sql_check = "select count(*) as count from lancarnotas where cod_professor='$cod_professor' and cod_aluno='$cod_aluno' and cod_disciplina='$cod_disciplina' and data='$data'";
colocas $sql_check = "select count(*) as count from lancarnotas where cod_professor='$cod_professor' and cod_aluno='$cod_aluno' and cod_disciplina='$cod_disciplina'"; assim ele so vai ver se ja existe aquele registo para a chave tripla: cod_professor, cod_disciplina e cod_aluno Isto pode-te trazer um problema. Eu fiz a validação da data porque se quiseres introduzir um registo para o mesmo aluno, professor e disciplina mas num semestre diferente (imaginando o caso de ele ter chumbado) ele vai te actualizar o registo anterior. Em relação à segunda questão... Infelizmente não tenho muita disponilidade e não te consigo dizer com certeza qd poderia fazer esse código. Podes avançar com a solução 1 e qd eu tiver um tempinho faria isso, mas claro depende da tua pressa. Abraço Posted by kabonga - 2008/07/17 15:20 Realmente tens razão em relação à data. Vamos manter apenas a actualizar a nota. Se não consegues a segunda parte não há problema, o trabalho é para apresentar amanhã! :blink: Mas já foste uma GRANDE ajuda!!! OBRIGADO Posted by kabonga - 2008/07/18 22:44 Só uma última coisa... No output queria fazer um formulário ou botões, onde se escolhia entre ver as notas por turma, por disciplina ou por professor. Eu tenho isto a listar todas as notas da base de dados. Se me conseguirem arranjar isso... era excelente! :) extrair.php header('content-type:text/xml'); echo '<?xml version="1.0" encoding="utf-8"'; echo '<?xml-stylesheet type="text/xsl" href="extrair.xsl"' <extrair> mysql_connect("localhost","root",""â«â»); $sql = "SELECT * FROM lancarnotas"; $resultado = mysql_db_query("bdescola",$sql); if ($resultado)
{ while ($registo=mysql_fetch_array($resultado)) { $cod_professor = $registo; $cod_aluno = $registo; $cod_disciplina = $registo; $nota = $registo; $data = $registo; <dados> <cod_professor> echo $cod_professor;</cod_professor> <cod_disciplina> echo $cod_disciplina;</cod_disciplina> <cod_aluno> echo $cod_aluno;</cod_aluno> <nota> echo $nota;</nota> <data> echo $data;</data> </dados> mysql_close(); </extrair> extrair.xml <?xml version="1.0" encoding="utf-8" <?xml-stylesheet href="extrair.xsl" type="text/xsl" <extrair> <dados> <cod_professor></cod_professor> <cod_disciplina></cod_disciplina> <cod_aluno></cod_aluno> <nota></nota> <data></data> </dados> </extrair> extrair.xsl <?xml version="1.0" encoding="utf-8" <xsl:â«â»stylesheet version="1.0" xmlns:â«â»xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <head> <title>lancamento de Notas</title> </head> <body> <table border="2"> <tr> <td>codigo do professor</td> <td>codigo da disciplina</td> <td>codigo do aluno</td> <td>nota</td> <td>data</td> </tr> <xsl:for-each select="extrair/dados"> <tr> <td><xsl:value-of select="cod_professor"/></td>
<td><xsl:value-of select="cod_disciplina"/></td> <td><xsl:value-of select="cod_aluno"/></td> <td><xsl:value-of select="nota"/></td> <td><xsl:value-of select="data"/></td> </tr> </xsl:for-each> </table> <form action="quadro_entrada.html" method="post"> <input type="submit" name="botao" value="inicio"/> </form> </body> </html> </xsl:â«â»stylesheet> Posted by diogo.antunes - 2008/07/21 15:56 Este fds não tive tempo nenhum... aqui vai uma solução possivel quando chamas o extrair.php podes fazê-lo da seguinte forma uma pagina com um form onde tens <form name="form1" method="post" action="extrair.php"> <!-- Select para escolha do tipo de filtro --> <select name="filter"> <option value="0">professor</option> <option value="0">disciplina</option> </select> <!-- input onde colocas o codigo da disciplina ou professor --> <input type="text" name="codigo" /> </form> Depois no ficheiro extrair.php onde tens $sql = "SELECT * FROM lancarnotas"; fazes if(isset($_post)){ $filter="cod_". $_POST. "='". $_POST. "'"; else{ $filter = "1"; $sql = "SELECT * FROM lancarnotas where $filter";