#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.
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.
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.
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" ?
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().
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
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".
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 :/
$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
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) }
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.
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
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
Synes godt om
Ny brugerNybegynder
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.