webForumDet fria alternativet

Problem med inskrivning i db

PHP

9 svar · 648 visningar · startad av Dwarfen

Medlem sedan jan. 2002241 inlägg
Frågan#1

Sitter och försöker få in värden i en databas, men det vill sig inte.
Får upp följande felkod

Parse error: syntax error, unexpected '"' in admin\kommentera_forum.php on line 44

Koden har jag suttit och kollat igenom flera gånger nu, men nu hittar jag inte mer fel...

$sql = "insert into kommentera_forum (forumid, forumip, forumkommentar, forumuid, forumdatum) values ('". $_POST['forumid'] 

."','". $_SERVER['REMOTE_ADDR'] .'", '" . $_POST['forumkommentar'] . '", '" . $_SESSION['UID'] ."', '". $_POST['flkommentar'] . 

"', '" . $ndatum . ')";
Medlem sedan jan. 2003296 inlägg
#2

Du har citationstecken på fel ställen både lite här och var...

$sql = "insert into kommentera_forum (forumid, forumip, forumkommentar, forumuid, forumdatum) values ('" . $_POST['forumid'] . "', '" . $_SERVER['REMOTE_ADDR'] . "', '" . $_POST['forumkommentar'] . "', '" . $_SESSION['UID'] . "', '" . $_POST['flkommentar'] . "', '" . $ndatum . "')";

Nu vet jag inte heller vilka datatyper du har på dina fält i databasen... Gissar att t ex forumid och forumuid är heltal..? Om så är fallet ska du inte ha fnuttar kring dessa värden i din SQL-fråga:

$sql = "insert into kommentera_forum (forumid, forumip, forumkommentar, forumuid, forumdatum) values (" . $_POST['forumid'] . ", '" . $_SERVER['REMOTE_ADDR'] . "', '" . $_POST['forumkommentar'] . "', " . $_SESSION['UID'] . ", '" . $_POST['flkommentar'] . "', '" . $ndatum . "')";

Och så bör du söka lite här på forumet efter "sql injection". Dina SQL-frågor kan bli rejält osäkra om du stoppar in värden som postas från ett formuär, utan att du på något sätt kollar vad dessa variabler innehåller.

Medlem sedan jan. 2002241 inlägg
#3

Sql injection? Nu är jag verkligen inte med på vad du menar? Och varför ska det inte vara fnuttar runt de som är "heltal"?

Medlem sedan mars 20025 907 inlägg
#4

Dwarfen skrev:

Sql injection? Nu är jag verkligen inte med på vad du menar? Och varför ska det inte vara fnuttar runt de som är "heltal"?

  1. http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a
  2. Det är bestämt att det ska vara så. MySQL ger visserligen inget felmeddelande om du har fnuttar runt tal, men varför inte göra rätt direkt?
Medlem sedan jan. 2002241 inlägg
#5

Mycket att läsa, men nu är det gjort och jag förstår vad ni menar, det verkar ju mindre bra faktiskt om man håller på med lösenord och såna "viktiga" databaser.

Dock så förstår jag inte hur jag ska skriva min(a) sqlsatser för att förhindra detta, bara att jag ska göra det.

---edit---
Om jag förstått det hela rätt, så ska jag taga bort "" från alla tal som är heltal?
Provade detta på en simpel inmatning, men det ville sig verkligen inte.
Det ville sig inte heller i koden som jag fick som svar ovan eller rättare sagt, sqlsatsen utfördes men mef fel.
Medelandet innan jag matade inte värden:

Notice: Undefined index: forumid in H:\htdocs\admin\kommentera_forum.php on line 18

Medelandet efter inmatat värde:

Notice: Undefined index: forumkommentar in H:\htdocs\admin\kommentera_forum.php on line 44
Fel: Column count doesn't match value count at row 1
Medlem sedan mars 20034 471 inlägg
#6

" - är strängmarkering i PHP, och används för att sätta ihop SQL-frågan. (Eftersom denna är en sträng ur PHP:s perspektiv.)
' - är en strängmarkering för SQL. Det står runt alla värden som är av typen CHAR, VARCHAR eller TEXT. Däremot inte runt tal.
4 < 20 men '20' < '4' eftersom '2' ligger före '4' i teckenordning och en sträng matchas tecken för tecken.

Så om forumid och forumuid båda är heltal blir det:

$sql = "insert into kommentera_forum (forumid, forumip, forumkommentar, forumuid, forumdatum) 
values (" . $_POST['forumid'] . ", '" . $_SERVER['REMOTE_ADDR'] . "', '" . $_POST['forumkommentar'] . "', " . $_SESSION['UID'] . ", '" . $_POST['flkommentar'] . "', '" . $ndatum . "')";

Vad gäller SQL-Injections så är det viktigt att gardera sig mot det oavsett om du har viktiga saker lagrade eller ej. Om en användare kan använda detta otyg, så kan han göra precis vad han vill med dina data. Inklusiva droppa tabeller, tömma dem, byta namn på dem, lägga till saker, ändra innehåll...

OM magic_quotes_gpc är på så kommer alla farliga tecken att escape:as med automatik, om inte får du använda add_slashes() och strip_slashes() "för hand".

Medlem sedan jan. 2002241 inlägg
#7

Hmm känns som jag måste göra om hela hemsidan...Men först ska jag få den att fungera som det är tänkt, sedan får jag fila på omgörningen.

Har provat med din kod ovan, men koden vill sig inte.
Notice: Undefined index: forumkommentar in H:\htdocs\admin\kommentera_forum.php on line 45
Fel: Column count doesn't match value count at row 1

bah, jag blir snart gar´n på detta. Kanske borde börja göra om sidan direkt i stället.

Medlem sedan mars 20034 471 inlägg
#8

Dwarfen skrev:

Notice: Undefined index: forumkommentar in H:\htdocs\admin\kommentera_forum.php on line 45

Det här felet hör ihop med denna:
$_POST['forumkommentar']
Du har inte något index i POST som heter så.

  1. Har du stavat fel?
  2. Stora/små bokstäver?
  3. Har fältet lämnats tomt?

Innan du lagrar värdena i databasen, måste du kolla att du fått in vettiga värden. Om du inte vill att kommentarfältet ska kunna vara tomt tex, så måste du kolla det.

Annars (om det får vara tomt) kan du tex sätta

if (!isSet($_POST['forumkommentar']))
  $komm = "";
else $komm = $_POST['forumkommentar'];

Och i $sql byter du ut $_POST['forumkommentar'] mot $komm.

Medlem sedan jan. 200548 inlägg
#9

Testa med följande:

mysql_query(sprintf("INSERT INTO kommentera_forum (forumid, forumip, forumkommentar, forumuid, forumdatum) VALUES (%d, '%s', '%s', %d, '%s')", $_POST['forumid'], $_SERVER['REMOTE_ADDR'], $_POST['forumkommentar'], $_SESSION['UID'], $_POST['flkommentar'], $ndatum));

Observera att detta är utan att kolla värdena i respektive fält. Frågan bör fungera om all indata finns, även om den är tom.

Medlem sedan jan. 2002241 inlägg
#10

Jag skämms som en hund...

Hade helt missat $_Post delen...skamligt värre.
Nu får jag gå till jobbet och skämmas =(

264 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)