Gå til innhold

Anbefalte innlegg

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.

post-221386-0-80425000-1365966220_thumb.png

Endret av herdon
Lenke til kommentar
Videoannonse
Annonse

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

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

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 av herdon
Lenke til kommentar

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

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 av Crowly
Lenke til kommentar

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

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 av Crowly
  • Liker 1
Lenke til kommentar

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

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 av Crowly
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...