Algo errado no php

BelzebuVlad

Power Member
Pessoal estou com um problema em PHP (sou iniciado) que é o seguinte:

tenho no ficheiro index.htm o seguinte:


Código:
<body>
<form action="inserindo.php" method="post" name="Metafora" id="Metafora">
<table width="450" border="0" cellspacing="0" cellpadding="3">
<tr>
<td width="111"><div align="right">Banda:</div></td>
<td width="339"><input name="nomebanda" type="text" id="nomebanda" size="30"></td>
</tr>
<tr>
<td valign="top"><div align="right">Ano:</div></td>
<td>
<textarea name="anobanda" cols="4" rows="1" id="anobanda"></textarea></td>
</tr>
<tr>
<td height="29" colspan="2" valign="top"><div align="center">
<input type="submit" name="submit" value="Inserir no banco de dados">
</div>
</td>
</tr>
</table>
</form>
</body>


num ficheiro conectdb.php tenho o seguinte:

Código:
<?php
$hostname = 'localhost';
$username = 'root';
$pass = '';
$bd = 'metafora';
$db = mysql_connect($hostname, $username, $pass);
mysql_select_db($bd, $db);
?>


e num ficheiro inserindo.php:

Código:
<?php
require("conectdb.php");
 
$sqlinsert = "INSERT INTO metafora (codbanda, nomebanda, anobanda)
values ('', '$nomebanda' , '$anobanda')";
 
mysql_query($sqlinsert) or die ("Não possivel inserir");
 
echo "A banda $nomebanda nascida em $anobanda deu entrada na base de dados com sucesso";
 
?>


O resultado que me está a dar é o "Não foi possivel inserir", gostava de saber porquê!
A base de dados chama-se metafora e tem 3 campos:

codbanda - inteiro - auto increment
nomebanda - text
anobanda - varchar

Se me ajudassem agradecia...
 
não detectei falhas no código...poderá ser das tuas definições do teu php.ini, insere este código no inserindo.php


PHP:
$nomebanda=$_POST['nomebanda'];
$anobanda=$_POST['anobanda'];
 
Um campo que é AUTO INCREMENT não se coloca no insert, ou seja retiras o codbanda e o '' .

Tem de ficar assim

$sqlinsert = "INSERT INTO metafora ( nomebanda, anobanda);

values ('$nomebanda' , '$anobanda')";

E nunca se usa erros definidos por ti através do die...

Fazes antes die(mysql_error()) ;

Abraço
 
tenta assim:


PHP:
<?php
require("conectdb.php");
 
$nomebanda=$_POST['nomebanda'];
$anobanda=$_POST['anobanda'];  
 
$sqlinsert = "INSERT INTO metafora
values ('', '$nomebanda' , '$anobanda')";
 
$query=mysql_query($sqlinsert);
$num_reg=mysql_num_rows($query);
 
if($num_reg==0 ){
echo"registo não inserido";
 
}else{
 
echo"registo inserido";
 
}
 
?>
 
Última edição:
isso não vai dar...

Estás a passar para um auto increment um inteiro logo nunca pode estar dentro de aspas!

Faz como te disse.

Lol e não se usa o num_rows para ver se foi inserido :s

Usa-se

$doQuery = "INSERT BLABLBA";

if($doQuery)
echo " inserido com Sucesso";
 
Última edição:
Como ja foi dito, auto increments nao devem aparecer na instruçao de insert do mysql. E tambem ainda nao percebi porque usam divs dentro de tabelas... mas enfim.

Outra coisa, de certeza que tens o nome da bd/campos correctos? Por vezes pequenos typos escapam originando erros desse genero :s
 
isso não vai dar...



Lol e não se usa o num_rows para ver se foi inserido :s
quote]

tens razão é a mysql_affected_rows()

Tb não, pelo menos eu não o faço..

Eu uso o mysql_affected_rows para visualizar por exemplo quantos registos foram apagados.

Como podes ver pelo manual :

mysql_affected_rows — Get number of affected rows in previous MySQL operation
Description

int mysql_affected_rows ( [resource $link_identifier] )
Get the number of affected rows by the last INSERT, UPDATE, REPLACE or DELETE query associated with link_identifier.




Ou seja não é bem o pretendido..



Se fizeres assim como disse em cima :



$doQuery = "DELETE * FROM tz";
$doQuery ? "Registo Efectuado com Sucesso" : "Falhou o Registo" ;



Já vai dar :)
 
Descrição

int mysql_affected_rows ( [resource link_identifier] )


Obtém o número de linhas atingidas pela consulta INSERT, UPDATE, REPLACE ou DELETE mais recente associada ao link_identifier.


essa função dá para o Delete,Insert entre outras


