Ir para o conteúdo
s4muc4

[Resolvido] Não consigo criar tabla na DB, dá erro

Mensagens Recomendadas

s4muc4

é isso, obrigado

ja agora, tenho uma pequena duvida em sql

eu estou a trabalhar com o xampp e estou a criar uma tabela em sql mas ele nao me deixa, tenho quase a certeza de que o codigo está correto.

ele dá me este erro #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REFERENCES Utilizador(id_nome), FOREIGN KEY id_pc REFERENCES Computador(id_pc), ' at line 10

CREATE TABLE Ligacao
(
id_registo int(11) NOT NULL AUTO_INCREMENT,
id_nome int(11) NOT NULL,
id_pc int(11) NOT NULL,
id_sistoperativo int(11) NOT NULL,
id_office int(11),
id_acessorio int(11),
PRIMARY KEY (id_registo),
FOREIGN KEY id_nome REFERENCES Utilizador(id_nome),
FOREIGN KEY id_pc REFERENCES Computador(id_pc),
FOREIGN KEY id_sistoperativo REFERENCES SistemaOperativo(id_sistoperativo),
FOREIGN KEY id_office REFERENCES Office(id_office),
FOREIGN KEY id_acessorio REFERENCES Acessorios(id_acessorio)
)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se estivesse bem, funcionaria :D

esta é a declaração de uma constraint para foreign key

