Jump to content
s4muc4

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

Recommended Posts

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

Share this post


Link to post
Share on other 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)
)

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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>";
}
}

Edited by s4muc4

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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>";
   }
}

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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')

Edited by s4muc4

Share this post


Link to post
Share on other 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]."'";
 }

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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

";

Edited by brunoais
geshi alterado para ficar mais legível

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by s4muc4

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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%.

Share this post


Link to post
Share on other sites
s4muc4

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

EDIT: continua a nao dar :(

Edited by s4muc4

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by s4muc4

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.