PHP:
<?php
require("conectdb.php");
 
$nomebanda=$_POST['nomebanda'];
$anobanda=$_POST['anobanda'];  
 
$sqlinsert = "INSERT INTO metafora
values ('', '$nomebanda' , '$anobanda')";
 
$query=mysql_query($sqlinsert);
$num_reg=mysql_affected_rows();
 
if($num_reg==1 ){
echo"registo inserido";
 
}else{
 
echo"registo não inserido";
 
}
 
 
?>


Funciona:)
 
Última edição:
O problema é que se tu tens mais que um insert a fazer e nao sabes ao certo quantos são já não podes fazer uma comparação numérica porque não sabes qual o número, e se fizeres por exemplo >1 se forem 3 e so 2 tiverem sucesso ele vai dar true e não foi concluida :P

eu prefiro a forma como disse

Um abraço
 
Pessoal estou com um problema em PHP (sou iniciado) que é o seguinte:

tenho no ficheiro index.htm o seguinte:


Código:
<body>
<form action="inserindo.php" method="post" name="Metafora" id="Metafora">
<table width="450" border="0" cellspacing="0" cellpadding="3">
<tr>
<td width="111"><div align="right">Banda:</div></td>
<td width="339"><input name="nomebanda" type="text" id="nomebanda" size="30"></td>
</tr>
<tr>
<td valign="top"><div align="right">Ano:</div></td>
<td>
<textarea name="anobanda" cols="4" rows="1" id="anobanda"></textarea></td>
</tr>
<tr>
<td height="29" colspan="2" valign="top"><div align="center">
<input type="submit" name="submit" value="Inserir no banco de dados">
</div>
</td>
</tr>
</table>
</form>
</body>


num ficheiro conectdb.php tenho o seguinte:

Código:
<?php
$hostname = 'localhost';
$username = 'root';
$pass = '';
$bd = 'metafora';
$db = mysql_connect($hostname, $username, $pass);
mysql_select_db($bd, $db);
?>


e num ficheiro inserindo.php:

Código:
<?php
require("conectdb.php");
 
$sqlinsert = "INSERT INTO metafora (codbanda, nomebanda, anobanda)
values ('', '$nomebanda' , '$anobanda')";
 
mysql_query($sqlinsert) or die ("Não possivel inserir");
 
echo "A banda $nomebanda nascida em $anobanda deu entrada na base de dados com sucesso";
 
?>


O resultado que me está a dar é o "Não foi possivel inserir", gostava de saber porquê!
A base de dados chama-se metafora e tem 3 campos:

codbanda - inteiro - auto increment
nomebanda - text
anobanda - varchar

Se me ajudassem agradecia...

Código:
### Ligação MySQL ao servidor ###
            mysql_connect( $hostname, $username, $pass) or die("erro na ligação ao My");
            mysql_select_db($bd) or die("erro na ligação a DB");
            
            ### Campo ID na BD ###(adiciona um campo com nome ID typo intiger com caracter unico a tua db )
            $query = mysql_query("SELECT ID FROM metafora");
            $id = mysql_numrows($query);
            $id++;
            
            ### Datas e horas ###(facultativo mas eu axo importante data e ip do cliente)
            $get = getdate();
            $hora = $get[hours];
            $minutos = $get[minutes];
            $horas = $hora.":".$minutos;
            $data = date("d")."/".date("m")."/".date("y")." - ".$horas;
            $ip = $_SERVER['REMOTE_ADDR'];
        
            ### Inserir os campos na BD ###
            mysql_query("INSERT INTO metafora VALUES ('$id', '$ip', '$data', '$nomebanda', '$anobanda')");
            echo mysql_error()."\n\n";## se tiver erro...##

penso que não me esqueci de nada... ve la se isso funciona
esqueci a parte do $_POST $_GET mas penso que tu sabes fazer isso :P
 
Última edição:
Código:
### Ligação MySQL ao servidor ###
            mysql_connect( $hostname, $username, $pass) or die("erro na ligação ao My");
            mysql_select_db($bd) or die("erro na ligação a DB");
            
            ### Campo ID na BD ###(adiciona um campo com nome ID typo intiger com caracter unico a tua db )
            $query = mysql_query("SELECT ID FROM metafora");
            $id = mysql_numrows($query);
            $id++;
            
            ### Datas e horas ###(facultativo mas eu axo importante data e ip do cliente)
            $get = getdate();
            $hora = $get[hours];
            $minutos = $get[minutes];
            $horas = $hora.":".$minutos;
            $data = date("d")."/".date("m")."/".date("y")." - ".$horas;
            $ip = $_SERVER['REMOTE_ADDR'];
        
            ### Inserir os campos na BD ###
            mysql_query("INSERT INTO metafora VALUES ('$id', '$ip', '$data', '$nomebanda', '$anobanda')");
            echo mysql_error()."\n\n";## se tiver erro...##