[CONSTRAINT [symbol]]
 FOREIGN KEY [index_name] (index_col_name,...)
   REFERENCES tbl_name (index_col_name,...)
     [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
     [ON DELETE reference_option]
     [ON UPDATE reference_option]

como podes ver, existe a possibilidade de dar um nome à constraint, e é isso que estás a fazer no teu SQL. ditar quais as colunas da constraint tem de ser dentro de parênteses

o que resulta em:

CREATE TABLE Ligacao
(
 id_registo INT(11) NOT NULL AUTO_INCREMENT,
 id_nome INT(11) NOT NULL,
 id_pc INT(11) NOT NULL,
 id_sistoperativo INT(11) NOT NULL,
 id_office INT(11),
 id_acessorio INT(11),
 PRIMARY KEY (id_registo),
 FOREIGN KEY (id_nome) REFERENCES Utilizador(id_nome),
 FOREIGN KEY (id_pc) REFERENCES Computador(id_pc),
 FOREIGN KEY (id_sistoperativo) REFERENCES SistemaOperativo(id_sistoperativo),
 FOREIGN KEY (id_office) REFERENCES Office(id_office),
 FOREIGN KEY (id_acessorio) REFERENCES Acessorios(id_acessorio)
)

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

Não pode ser O_O, como é que é possivel ter me esquecido disso xD

obrigado, ultima coisa (isto é só problema atráz de problema xD)

eu no index.php tenho um iframe a mostrar tabLG.php que contém uma query para mostrar os dados da tabela Ligacao (essa mesma) em uma tabela.

o problema é que no iframe ele mostra um erro e depois mostra a tabela cm deve ser. tipo isto

482303_430179407067390_1828733043_n.jpg

e depois quando tento fazer um registo ele da me este erro Cannot add or update a child row: a foreign key constraint fails (`JUSTBIT`.`Ligacao`, CONSTRAINT `Ligacao_ibfk_5` FOREIGN KEY (`id_acessorio`) REFERENCES `Acessorios` (`id_acessorio`))

:\

TabLG.php

// Tabela de Resultados
// SQL query
$strSQL = "SELECT * FROM Ligaçao";

// Execute the query (the recordset $rs contains the result)
$rs = mysql_query($strSQL);

// Loop the recordset $rs
// Each row will be made into an array ($row) using mysql_fetch_array
echo "<table border='1'> <tr><th>Utilizador</th><th>Computador</th><th>Sistema Operativo</th><th>Office Suite</th><th>Acessórios</tr>";
  /*Linha 25*/ while($row = mysql_fetch_array($rs)) {

   // Write the value of the column FirstName (which is now in the array $row)
  echo "<tr><td class='id'>" . $row['id_nome'] . "</td> <td>" . $row['id_pc'] . "</td> <td>" . $row['id_sistoperativo'] . "</td> <td>" . $row['id_office'] . "</td> <td>" . $row['id_acessorio'] . "</td></tr>";

}

insert.php

(...)

elseif ($_POST["id_nome"] != '' && $_POST["id_pc"] != '') {
$SistemaOperativo="INSERT INTO Ligacao(id_nome,id_pc,id_sistoperativo,id_office,id_acessorio) values('" . $_POST["id_nome"] . "','" . $_POST["id_pc"] . "','" . $_POST["id_sistoperativo"] . "','" . $_POST["id_office"] . "','" . $_POST["id_acessorio"] . "')";
$ok = mysql_query($SistemaOperativo) or die(mysql_error());
if ($ok){
echo "<p class='regelm'>O Computador foi atribuódo ao Utilizador com Sucesso!</p>";
} else {
	echo "<p class='regelma'>Ocorreu um erro no registo!</p>";
}
}

Editado por s4muc4

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

$strSQL = "SELECT * FROM Ligaçao"; // <---- olha como estás a escrever o nome da tabela (ç)

$SistemaOperativo="INSERT INTO Ligacao(id_nome,id_pc,id_sistoperativo,id_office,id_acessorio) values('" . $_POST["id_nome"] . "','" . $_POST["id_pc"] . "','" . $_POST["id_sistoperativo"] . "','" . $_POST["id_office"] . "','" . $_POST["id_acessorio"] . "')";

verifica se o valor de $_POST["id_acessorio"] realmente existe na base de dados.

caso o valor seja vazio, então força a nulo

if ($_POST['id_acessorio'] == null)    // nota que == null é verdadeiro para casos como 0, "", etc ...
 $_POST['id_acessorio'] = 'NULL';

desta forma, o SQL que será criado terá o valor de NULL e não um valor vazio ou 0 que invalidaria a constraint

-----

agora uma nota de boa programação em php+mysql :

começa a usar as funções mysqli_* e os prepared statements


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

continua a dar o mesmo erro

Cannot add or update a child row: a foreign key constraint fails (`JUSTBIT`.`Ligacao`, CONSTRAINT `Ligacao_ibfk_5` FOREIGN KEY (`id_acessorio`) REFERENCES `Acessorios` (`id_acessorio`))

era assim que tu dizias para eu fazer?

(...)
elseif ($_POST["id_nome"] != null && $_POST["id_pc"] != null) {

   if ($_POST['id_acessorio'] == null)  $_POST['id_acessorio'] = 'NULL';

   $SistemaOperativo="INSERT INTO Ligacao(id_nome,id_pc,id_sistoperativo,id_office,id_acessorio) values('" . $_POST["id_nome"] . "','" . $_POST["id_pc"] . "','" . $_POST["id_sistoperativo"] . "','" . $_POST["id_office"] . "','" . $_POST["id_acessorio"] . "')";
   $ok = mysql_query($SistemaOperativo) or die(mysql_error());
   if ($ok){
   echo "<p class='regelm'>O Computador foi atribuódo ao Utilizador com Sucesso!</p>";
   } else {
       echo "<p class='regelma'>Ocorreu um erro no registo!</p>";
   }
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

era assim que tu dizias para eu fazer?

mais ou menos, era um exemplo para veres o que era necessário fazer

o que deverias ter implementado seria:

 foreach ($_POST as $key => $value) {
   if ($value == null)
     $_POST[$key] = 'NULL';
   else
     $_POST[$key] = "'".$_POST[$key]."'";
 }

   $sql="INSERT INTO Ligacao (id_nome,
                              id_pc,
                              id_sistoperativo,
                              id_office,
                              id_acessorio)
                       values(".$_POST["id_nome"].",
                              ".$_POST["id_pc"].",
                              ".$_POST["id_sistoperativo"].",
                              ".$_POST["id_office"].",
                              ".$_POST["id_acessorio"].")";

se mesmo assim continuares a dar erro, verifica qual o SQL que estás a executar:

$ok = mysql_query($sql) or die(mysql_error() . " : " . $sql);

se o SQL apresentado parecer correcto, verifica se o valor que estás a inserir no campo 'id_acessorio' existe na tabela 'Acessorios'


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

mais ou menos, era um exemplo para veres o que era necessário fazer

o que deverias ter implementado seria:


foreach ($_POST as $key => $value) {

if ($value == null)

$_POST[$key] = 'NULL';

else

$_POST[$key] = "'".$_POST[$key]."'";

}

[code]

haha isso é muito á frente xD, não te importas de explicar? :P

EDIT: o campo id_acessorio existe

Eu experimentei o código e continua a nao dar :P

aparece assim

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1'',''2'',''1'',''1'','NULL')' at line 1 : INSERT INTO Ligacao(id_nome,id_pc,id_sistoperativo,id_office,id_acessorio) values(''1'',''2'',''1'',''1'','NULL')

