Avatar billede sijmonj Nybegynder
07. juni 2010 - 19:12 Der er 44 kommentarer og
1 løsning

mysqli bind problemer

jeg har lidt problemer med min join her, ved ikke om det er rigtig bindet da jeg er lidt ny til mysqli,

men jeg får ingen fejl meddelser

her er min kode: http://pastebin.com/RRPjhdhY
Avatar billede majbom Novice
07. juni 2010 - 22:33 #1
man bruger ikke or die i mysql i, men mysqli->error

så prøv det efter din bind_result og se om den spytter noget ud...
Avatar billede sijmonj Nybegynder
07. juni 2010 - 22:58 #2
altså sådan her :)?



$stmt->bind_result($forum_traad.dato,$forum_traad.brugernavn,$forum_traad.fk_forum_kategori,$forum_traad.indhold,$forum_traad.overskrift,$forum_traad.id,$forum_kommentare.id,$forum_kommentare.fk_forum_traad,$forum_kommentare.brugernavn);
    echo $mysqli->error;
    $stmt->execute();
    $stmt->error();

for så får jeg den her fejl

Fatal error: Call to a member function bind_result() on a non-object in E:\wamp\www\forum.kategori.vis.php on line 34
Avatar billede repox Seniormester
07. juni 2010 - 23:10 #3
Det er noget pudseløjerligt noget du har fået bikset sammen der...

For det første anvender du slet ikke mulighederne i prepared statements, selvom du anvender teknologien.

Du kan ikke binde et resultat på en forespørgsel du ikke har eksekveret.

Metoden ::error() skal anvendes på dit $stmt objekt, når det er det objekt du forsøger at ændre/eksekvere.

Og som #1 siger; du kan ikke blande mysql og mysqli sammen, som du har gjort i dit eksempel.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 00:14 #4
skal det være

$stmt->error();


hva er det for nogen muligheder jeg ikke anvender :)?
Avatar billede majbom Novice
08. juni 2010 - 09:15 #5
du kan evt se her hvordan man bruger mysqli: http://www.tutorialhero.com/click-56189-php_5_mysqli_prepared_statements.php

du blander det lidt nemlig...
Avatar billede repox Seniormester
08. juni 2010 - 09:36 #6
#4
Kort fortalt er formålet med prepared statements at du sikrer dine data bedre; det gør du ikke ved at konkatenere dine forespørgselsdata ind i din SQL streng.

Den forkerte måde at gøre det på:

$sql = "SELECT * FROM table WHERE field = '".$data."'";
$stmt = $mysqli->prepare($sql);
$stmt->execute();
...


Den rigtige måde at gøre det på:

$sql = "SELECT * FROM table WHERE field = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $data);
$stmt->execute();
...


På den måde udnytter du den sikkerhed der ligger i at anvende prepared statements.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 12:53 #7
har prøvet at læse lidt på dit link men synes ikke rigtig jeg lærte noget, er heller ikke den bedste til engelsk så måske derfor :( .

men bind_param er det ikke kun hvis jeg skal indsætte noget i databasen?

har ihvertfald lavet det sådan her ud


http://pastebin.com/xjaKmhCq


er ikke helt sikker på den error virker
Avatar billede repox Seniormester
08. juni 2010 - 13:02 #8
Nej, bind_param() er til at binde dine variabler til din prepared statement. Om du henter, indsætter, opdaterer eller sletter så bruger du bind_param; ellers er du jo lige så sårbar over for SQL injection som før.

::error() virker som det skal - det er dig der bruger det forkert.
Prøv at bruge manualen lidt: http://dk2.php.net/manual/en/mysqli-stmt.error.php

Der er gode eksempler på hvordan man kan bruge de forskellige metoder.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 16:05 #9
nu har jeg prøvet med det her

http://pastebin.com/w2C0B6q2

men får bare stadig samme fejl, kan det være min query som er helt gal?
Avatar billede dkfire Nybegynder
08. juni 2010 - 17:48 #10
Har du prøver at:

$mysql = connect();
$stmt = $mysql->prepare("
Select
forum_traad.dato,
forum_traad.brugernavn,
forum_traad.fk_forum_kategori,
forum_traad.indhold,
forum_traad.overskrift,
forum_traad.id,
forum_kommentare.id,
forum_kommentare.fk_forum_traad,
forum_kommentare.brugernavn
From
forum_traad Inner Join
forum_kommentare On forum_kommentare.fk_forum_traad = forum_traad.id
WHERE
godkendt = 'ja'
AND
fk_forum_kategori = ?
") or die($mysql->error());

Efter som det er ved din prepare at det fejler.

Dog mangler du sikkert at skrive hvilken tabel godkend og fk_forum_kategori kommer fra.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 18:25 #11
så nu virker det med det her


$stmt = $mysql->prepare("
Select
forum_traad.dato,
forum_traad.brugernavn,
forum_traad.fk_forum_kategori,
forum_traad.indhold,
forum_traad.overskrift,
forum_traad.id,
forum_kommentare.id,
forum_kommentare.fk_forum_traad,
forum_kommentare.brugernavn
From
forum_traad Inner Join
forum_kommentare On forum_kommentare.fk_forum_traad = forum_traad.id
WHERE
forum_kommentare.godkendt = 'ja'
AND
fk_forum_kategori = ?
") or die($mysql->error());

$stmt->bind_result($dato,$brugernavn,$fk_forum_kategori,$indhold,$overskrift,$id,$id,$fk_forum_traad,$brugernavn);
    $stmt->bind_param("i", $kategoriID);
    $stmt->execute();
    echo $mysql->error;


skal jeg i min bind_result så skrive forum_traad.dato osv.?

og hvordan udskriver jeg fra den ene og den anden tabel?

echo $forum_traad.dato;?

eller hvordan :D
Avatar billede dkfire Nybegynder
08. juni 2010 - 18:49 #12
Nej du har jo allerede en bind_result med $dato, $brugernavn... ,
dog har du $id to gange, det er ikke så smart, da du så ikke kan se hvilken værdi du arbejder med. 
Det er bestemt ikke en god ide at have et . i dine variabelnavne.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 19:51 #13
men forstår ikke helt i begge mine tabeller har jeg et felt som hedder "dato" hvordan finder jeg ud af om det er dato'en fra tabellen "forum_traade" eller om det er datoen fra "forum_kommentare" ?
Avatar billede dkfire Nybegynder
08. juni 2010 - 20:30 #14
Det er nu meget simpelt.
bind_result virker på denne måde: første felt du angiver i din sql bliver bundet til første variabel du angiver i bind_result, andet felt til 2. variabel osv.

Men du bliver nød til at kalde bind_result EFTER du har kaldt execute().
Avatar billede sijmonj Nybegynder
08. juni 2010 - 21:32 #15
okay lyder nice :), men hvis jeg nu har 2 felter som begge hedder dato hvad gør jeg så?
Avatar billede dkfire Nybegynder
08. juni 2010 - 22:40 #16
Jeg er ikke helt sikker på hvad du mener.
Du kan jo lave to forskellige variabler, en til hver dato felt.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 22:47 #17
i min database har jeg 2 tabeller som hedder

forum_traad
forum_kommentare

i begge de tabeller har jeg et felt som hedder dato


hvis jeg gerne vil echo dato'en fra forum_kommentare tabellen hvordan gør jeg det uden at den tror jeg mener den dato fra forum_traad tabellen :)?

håber du forstår
Avatar billede dkfire Nybegynder
08. juni 2010 - 23:03 #18
Ved at definere det i din felt liste i din select
Select
t.dato,
t.brugernavn,
t.fk_forum_kategori,
t.indhold,
t.overskrift,
t.id,
k.id,
k.fk_forum_traad,
k.brugernavn,
k.dato
FROM
forum_traad t INNER JOIN
forum_kommentare k ON k.fk_forum_traad = t.id
WHERE
k.godkendt = 'ja'
AND
t.fk_forum_kategori = ?

din bind kunne så være:
$stmt->bind_result(
    $traad_dato,
    $traad_brugernavn,
    $traad_fk_forum_kategori,
    $traad_indhold,
    $traad_overskrift,
    $traad_id,
    $kommentare_id,
    $kommentare_fk_forum_traad,
    $kommentare_brugernavn,
    $kommentare_dato);

Så vil $kommentare_dato indeholde værdien fra feltet forum_kommentare.dato
Og $traad_dato vil indeholde værdien fra feltet forum_traad.dato
Avatar billede sijmonj Nybegynder
08. juni 2010 - 23:12 #19
ahh så skal det så bare skrives i den rigtige række følge som du sagde :)
Avatar billede dkfire Nybegynder
08. juni 2010 - 23:21 #20
yes sir, ellers kan mysql jo ikke finde ud af det.
Læg også mærke til at jeg har brugt alias til dine tabelnavne, det gør det lidt mere overskueligt.
Avatar billede sijmonj Nybegynder
08. juni 2010 - 23:35 #21
men nu henter den samme tråd 4 gange :S det forstår jeg ikke helt


http://pastebin.com/jK9W7uhh
Avatar billede dkfire Nybegynder
09. juni 2010 - 06:26 #22
Det er nok fordi der er 4 kommentarer til din tråd.
Prøv at udskrive de to datoer, eller prøv at tjekke i PHPMyAdmin de to tabeller for den tråd id.
Avatar billede sijmonj Nybegynder
09. juni 2010 - 13:32 #23
altså i min database i tabellen "forum_traad" har jeg 2 tråde den ene har fk_forum_kategori: 5 og den anden har 6.

så den henter den rigtige tråd men den udskriver den bare 4 gange fordi der er 4 kommentare i den tråd.

har prøvet at echo

echo "Tråd dato: ".$traad_dato;
echo "<br>kommentar dato: ".$kommentare_dato;

og så skriver den bare begge dato'er 4 gange :p. ved ikke helt hvad der er galt

har det noget af gøre med

t.fk_forum_kategori = ?

og $stmt->bind_param("i", $kategoriID);
Avatar billede dkfire Nybegynder
09. juni 2010 - 14:32 #24
Det har ikke specielt noget med mysqli at gøre.
Det har noget at gøre med dit resultat af den "INNER JOIN" og hvordan du har struktureret din PHP kode.

Din "INNER JOIN" vil give dig 4 rækker, hvor data fra "traad" tabellen vil være ens for alle rækker, sådan virker "INNER JOIN".
Avatar billede sijmonj Nybegynder
09. juni 2010 - 16:00 #25
skal jeg så bruge left join eller noget andet :)?
Avatar billede dkfire Nybegynder
09. juni 2010 - 16:51 #26
Nej, du skal nok snare lave 2 sql query's.
Avatar billede majbom Novice
09. juni 2010 - 18:59 #27
hvad er det helt præcist du vil have vist siden du laver denne sql-forespørgsel?

prøv at forklar det, så er det måske lidt nemmere at hjælpe dig :)
Avatar billede sijmonj Nybegynder
10. juni 2010 - 22:05 #28
jeg vil gerne have vist alle de tråde som er oprettet inde i den kategori man nu har valgt.


og ud for hver tråd vil jeg gerne have vist, hvem der har oprettet den og Hvem der sidst har svaret i tråden :) håber i forstår mig da jeg er gået lidt i stå med det :/
Avatar billede majbom Novice
11. juni 2010 - 09:02 #29
umiddelbart ville jeg mene at du ville få løst dit problem ved at smide:

ORDER BY k.id DESC GROUP BY t.id

i enden af din sql-streng...
Avatar billede sijmonj Nybegynder
11. juni 2010 - 13:23 #30
er det sådan her den skal være


$stmt = $mysql->prepare("
Select
t.dato,
t.brugernavn,
t.fk_forum_kategori,
t.indhold,
t.overskrift,
t.id,
k.id,
k.fk_forum_traad,
k.brugernavn,
k.dato
FROM
forum_traad t INNER JOIN
forum_kommentare k ON k.fk_forum_traad = t.id
WHERE
k.godkendt = 'ja'
AND
t.fk_forum_kategori = ? ORDER BY k.id DESC GROUP BY t.id");


for jeg får den her fejl nu

Fatal error: Call to a member function bind_param() on a non-object

men har ikke rørt ved

$stmt->bind_param("i", $kategoriID);

så det ret mærkeligt
Avatar billede dkfire Nybegynder
11. juni 2010 - 14:36 #31
Brug nu mysql::error til at finde dine fejl i sql sætningen.
Du har fået vist hvordan du skal gøre!
Avatar billede sijmonj Nybegynder
11. juni 2010 - 14:41 #32
jamen når jeg skriver

or die($mysql->error());

efter min sql sætning så skriver den

Call to undefined method mysqli::error()
Avatar billede dkfire Nybegynder
11. juni 2010 - 14:50 #33
Har du prøvet at lave en vardump på $mysql ??
Og du er sikker på at du har forbindelse til din mysql database ?
Avatar billede dkfire Nybegynder
11. juni 2010 - 14:52 #34
Evt. prøv at fjerne de to () efter error.
or die($mysql->error);
Avatar billede sijmonj Nybegynder
11. juni 2010 - 14:54 #35
ja det er jeg sikker på da den jo godt kan udskrive noget hvis jeg ikke laver det der join :) men jeg får det her af vardump, er vardump ikke det samme som print_r($mysql); :)?




object(mysqli)#1 (17) {
  ["affected_rows"]=>
  int(-1)
  ["client_info"]=>
  string(50) "mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $"
  ["client_version"]=>
  int(50005)
  ["connect_errno"]=>
  int(0)
  ["connect_error"]=>
  string(0) ""
  ["errno"]=>
  int(1064)
  ["error"]=>
  string(160) "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 'GROUP BY t.id' at line 18"
  ["field_count"]=>
  int(0)
  ["host_info"]=>
  string(37) "MySQL host info: localhost via TCP/IP"
  ["info"]=>
  NULL
  ["insert_id"]=>
  int(0)
  ["server_info"]=>
  string(20) "5.1.36-community-log"
  ["server_version"]=>
  int(50136)
  ["sqlstate"]=>
  string(5) "42000"
  ["protocol_version"]=>
  int(10)
  ["thread_id"]=>
  int(17)
  ["warning_count"]=>
  int(0)
}
Avatar billede sijmonj Nybegynder
11. juni 2010 - 15:30 #36
fjernede de 2 () så nu får jeg den rigtige fejl :)

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 'GROUP BY t.id'
Avatar billede dkfire Nybegynder
11. juni 2010 - 19:43 #37
Ang mysqli::error, så havde jeg lige lavet en fejl. Det er ikke en funktion men "bare" en vairabel i mysqli. ( I mysql er det en funktion man skal kalde)


Som du kan se ud fra både vardump og udprintet, så har du en fejl på k.id. Det eneste forslag jeg kan komme med er at prøve med k.dato i stedet. Men jeg er ikke sikker.
Avatar billede sijmonj Nybegynder
13. juni 2010 - 17:39 #38
nu har jeg prøvet at rette k.id til k.dato men får stadig samme fejl :( .

Jeg har prøvet at læse lidt om det der group men forstår det ikke helt, tror du at du kan forklare hvad det gør :)?
Avatar billede sijmonj Nybegynder
13. juni 2010 - 18:34 #39
jeg fandt ud af problemet :) jeg skulle sætte group by FØR min order by :D.

tusind tak for jeres hjælp smid svar :)
Avatar billede majbom Novice
13. juni 2010 - 18:48 #40
well, okay, det vidste jeg faktisk ikke :s

kuhl det spiller! :)
Avatar billede sijmonj Nybegynder
13. juni 2010 - 19:03 #41
fandt lige en fejl, den order ikke rigtig, den tager id 1 selv om den jo skal tage id 4 (altså den sidste kommentar id) har prøvet med order by DESC og order by ASC men ingen virker :S
Avatar billede sijmonj Nybegynder
13. juni 2010 - 19:03 #42
du får ihvertfald lige point :)
Avatar billede majbom Novice
13. juni 2010 - 19:34 #43
var jeg den eneste der skulle have points?
Avatar billede sijmonj Nybegynder
14. juni 2010 - 13:34 #44
nej det var en fejl kan godt lave en ny tråd hvis i andre vil have point os
Avatar billede Vikash Jha Praktikant
21. august 2018 - 12:48 #45
I am a freelancer and most of time i work for data entry that's why i use computer shortcut keys and i have enough knowledge about it. If someone need advise about windows shortcut keys, feel free to visit me at http://shortkeys.top
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