penso que não me esqueci de nada... ve la se isso funciona
esqueci a parte do $_POST $_GET mas penso que tu sabes fazer isso :P


Desculpa a expressão, mas é uma estupidez estares a fazer um query á base de dados para saber quantas rows existem para colocar o próximo id do auto increment..

É estúpido porque perdes tempo de execução, atrasas o desenvolvimento e ainda por cima não se faz isso.

O AUTO_INCREMENT é utilizado automaticamente, nem o precisas de referir no insert


Não estou a criticar, estou a expor o meu ponto de vista :)

Um abraço
 
Um campo que é AUTO INCREMENT não se coloca no insert, ou seja retiras o codbanda e o '' .

Tem de ficar assim

$sqlinsert = "INSERT INTO metafora ( nomebanda, anobanda);

values ('$nomebanda' , '$anobanda')";

E nunca se usa erros definidos por ti através do die...

Fazes antes die(mysql_error()) ;

Abraço

Funcionou, obrigadao, muito obrigado mesmo. [[]]

Já agora, se alguém curte Metal (música) e estiver disposto a ajudar-me num site, curtia...
 
Última edição:
Desculpa a expressão, mas é uma estupidez estares a fazer um query á base de dados para saber quantas rows existem para colocar o próximo id do auto increment..

É estúpido porque perdes tempo de execução, atrasas o desenvolvimento e ainda por cima não se faz isso.

O AUTO_INCREMENT é utilizado automaticamente, nem o precisas de referir no insert


Não estou a criticar, estou a expor o meu ponto de vista :)

Um abraço

o teu ponto de vista é bom e ainda bem que alguem percebe alguma coisa de php :P.
e como tambem deves ter reparado isto ai foi um simples copy paste, de funções que cá tenho.
e digo mais, como não sabes a que se destina este codigo nem a quem(tirando este caso especifico) até estás desculpado :) porque tirando isso estas 3 linhas de "codigo estupido" já me deram muitas alegrias onde muitos tiveram desgostos... :) mas no fundo no fundo gostei do teu olho :P

edit: como sei que vais puxar a braza a tua sardinha... imagina todos os casos possiveis com uniques, substituição, update,etc.. etc..
 
Última edição:
o teu ponto de vista é bom e ainda bem que alguem percebe alguma coisa de php :P.
e como tambem deves ter reparado isto ai foi um simples copy paste, de funções que cá tenho.
e digo mais, como não sabes a que se destina este codigo nem a quem(tirando este caso especifico) até estás desculpado :) porque tirando isso estas 3 linhas de "codigo estupido" já me deram muitas alegrias onde muitos tiveram desgostos... :) mas no fundo no fundo gostei do teu olho :P

edit: como sei que vais puxar a braza a tua sardinha... imagina todos os casos possiveis com uniques, substituição, update,etc.. etc..

Nãooo :P

Não vou puxar nadda até porque uma das coisas que mais gosto na programação é discutir, porque no fundo nunca estou certo, existem sempre coisas possiveis para "destroçar" o meu olho com outras situações..

Estou para aprender, O que são uniques ? (nunca utilizei)

Um abraço :)
 
uniques? Bem..., imagina uma tabela com uma ÚNICA chave primária, os valores deste campo nunca se repetem, são únicos. Agora imagina que tens 2 chaves primárias..., o que não se pode repetir é o PAR, podes ter por exemplo:

A | B
-----
X | Y
X | X
Y | Y
Y | X


São 4 linhas possiveis numa tabela cuja chave primária é o par A,B. Agora imagina que tens um C do tipo unique que não é chave primária.

A | B | C
---------
X | X | a
X | Y | b
Y | X | a
Y | Y | c

A linha assinalada a vermelho não é válida nesta tabela, apesar de a restrição da chave primária estar coerente, o campo C é unique, ou seja, não podem haver repetições nesse campo.

Podes associar unique também com chaves primárias, por exemplo, A ser primária e unique e B apenas primária, neste caso tinhas apenas estes casos possiveis:

A | B
-----
X | X
Y | X

O B de facto está repetido, mas visto que a chave da tabela é o par A,B isto não fere a integridade da tabela, e as linhas de A são únicas.

Espero não ter sido confuso ;)

Btw, cuidado com o português..., é muito manhoso :205:

existem sempre coisas possiveis para "destroçar" o meu olho com outras situações..
Isto foi mesmo gay :205: (joke :p)

abraços, HecKel
 
Back
Topo