Editado por s4muc4

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

alteraste a linha de criação do SQL ???

   $sql="INSERT INTO Ligacao (id_nome,
                             id_pc,
                             id_sistoperativo,
                             id_office,
                             id_acessorio)
                      values(".$_POST["id_nome"].",
                             ".$_POST["id_pc"].",
                             ".$_POST["id_sistoperativo"].",
                             ".$_POST["id_office"].",
                             ".$_POST["id_acessorio"].")";

eu acho que não ...

------

 // para cada elemento do array associativo $_POST
 // em que a chave é $key e o seu valor é $value
 foreach ($_POST as $key => $value) {
   // se o valor do elemento for equiparado a nulo
   if ($value == null)
     // o valor do array passa a ser a string 'NULL'
     $_POST[$key] = 'NULL';
   else
     // caso contrário, colocar os apóstrofos
     $_POST[$key] = "'".$_POST[$key]."'";
 }

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

a distraçao é a morte do artista

mais uma coisa, no tabLG.php eu mudei a query para que mostra se apenas o nome que me interessa e voltou a dar aquele erro

podes verificar me a query?

$strSQL = "

SELECT Ligacao.id_registo,
         Utilizador.nome,
         Computador.modelo,
         SistemaOperativo.sistoperativo,
         Office.office,
         Acessorios.acessorio
      FROM Ligacao AS LG,
         Utilizador AS Ut,
         Computador AS Pc,
         SistemaOperativo AS OS,
         Office AS O,
         Acessorios AS Ac
      WHERE Ut.id_nome=LG.id_nome AND
         Pc.id_pc=LG.id_pc AND
         OS.id_sistoperativo=LG.id_sistoperativo AND
         O.id_office=LG.id_office AND
         Ac.id_acessorio=LG.id_acessorio

";

Editado por brunoais
geshi alterado para ficar mais legível

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

à primeira vista, parece tudo bem, mas sem a mensagem de erro originada pelo mysql é impossível verificar o que será:

$rs = mysql_query($strSQL) or die(mysql_error()); // <--- verificar sempre se a execução foi realizada correctamente


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

experimenta usar os alias que criaste:

       $strSQL = "SELECT LG.id_registo,
                 Ut.nome,
                 Pc.modelo,
                 OS.sistoperativo,
                 O.office,
                 Ac.acessorio
          FROM Ligacao AS LG,
                 Utilizador AS Ut,
                 Computador AS Pc,
                 SistemaOperativo AS OS,
                 Office AS O,
                 Acessorios AS Ac
          WHERE Ut.id_nome=LG.id_nome AND
                 Pc.id_pc=LG.id_pc AND
                 OS.id_sistoperativo=LG.id_sistoperativo AND
                 O.id_office=LG.id_office AND
                 Ac.id_acessorio=LG.id_acessorio";


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se não aparece dados é porque não deverá existir registos que contemplem as relações efectuadas

usa o "left join"


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

eu nao conheco essa propriedade... andei a pesquisar e pelo que eu vi seria assim:

$strSQL = "SELECT Ligacao.id_registo,
						Utilizador.nome,
						Com.modelo,
						SistemaOperativo.sistoperativo,
						Office.office,
						Acessorios.acessorio
				FROM Ligacao, Utilizador, Computador, SistemaOperativo, Office, Acessorios
				LEFT JOIN Ligacao
				ON Utilizador.id_nome=Ligacao.id_nome AND
						Computador.id_pc=Ligacao.id_pc AND
						SistemaOperativo.id_sistoperativo=Ligacao.id_sistoperativo AND
						Office.id_office=Ligacao.id_office AND
						Acessorios.id_acessorio=Ligacao.id_acessorio";

mas ele assim dame este erro:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /opt/lampp/htdocs/Website/TabLG.php on line 36

ps: deixei de usar alias

Editado por s4muc4

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
SELECT LG.id_registo,
      Ut.nome,
      Pc.modelo,
      OS.sistoperativo,
      O.office,
      Ac.acessorio
 FROM Ligacao AS LG
          LEFT JOIN Utilizador AS Ut    ON Ut.id_nome = LG.id_nome
          LEFT JOIN Computador AS Pc    ON LG.id_pc = Pc.id_pc
          LEFT JOIN SistemaOperativo AS ON LG.id_sistoperativo = OS.id_sistoperativo,
          LEFT JOIN Office AS O         ON LG.id_office = O.id_office
          LEFT JOIN Acessorios AS Ac    ON LG.id_acessorio = Ac.id_acessorio


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

@HappyHippyHippo

Esse é o código para ele ver?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

ahh estou a perceber, mas bastavas ter feito um exemplo :P

EDIT: continua a nao dar :(

Editado por s4muc4

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

@HappyHippyHippo

Esse é o código para ele ver?

não percebi ?

ahh estou a perceber, mas bastavas ter feito um exemplo :P

é um exemplo ... feito à presa com copy paste do teu SQL


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
s4muc4

epah alguma coisa nao esta a bater certo, porque ate com a query que eu tinha no inicio nao da :P

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /opt/lampp/htdocs/Website/TabLG.php on line 36

$strSQL = "SELECT LG.id_registo,
				 Ut.nome,
				 Pc.modelo,
				 OS.sistoperativo,
				 O.office,
				  Ac.acessorio
		  FROM Ligacao AS LG
		  LEFT JOIN Utilizador AS Ut			ON Ut.id_nome = LG.id_nome
		  LEFT JOIN Computador AS Pc			ON LG.id_pc = Pc.id_pc
		  LEFT JOIN SistemaOperativo AS OS	ON LG.id_sistoperativo = OS.id_sistoperativo,
		  LEFT JOIN Office AS O					ON LG.id_office = O.id_office
		  LEFT JOIN Acessorios AS Ac			ON LG.id_acessorio = Ac.id_acessorio";

// Execute the query (the recordset $rs contains the result)
$rs = mysqli_query($con,$strSQL);

// Loop the recordset $rs
// Each row will be made into an array ($row) using mysqli_fetch_array
echo "<table border='1'> <tr><th>Registo</th><th>Utilizador</th><th>Computador</th><th>Sistema Operativo</th><th>Office Suite</th><th>Acessórios</tr>";
  /*linha 36*/ while($row = mysqli_fetch_array($rs)) {

   // Write the value of the column FirstName (which is now in the array $row)
  echo "<tr><td>" . $row['id_registo'] . "</td> <td>" . $row['id_nome'] . "</td> <td>" . $row['id_pc'] . "</td> <td>" . $row['id_sistoperativo'] . "</td> <td>" . $row['id_office'] . "</td> <td>" . $row['id_acessorio'] . "</td></tr>";

}

EDIT: ok, ja nao é preciso, ja descobri o problema mas o left join continua a nao mostrar resultados

Editado por s4muc4

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rumbafum

então e já correste essa query no mysql para verificar se dá efectivamente resultados?

Se calhar alguma dessas tabelas não tem ligação.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.