Jump to content

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


s4muc4

Recommended Posts

é 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)
)
Link to comment
Share on other sites

se estivesse bem, funcionaria 😄

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

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

$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
Link to comment
Share on other sites

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

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

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? 😛

EDIT: o campo id_acessorio existe

Eu experimentei o código e continua a nao dar 😛

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

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

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

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

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

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

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.