herdon Skrevet 14. april 2013 Del Skrevet 14. april 2013 (endret) Jeg har en nettside som lagrer og henter info fra en database, og det går helt fint bortsett fra ett sted, her i tabellen languages vil ikke den lagre. Her er koden: if(isset($_POST["save"])) { if($_POST['status'] == "new") { $con=mysqli_connect("XXX","XXX","XXX","XXX"); if (mysqli_connect_errno()) { echo "Failed to connect to the MySQL database: " . mysqli_connect_error(); } else { if (ucfirst($_POST['language1']) == ucfirst($_POST['language2'])) { mysqli_query($con,"INSERT INTO languages (name,source,by,created,updated,updated_by) VALUES ('" . ucfirst($_POST['language1']) . "','" . ucfirst($_POST['language1']) . ".txt','" . $_SESSION['memberID'] . "',NOW(),NOW()," . $_SESSION['memberID'] . ")"); } else { mysqli_query($con,"INSERT INTO languages (name,source,by,created,updated,updated_by) VALUES ('" . ucfirst($_POST['language1']) . "/" . ucfirst($_POST['language2']) . "','" . ucfirst($_POST['language1']) . "_" . ucfirst($_POST['language2']) . ".txt','" . $_SESSION['memberID'] . "',NOW(),NOW()," . $_SESSION['memberID'] . ")"); } mysqli_close($con); } } elseif($_POST['status'] == "edit") { $con=mysqli_connect("XXX","XXX","XXX","XXX"); if (mysqli_connect_errno()) { echo "Failed to connect to the MySQL database: " . mysqli_connect_error(); } else { mysqli_query($con,"UPDATE languages SET updated=NOW() AND updated_by=" . $_SESSION['memberID'] . " WHERE name='" . $_POST['language'] . "'"); $result = mysqli_query($con,"SELECT * FROM languages WHERE name='" . $_POST['language'] . "'"); $row = mysqli_fetch_array($result); mysqli_close($con); } } Navnene til kolonnene i tabbellen er med attributter er lagt ved. Endret 14. april 2013 av herdon Lenke til kommentar
Sokkalf™ Skrevet 14. april 2013 Del Skrevet 14. april 2013 UPDATE languages SET updated=NOW() AND updated_by= Tror ikke du kan ha AND der, oppdatering av flere kolonner skal såvidt jeg vet separeres av komma. Lenke til kommentar
herdon Skrevet 15. april 2013 Forfatter Del Skrevet 15. april 2013 Tror ikke du kan ha AND der, oppdatering av flere kolonner skal såvidt jeg vet separeres av komma. Ok, takk. Det må også være noe galt med INSERT INTO også. Lenke til kommentar
Crowly Skrevet 15. april 2013 Del Skrevet 15. april 2013 Kan være du bruker reserverte ord som felt navn, i så fall må de omsluttes av ` INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) .... En god vane er å gjøre det uansett. Og sql din er veldig usikker, aldri sett data fra brukeren rett inn i noe uten å validere og vaske det først, slik at du er trygg at det ting er som forventet. Les litt om sql injections. Prepared statements er også kjekt å lese seg opp på. Lenke til kommentar
herdon Skrevet 15. april 2013 Forfatter Del Skrevet 15. april 2013 Kan være du bruker reserverte ord som felt navn, i så fall må de omsluttes av ` INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) .... En god vane er å gjøre det uansett. Og sql din er veldig usikker, aldri sett data fra brukeren rett inn i noe uten å validere og vaske det først, slik at du er trygg at det ting er som forventet. Les litt om sql injections. Prepared statements er også kjekt å lese seg opp på. Mm, har endret på det her, men det er visstnok ikke problemet, men har funnet erroren: Error: 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 ''name','source','by','created','updated','updated_by') VALUES ('English','Englis' at line 1 Håper noen klarer å se hva i dette utsnittet som er feil. Lenke til kommentar
quantum Skrevet 15. april 2013 Del Skrevet 15. april 2013 Før du poster insert-setningen i sin helhet tror jeg ingen kan hjelpe deg ... Lenke til kommentar
herdon Skrevet 15. april 2013 Forfatter Del Skrevet 15. april 2013 (endret) Før du poster insert-setningen i sin helhet tror jeg ingen kan hjelpe deg ... Her er den (selv om jeg bare har endret på verdiene som skal settes inn fra den som står i koden i første post, og det ser ut som om verdiene ikke har noe med dette å gjøre, men kolonnene): mysqli_query($con,"INSERT INTO languages ('name','source','by','created','updated','updated_by') VALUES ('English','English.txt','all',NOW(),NOW()," . $_SESSION['memberID'] . ")"))); Endret 15. april 2013 av herdon Lenke til kommentar
quantum Skrevet 15. april 2013 Del Skrevet 15. april 2013 Er det bare jeg som får kodelinjene klippet av? Skjer i Safari og Chrome ... Lenke til kommentar
herdon Skrevet 15. april 2013 Forfatter Del Skrevet 15. april 2013 Er det bare jeg som får kodelinjene klippet av? Skjer i Safari og Chrome ... Jeg bruker safari når jeg er på iPaden, men har aldri opplevd det. Lenke til kommentar
WiiBoy Skrevet 15. april 2013 Del Skrevet 15. april 2013 (endret) glem det jeg skrev.. Endret 15. april 2013 av WiiBoy Lenke til kommentar
quantum Skrevet 15. april 2013 Del Skrevet 15. april 2013 (endret) prøv å fjern fnuttene rundt feltnavnene, edit: eller bruk ` istedenfor '. Fnuttologi på høyt plan dette ... Endret 15. april 2013 av quantum Lenke til kommentar
herdon Skrevet 15. april 2013 Forfatter Del Skrevet 15. april 2013 prøv å fjern fnuttene rundt feltnavnene, edit: eller bruk ` istedenfor '. Fnuttologi på høyt plan dette ... Ja, nå sier den: Error: 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 ')' at line 1 Så det hjalp, men jeg ser ikke hva som er problemet med den. Lenke til kommentar
Crowly Skrevet 15. april 2013 Del Skrevet 15. april 2013 (endret) Viktig å legge merke til type fnutt i mysql. For å gjøre sql'en litt mer lesbar kan du f.eks. ta i bruk sprintf() $sql=sprintf( "INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) VALUES ('%s','%s','%s',NOW(),NOW(),'%s')", mysqli_real_escape_string(ucfirst($_POST['language1']). "/" . ucfirst($_POST['language2'])), mysqli_real_escape_string(ucfirst($_POST['language1']) . "_" . ucfirst($_POST['language2']) . ".txt"), mysqli_real_escape_string($_SESSION['memberID']), mysqli_real_escape_string($_SESSION['memberID']) ); // debugg, sjekk at oppbygg sql ser riktig ut echo nl2br($sql); mysqli_query($con,$sql); Edit: Alternativt med PDO og prepared statement, oop // ;port= er kun nødvendig hvis man ikke bruker standard porten 3306 $dns='mysql:host=localhost;port=3306;dbname=database'; $pdo=new pdo($dns, 'bruker', 'passord'); $sql="INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) VALUES (:name,:source,:by,NOW(),NOW(),:updated_by)"; $rs=$pdo->prepare($sql); $name=filter_var(ucfirst($_POST['language1']). '/' . ucfirst($_POST['language2']),FILTER_SANITIZE_STRING); $source=filter_var(ucfirst($_POST['language1']) . '_' . ucfirst($_POST['language2']) . '.txt',FILTER_SANITIZE_STRING); $user=filter_var($_SESSION['memberID'],FILTER_SANITIZE_STRING); $rs->bindValue(':name',$name,PDO::PARAM_STR); $rs->bindValue(':source',$source,PDO::PARAM_STR); $rs->bindValue(':by',$user,PDO::PARAM_STR); $rs->bindValue(':updated_by',$user,PDO::PARAM_STR); $rs->execute(); Endret 16. april 2013 av Crowly Lenke til kommentar
herdon Skrevet 16. april 2013 Forfatter Del Skrevet 16. april 2013 Viktig å legge merke til type fnutt i mysql. For å gjøre sql'en litt mer lesbar kan du f.eks. ta i bruk sprintf() $sql=sprintf( "INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) VALUES ('%s','%s','%s',NOW(),NOW(),'%s')", mysqli_real_escape_string(ucfirst($_POST['language1']). "/" . ucfirst($_POST['language2'])), mysqli_real_escape_string(ucfirst($_POST['language1']) . "_" . ucfirst($_POST['language2']) . ".txt"), mysqli_real_escape_string($_SESSION['memberID']), mysqli_real_escape_string($_SESSION['memberID']) ); // debugg, sjekk at oppbygg sql ser riktig ut echo nl2br($sql); mysqli_query($con,$sql); Ifølge det du har skrevet og det som står på php manualen så krever mysql_real_escape_string() bare ett argument, kan ha to, men min server sier den krever to argumenter, hvorfor krever den dette (gammel versjon krevde noe annet kanskje). Lenke til kommentar
Crowly Skrevet 16. april 2013 Del Skrevet 16. april 2013 (endret) mysql_real_escape_string er deprecated, og jeg leste ikke godt nok på mysqli_real_escape_string hvor man må spesifisere tilkoblingen, noe som ikke var påkrevd med mysql_real_escape_string. Har aldri brukt mysqli, gikk over til å bruke pdo for en god stund siden (se redigert post ovenfor for ett eksempel). $sql=sprintf( "INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) VALUES ('%s','%s','%s',NOW(),NOW(),'%s')", mysqli_real_escape_string($con,ucfirst($_POST['language1']). "/" . ucfirst($_POST['language2'])), mysqli_real_escape_string($con,ucfirst($_POST['language1']) . "_" . ucfirst($_POST['language2']) . ".txt"), mysqli_real_escape_string($con,$_SESSION['memberID']), mysqli_real_escape_string($con,$_SESSION['memberID']) ); Endret 16. april 2013 av Crowly 1 Lenke til kommentar
herdon Skrevet 16. april 2013 Forfatter Del Skrevet 16. april 2013 mysql_real_escape_string er deprecated, og jeg leste ikke godt nok på mysqli_real_escape_string hvor man må spesifisere tilkoblingen, noe som ikke var påkrevd med mysql_real_escape_string. Har aldri brukt mysqli, gikk over til å bruke pdo for en god stund siden (se redigert post ovenfor for ett eksempel). $sql=sprintf( "INSERT INTO `languages` (`name`,`source`,`by`,`created`,`updated`,`updated_by`) VALUES ('%s','%s','%s',NOW(),NOW(),'%s')", mysqli_real_escape_string($con,ucfirst($_POST['language1']). "/" . ucfirst($_POST['language2'])), mysqli_real_escape_string($con,ucfirst($_POST['language1']) . "_" . ucfirst($_POST['language2']) . ".txt"), mysqli_real_escape_string($con,$_SESSION['memberID']), mysqli_real_escape_string($con,$_SESSION['memberID']) ); Mm, rart hva man må sette tilkoblingen på PS: så på eksempelet du ga på pdo, og det jeg tenker er at det må være slitsomt å skrive starten på siste del hele tiden (altså skrive navnet på arrayet pdo, pluss variabelen man skal lagre i hver eneste gang før man kaller exicute-funksjonen. Lenke til kommentar
Crowly Skrevet 16. april 2013 Del Skrevet 16. april 2013 (endret) Vil tro de fleste skriver sin egen utvidelse av PDO klassen, hvor man bl.a. forenkler den delen. Eller tar i bruk andre rammeverk som har forenklet dette. Eller bruker en editor som enkelt dupliserer linjer (f.eks. Netbeans ctrl+shift+pil ned) og så endrer man kun det som er forskjellig. For meg har det blitt en vane sak å skrive PDO::PARAM_*, som alt annet man gjør ofte så sitter det i fingerspissene etter hvert, og tenker ikke så mye over det Endret 16. april 2013 av Crowly Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå