Avatar billede agertz Nybegynder
26. oktober 2008 - 18:48 Der er 32 kommentarer og
1 løsning

Besværlig udskriv

Hej!

Jeg er i gang med at lave en side, hvor brugeren skal have muligheden for at klikke på nogle forskellige links. Men det skal kun være muligt for brugeren at klikke på disse link én gang.

Derfor skal jeg have lavet sådan, at den som udgangspunkt henter alle links hjem til udskriv, men så sorterer i dem, således at brugeren kun kan se, og klikke, på de links brugeren ikke har klikket på før. Jeg har prøvet som herunder, men uden held.

$view = mysql_query("SELECT * FROM brugere WHERE email='$_SESSION[email]'") or die(mysql_error());
$vis = mysql_fetch_assoc($view);

$res = mysql_query("SELECT * FROM links");
$udskriv = mysql_fetch_assoc($res);
$tjek = mysql_query("SELECT * FROM klik WHERE brugerid LIKE '$vis[id]' AND linkid LIKE '$udskriv[linkid]'");
$hent = (mysql_num_rows($tjek) == "0");
while ($row = mysql_fetch_array($hent)){


Jeg får fejlen: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource (i while-linien)

Jeg regner med, at det er fordi jeg ikke kan bruge så mange udskriv ting i forbindelse med hinanden, men håber I kan give mig en anden løsning :D
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 18:53 #1
Hvorfor bruger du LIKE?

Men find ud af hvad fejlen er ved at skrive:

$tjek = mysql_query("SELECT * FROM klik WHERE brugerid LIKE '$vis[id]' AND linkid LIKE '$udskriv[linkid]'") or die(mysql_error());
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 18:55 #2
Næh, det hjælper ikke noget - men er stadig godt at have mens du udvikler.

Fejlen er nok at
  while ($row = mysql_fetch_array($hent)){
sku' være
  while ($row = mysql_fetch_array($tjek)){
Avatar billede agertz Nybegynder
26. oktober 2008 - 19:22 #3
Ved at ændre hent til tjek i while - udskriver den ikke noget. Men der kommer så heller ikke nogen fejlmeddelelse.. Den skal jo ind og tjekke i begge databaser
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 19:25 #4
Nu kan jeg ikke se hvad du udskriver efterfølgende. Men hvis der ikke kommer noget ud, kan det skyldes den ikke finder rækker, der passer til betingelserne.
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 19:27 #5
Når du har de to linier

  $res = mysql_query("SELECT * FROM links");
  $udskriv = mysql_fetch_assoc($res);

Så får du kun een række ud i $udskriv-variablen. Det kan vel ikke være korrekt?
Avatar billede agertz Nybegynder
26. oktober 2008 - 19:38 #6
Det virker heller ikke med while ($udskriv = mysql_fetch_assoc($res)); - og den skulle finde en række der passer :)
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 19:44 #7
Den gør nok kun hvad den får besked på. Hvad det så end er.
Med andre ord: du har ikke givet os nok oplysninger til at løse dit problem.
Yderligere har du ikke svaret på mit allerførste spørgsmål.
Avatar billede agertz Nybegynder
26. oktober 2008 - 20:13 #8
Jeg ved faktisk ikke hvorfor jeg bruger LIKE - men er det ikke underordnet i dette tilfælde :D

Jeg har databasen "links" og "klik" I links har jeg gemt de mulige links en bruger kan se. Det er dem jeg gerne vil have udskrevet på siden - men samtidig vil jeg sætte et andet kriterium for, at disse links bliver udskrivet. Brugeren må nemlig ikke have klikket på linket før.

Her kommer databasen "klik" ind i billedet. Det er her jeg jeg gemmer brugerid og linkid i. Altså, hvis jeg nu besøgte link 1 med bruger 1, ville dette blive gemt i den tabel. 

Jeg vil så have udskrevet alle links som brugeren IKKE har besøgt. Derfor vil jeg have den til at tælle om linkets id og brugerens id forekommer i en række i "klik" - hvis dette er tilfældet, skal den ikke udskrive pågældende link.

Er det bedre forklaret? :D
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 21:10 #9
Det med LIKE er nok ikke noget problem her.

Men vi er vel tilbage ved problemet med data fra links-tabellen, hvordan de bliver behandlet. Du kan vel se at din oprindelige kode ikke klarer det. Og så har du tilføjet noget med en while-løkke. Og det virker ikke. Men hvad laver du egentlig?
Avatar billede agertz Nybegynder
26. oktober 2008 - 22:05 #10
Det er bare noget til en hjemmeside, hvor jeg håber at skabe lidt mere aktivitet :)
Avatar billede erikjacobsen Ekspert
26. oktober 2008 - 22:20 #11
Jeg må lære at være mere præcis: hvad laver du med koden. Hvordan ser den ud?
Avatar billede agertz Nybegynder
26. oktober 2008 - 22:25 #12
Ahh.. Kunne nemt misforstås ;-)

<?
session_start();
include("connect.php");

$view = mysql_query("SELECT * FROM brugere WHERE email='$_SESSION[email]'") or die(mysql_error());
$vis = mysql_fetch_assoc($view);

?>
Du kan klikke på nogle af nedenstående links :D <br><br>

<?

$res = mysql_query("SELECT * FROM links");
while ($udskriv = mysql_fetch_assoc($res));
$tjek = mysql_query("SELECT * FROM klik WHERE brugerid LIKE '$vis[id]' AND linkid LIKE '$udskriv[linkid]'");
$hent = (mysql_num_rows($tjek) == "0");
while ($row = mysql_fetch_array($tjek)){

echo '<a href="' . $row[link] . '">' . $row[tekst] . '</a> <br>';
}

Mere er der sådan set ikke i den :P - Kan du se meningen? :)
Avatar billede micc Nybegynder
27. oktober 2008 - 01:25 #13
Jeg er ikke sikker på jeg kan se meningen i din kode, men jeg kan i hvert fald se et sted hvor det muligvis går galt. Denne linie:
  while ($udskriv = mysql_fetch_assoc($res));
bliver du ved med at udføre indtil $udskriv har værdien false. Den er derfor nu en boolean. I næste linie behandler du så $udskriv som hvis det var et array og i så fald får du bare en tom tekststreng.
Avatar billede erikjacobsen Ekspert
27. oktober 2008 - 08:36 #14
Det er helt sikkert der, det går galt. Det er stadigvæk en enormt ineffektiv måde at gøre det på, men lad os bare se om vi kan få det til at virke:

<?php
session_start();
include("connect.php");

$view = mysql_query("SELECT * FROM brugere WHERE email='$_SESSION[email]'") or die(mysql_error());
$vis = mysql_fetch_assoc($view);

?>
Du kan klikke på nogle af nedenstående links :D <br><br>

<?php

$res = mysql_query("SELECT * FROM links");
while ($udskriv = mysql_fetch_assoc($res)) {
  $tjek = mysql_query("SELECT * FROM klik WHERE brugerid LIKE '$vis[id]' AND linkid LIKE '$udskriv[linkid]'");
  $hent = (mysql_num_rows($tjek) == "0");
  while ($row = mysql_fetch_array($tjek)){
    echo '<a href="' . $row[link] . '">' . $row[tekst] . '</a> <br>';
  }
}

?>
Avatar billede agertz Nybegynder
27. oktober 2008 - 12:20 #15
Den udskriver stadig bare en blank side... Men i $row springer den jo også bare $hent over - altså når den ikke at få talt forekomsterne inden den bliver udskrevet?? Kan det være fejlen?
Avatar billede erikjacobsen Ekspert
27. oktober 2008 - 12:23 #16
Det er korrekt, at du ikke bruger $hent til noget, men derfor kan den vel godt skrive noget ud, hvis der er noget i databasen, der passer på det du spørger om.
Avatar billede agertz Nybegynder
27. oktober 2008 - 12:25 #17
Hvis i har en helt anden metode, som skulle være bedre - er I også meget velkomne til at poste den idé :D
Avatar billede agertz Nybegynder
27. oktober 2008 - 12:26 #18
Der er oprettet data, så den skulle printe det ud .. :)
Avatar billede erikjacobsen Ekspert
27. oktober 2008 - 12:31 #19
"en helt anden metode" - det kommer an på hvad du vil, og har af data, osv. Jeg prøver blot at få et eller andet skrevet ud for dig ;)

"Der er oprettet data, så den skulle printe det ud", jo, men, det gør den så ikke. Du må finde ud af hvorfor.
Avatar billede agertz Nybegynder
27. oktober 2008 - 12:37 #20
Altså, hvis jeg skriver:

<?php

$res = mysql_query("SELECT * FROM links");
while ($udskriv = mysql_fetch_assoc($res)) {

  echo '<a href="' . $udskriv[link] . '">' . $udskriv[tekst] . '</a> <br>';

}

fungerer det selvfølgelig helt fint. Den udskriver de to links jeg har lagt ind korrekt.

Det svære her, er at få den til at finde ud af, om brugeren allerede har klikket på linket og i dette tilfælde, ikke udskrive pågældende link.

I min klik tabel har jeg så felterne linkid og brugerid - som den tilføjer når brugeren har klikket på linket. Hvis jeg, brugerid 1, klikker på link 2 vil dette blive gemt i databasen - så det fungerer også fint.

Jeg vil nu have ovenstående til at, først hente alle linksene fra "links" og derefter kun udskrive de links hvor brugerid og linkid allerede findes i en række i "klik"

Det er dér der går kage i det :P
Avatar billede erikjacobsen Ekspert
27. oktober 2008 - 12:59 #21
Det tyder på du har felterne "link" og "tekst" i tabellen "links". Har du også felter "link" og "tekst" i tabellen "klik"?
Avatar billede agertz Nybegynder
27. oktober 2008 - 13:08 #22
I links:
linkid
link
tekst

I klik:
linkid
brugerid
Avatar billede erikjacobsen Ekspert
27. oktober 2008 - 13:18 #23
Så i linien
      echo '<a href="' . $row[link] . '">' . $row[tekst] . '</a> <br>';
forsøger du at udskrive 2 felter, der ikke der der.
Avatar billede agertz Nybegynder
27. oktober 2008 - 15:03 #24
Ja, nu udskriver den så alle felterne - men den undlader ikke dem man allerede har klikket på ..
Avatar billede erikjacobsen Ekspert
27. oktober 2008 - 15:34 #25
Nej, der skal du lave en passende if-sætning, sikkert baseret på den variabel der endnu ikke er brugt til noget.
Avatar billede agertz Nybegynder
27. oktober 2008 - 15:44 #26
Kan du lige give et eksempel ;-)
Avatar billede micc Nybegynder
27. oktober 2008 - 20:40 #27
Sikkert noget i retning af:
$resultklik = mysql_query("SELECT * FROM klik WHERE linkid = '$linkid' AND brugerid = '$brugerid'");
if (mysql_num_rows($resultklik) == 0)
{
  // udskriv link
}

$linkid og $brugerid skal naturligvis udskiftes med hvad du har kaldt disse variable.
Avatar billede agertz Nybegynder
27. oktober 2008 - 22:47 #28
Det virker ikke :S

Måske jeg bare skulle prøve noget andet -.-
Avatar billede micc Nybegynder
28. oktober 2008 - 00:05 #29
Hvor meget er du villig til at omstrukturere? Jeg ville for eksempel nok droppe 'klik'-tabellen og i stedet tilføje et felt i tabellen 'brugere' der indeholder en kommasepereret liste af de links brugeren har besøgt.
Avatar billede agertz Nybegynder
28. oktober 2008 - 08:11 #30
Jeg er skam ligeglad med hvordan det laves ;-) - Det  med kommaseperering i brugere lyder som en god - og mere enkelt - løsning :D
Avatar billede agertz Nybegynder
28. oktober 2008 - 18:37 #31
Hvis man laver på det på din måde, vil man alligevel skulle hente informationerne fra 2 databaser - hvilket giver samme problem som ovenstående
Avatar billede erikjacobsen Ekspert
28. oktober 2008 - 19:52 #32
At lave en kommasepareret liste af værdier, er en umanerligt dårlig idé.

agertz: Når du skriver "Det virker ikke" gør du intet for at fortælle hvad der går galt. Hvad er den kode du kører, hvad sker der, hvad burde der ske?
Avatar billede agertz Nybegynder
26. maj 2010 - 10:34 #33
Må hellere få lukket tråden.
Jeg undskylder og takker for Jeres tid
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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