Avatar billede Slettet bruger
08. juli 2014 - 18:14 Der er 12 kommentarer og
1 løsning

MySql query driller

Jeg skal kalde en tekst og et billede ud fra databasen, men kan ikke få det til at virke. Er der nogen der kan hjælpe mig med at kigge på koden, og se hvad jeg gør forkert?
Som koden er nu, vil den slet ikke vise noget.

[code]
$result = mysqli_query ($con,"SELECT
field_revision_body.body_value,
field_revision_body.body_id,
field_data_field_sekundbilleder.entity_id,
file_managed.fid, file_managed.filename, 
field_data_field_sekundbilleder.field_sekundbilleder_fid

FROM field_revision_body
WHERE field_revision_body.entity_id = ".$_GET['var']."

INNER JOIN field_data_field_sekundbilleder
ON field_data_field_sekundbilleder.entired_id = field_revision_body.entity_id

INNER JOIN file_managed
ON file_managed.fid = field_data_field_sekundbilleder.field_sekundbilleder_fid");
($row = mysqli_fetch_array($result));

  echo "<div class='span10'>";
  echo "<p class='scroll-pane' style='font-weight:normal !important'>" .$row['body_value']. "</p>";
  echo "<br />";
  echo "</div>";
  echo "<div class='span3'>";
 
  echo "<img style='margin:50px 0px 0px 30px; width:200px' src='http://test.kongeaaen.cox.pil.dk/sites/default/files/styles/venstre_billede/public/" .$row['filename']. "'>";
 
  echo "<br />";
  echo "</div>";

mysqli_close($con);
?>
[/code]
Avatar billede erikjacobsen Ekspert
08. juli 2014 - 19:31 #1
Hvis det er en sql-fejl, kan du få hjælp med

$result = mysqli_query ($con,"SELECT  ...bla..bla.bla...") or die(mysqli_error($con));

Og iøvrigt, når du bruger mysqli er det en åben invitation til sql-injection ikke at bruge parameters til at indsætte værdier i din sql-streng.
Avatar billede Slettet bruger
08. juli 2014 - 19:36 #2
Tak for svar. Men jeg er ret ny indenfor mySql, så ved ikke helt hvad du snakker om :-(
09. juli 2014 - 00:18 #3
Det du viser er php kode, hvor du først har et kald til en mysqli database ($result = mysqli_query ......), og derefter udskriver du resultatet af dette kald, din echo kode. 

Du får ikke noget skrevet ud, siger du.  Problemet kan enten ligge i database kaldet, således at det ikke leverer et resultat der kan skrives ud, eller databasekaldet kan være i orden, men echo koden fejler, så den ikke skriver resultatet ud. 

Undskyld, at jeg nu skærer det ud i pap, men lad os sige, at du sender din søn i byen for at købe ind, og når han kommer hjem hælder du indholdet af indkøbsposen ud på køkkenbordet.  Men du får ingen varer ud på køkkenbordet.  Det kan enten skyldes, at sønnen kom hjem med en indkøbspose uden varer, eller at varerne har sat sig fast inde i indkøbsposen.

Du kan så, som erikjacobsen siger, undersøge, om problemet ligger i databasekaldet, så du får et tomt resultat (en tom indkøbspose) ved i din kode at tilføje 'or die(mysqli_error($con)) .  Hvis fejlen ligger i database kaldet får du så en fejlmelding. Så skal du på jagt efter fejlen i database kaldet.  Får du ingen fejlmelding skal du på jagt efter fejlen i echo koden

Men måske spottede jeg et problem.  Du siger, blandt andet 'SELECT .... field_data_field_sekundbilleder.entity_id ....... INNER JOIN field_data_field_sekundbilleder ON field_data_field_sekundbilleder.entired_id ....

Har du i tabellen field_data_field_sekundbilleder både et felt med navnet entity_id og et felt med navnet entired_id eller  har du skrevet det forkert en af gangene?

Men hvor har du koden fra?  Den synes forvirrende og unødvendig kompliceret.  Et forslag er at bruge aliasser, 'øgenavne' til tabellerne.  Du bruger tre tabeller field_revision_body, field_data_field_sekundbilleder, og file_managed.  Hvis du nu gav field_revision_body øgenavnet b og field_data_field_sekundbilleder øgenavnet s og file_managed øgenavnet m, så kunne du forenkle koden således:

SELECT b.body_value, b.body_id, s.entity_id, m.fid, m.filename, s,field_sekundbilleder_fld
FROM field_revision_body b
...
INNER JOIN field_data_field_sekundbilleder s ON s.entired_id = b.enti.....
....
INNER JOIN file_managed m ON m.fid = s.field_sekundbilleder....

Det gør koden kortere og, synes jeg, nemmere at overse.

Så er strukturen af dit databasekald dette:
SELECT....
FROM....
WHERE....
INNER JOIN.....

En sådan struktur tror jeg ikke er gyldig.  I det mindste er jeg vandt til en struktur således:

SELECT....
FROM....
INNER JOIN....
WHERE....

Et yderligere problem er, at du viser koden forvandsket.  Det skal ikke være, for eksempel $con,"SELECT men $con, "SELECT.  Det er ikke echo "<div men echo "<div  o.s.v.  Og det er ikke hele koden der er synlig i spørgsmålet.

Jeg foreslår, at du kikker på det igen.  Først se, om
'ON field_data_field_sekundbilleder.entired_id'
skulle have været
'ON field_data_field_sekundbilleder.entity_id'

Så prøv igen.  Kik på database kaldet, brug aliasser og flyt WHERE ned under den sidste INNER JOIN.  Og prøv at indsætte 'or die...' som #1 foreslår.  Hvis der kommer en fejlmelding, så vis os den.  Hvis der stadig er problemer, så vis os hele koden.  Så kan vi kikke igen.
Avatar billede Slettet bruger
09. juli 2014 - 14:06 #4
Tak for et super dejligt svar. Det er til at forstå, og rigtig rart du skærer det ud i pap.

Jeg har denne kode på en side, som hentes ind i en Joomla side som en iFrame. Det skulle der jo ikke være noget problem i, og siden kan da også køre uden Joomla.

field_revision_body = b
field_data_field_sekundbilleder = s
file_managed = m,

Nu har jeg prøvet at slette det hele, og starte forfra. Så ser koden sådan her ud, og teksten vises som det skal. Men problemet er, at jeg også skal have indsat billeder, og det ligger i 2 forskellige tabeller inde i databasen (s + m)

b.entity_id = s.entity_id

men for at udskrive, skal jeg bruge img.jpg der står i 'filename'  i tabellen m.

s.fid = m.fid

Det er lidt for rodet for mig, men databasen har jeg ikke selv oprettet, så den skal jeg ikke ændre i.



SOM KODEN SER UD LIGE NU og viser teksten som den skal.

<?php
mysql_connect("host","bruger","kodeord") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());

$data = mysql_query("SELECT body_value FROM b WHERE entity_id =".$_GET['var']." ")
or die(mysql_error());

while($info = mysql_fetch_array( $data ))
{
?>
<!--- Hvis "filename" ikke er tomt vises billedet --->
<?php
if (!empty($body_value)) {
Print "<div class='span10' style='float:left; background-color:#CF0'>".$info['body_value'] . "</div> ";
Print "<div class='span3' style='float:left; background-color:#96C'><img src='../". $info['filename'] ."</div> ";
} else {
?>
<!--- ellers vises teksten i 100% bredde --->
<?php   
Print "<div  style='float:left; width:100%;'>".$info['body_value'] . "</div> ";
} }
?>
09. juli 2014 - 17:36 #5
Du fortæller, tror jeg, at du starter med en entity_id der sidder i variabelen $_GET['var'].  For den entity_id skal du i b tabellen hente body_value, og det gør du med den kode du viser.

Du skal også bruge den m.filename, der svarer til denne entity_id.  Hvis jeg har forstået det rigtigt, så skal du igang med en kode i denne henretning:

SELECT b.body_value, m.filename
FROM b
JOIN s ON b.entity_id = s.entity_id
JOIN m ON s.fid = m.fid
WHERE  b.entity_id =".$_GET['var']."

Så bruger du en variabel $body_value.  Tilsyneladende forventer du at værdien af filename sidder i $body_value, men jeg kan ikke se, hvor $body_value kommer fra eller hvordan filename skulle komme deri.  Filename skulle jo sidde i $info['filename'].  Så prøv med kode såsom:

while($info = mysql_fetch_array( $data ))
{
if(!empty($info['filename']))
{
    [udskriv tekst og billed]
}
else
{
    [udskriv tekst]
}

(Jeg ved ikke om denne syntaks vil virke, hvor du definerer alias'erne for tabellerne på forhånd.  Måske.  Men jeg er vant til at skrive det på denne måde:
SELECT b.body_value, m.filename
FROM field_revision_body b
JOIN field_data_field_sekundbilleder s ON b.entity_id = s.entity_id
JOIN file_managed m ON s.fid = m.fid
WHERE  b.entity_id =".$_GET['var']."

men det kan være det er mig der er for gammeldavs.)
Avatar billede Slettet bruger
09. juli 2014 - 18:52 #6
Jeg tror helt sikkert, at det er din måde der er rigtig. Den holder jeg mig til.

Jeg har nu sat dette ind:

$data = mysql_query("SELECT field_revision_body.body_value, file_managed.filename
FROM field_revision_body
JOIN field_data_field_sekundbilleder ON field_revision_body.entity_id = field_data_field_sekundbilleder.entity_id
JOIN file_managed  ON field_data_field_sekundbilleder.fid = file_managed.fid
WHERE  field_revision_body.entity_id =".$_GET['var']." ")
or die(mysql_error());

while($info = mysql_fetch_array( $data ))
{
?>
<!--- Hvis "filename" ikke er tomt vises billedet --->
<?php
if (!empty($filename)) {
Print "<div class='span10' style='float:left; background-color:#CF0'>".$info['body_value'] . "</div> ";
Print "<div class='span3' style='float:left; background-color:#96C'><img src='../". $info['filename'] ."</div> ";
} else {
?>
<!--- ellers vises teksten i 100% bredde --->
<?php   
Print "<div  style='float:left; width:100%;'>".$info['body_value'] . "</div> ";
} }
?>


Men får følgende fejl:

Unknown column 'file_managed.filename' in 'field list'
Avatar billede Slettet bruger
09. juli 2014 - 21:28 #7
Ups, den fejl fandt jeg så selv. Var et felt i tabellen, der lige skulle skrives rigtigt.

MEN nu er siden bare blank, så betyder det, at der er en fejl i php koden?

SOM DET SER UD NU:

$data = mysql_query("SELECT field_revision_body.body_value, file_managed.filename
FROM field_revision_body
JOIN field_data_field_sekundbilleder ON field_revision_body.entity_id = field_data_field_sekundbilleder.entity_id
JOIN file_managed  ON field_data_field_sekundbilleder.field_sekundbilleder_fid = file_managed.fid
WHERE  field_revision_body.entity_id =".$_GET['var']." ")
or die(mysql_error());

while($info = mysql_fetch_array( $data ))
{
?>
<!--- Hvis "filename" ikke er tomt vises billedet --->
<?php
if (!empty($filename)) {
Print "<div class='span10' style='float:left; background-color:#CF0'>".$info['body_value'] . "</div> ";
Print "<div class='span3' style='float:left; background-color:#96C'><img src='../". $info['filename'] ."</div> ";
} else {
?>
<!--- ellers vises teksten i 100% bredde --->
<?php   
Print "<div  style='float:left; width:100%;'>".$info['body_value'] . "</div> ";
} }
?>
10. juli 2014 - 02:11 #8
I morgen er der atter en dag.  (Var det ikke det ham Valdemar sagde?)  Jeg går i seng nu og kikker i morgen.
10. juli 2014 - 09:41 #9
Ved du hvad, vi taler i cirkler.  Jeg er nok for dum til at gøre mig forståeligt.  I dit indlæg #4 har du denne linje kode:

if (!empty($body_value))

Jeg spurgte i #5 hvor variabelen $body_value kommer fra og hvordan den får en værdi.  Meningen er, ifølge hvad du også viser i koden, at undersøge om filenavnet er tomt, og filenavnet får du jo fra databasen i $info['filename'].  Men det kan du ikke rigtigt tage dig af, for i #8 bruger du så koden:

if (!empty($filename))

hvor igen du ingen steder giver variabelen $filename en værdi.

Lad os stoppe her og håbe du får fat i en anden der bedre er i stand til at hjælpe.  Fordi dette spørgsmål ikke længere er nyt vil jeg gætte på, at du bedst tiltrækker andre ved at afslutte dette spørgsmål og oprette et nyt.  Du kan afslutte og lukke spørgsmålet ved at acceptere dit svar 2.  Du sætter 'flueben' i feltet 'accepter dette svar' og derefter klikker du 'accepter svar og afgiv points'.
Avatar billede Slettet bruger
10. juli 2014 - 15:24 #10
Øh nå.
10. juli 2014 - 18:12 #11
Det er i grunden pudsigt, at der i spørgsmålet http://www.eksperten.dk/spm/996052 bliver givet de samme kommentarer som her.

Lukker du dette spørgsmål igen, nu du har et nyt spørgsmål.  Hvis du lukker spørgsmålet ved at acceptere dit eget svar #2, så får du dine 100 points igen, som du så kan bruge til andre spørsmål.
Avatar billede Slettet bruger
10. juli 2014 - 21:58 #12
Jeg vil da gerne give dig point, du har da skrevet det i mysql for mig.
11. juli 2014 - 13:21 #13
I så fald, her er svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester