Gå til innhold

Anbefalte innlegg

Skrevet (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.

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

Endret av herdon
Videoannonse
Annonse
Skrevet

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å.

Skrevet

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å.

Skrevet

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.

Skrevet (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 av herdon
Skrevet

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.

Skrevet (endret)

prøv å fjern fnuttene rundt feltnavnene, edit: eller bruk ` istedenfor '. Fnuttologi på høyt plan dette ...

Endret av quantum
Skrevet

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.

Skrevet (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 av Crowly
Skrevet

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).

Skrevet (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 av Crowly
  • Liker 1
Skrevet

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.

Skrevet (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 av Crowly

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...