Just nu i M3-nätverket
Jump to content

Kod


Jonas Jönsson

Recommended Posts

Jonas Jönsson

Hej!

Jag har precis börjat pilla med mysql och ska göra min första databas. Det här gjorde jag bara för att testa, men det fungerar inte riktigt.

 

fran.php:

 

<form name="form1" method="post" action="emot.php">

<p>

<input type="text" name="info">

</p>

<p>

<input type="submit" name="Submit" value="Submit">

</p>

</form>

 

 

och emot.php:

 

<?

$open = mysql_connect ("localhost", "", "");

$dbinfo = mysql_db_query("hejsan", "INSERT tabell1 (namn) VALUES ('$info')");

mysql_close($open);

?>

 

 

Kolumnerna heter "id" (vilken är räknare) resp. "namn". Det som händer är att databasen lägger till en rad men fältet är tomt. Ingenting hamnar i den. Vad har jag gjort fel?

 

Link to comment
Share on other sites

Det vanliga nybörjarfelet, när man läst diverse gamla "how-to"s på nätet.

I nyare versioner av PHP har man stängt av register_globals, vilket betyder att postade variabler inte längre koms åt med $variabelnamn, utan $_POST["variabelnamn"] resp. $_GET["variabelnamn"] för GET-varaibler (skript.php?variabel=test).

 

Så här ska alltså ditt skript se ut:

<?php
$open = mysql_connect ("localhost", "", "");
mysql_select_db("hejsan");
$ok = mysql_query("INSERT INTO tabell1 (namn) VALUES ('" . addslashes($_POST["info"]) . "')");
?>

Ändringar jag gjort i koden:

- Gjort om <? till <?php vilket man bör använda för att säkra skriptets funktionalitet på olika plattformar.

- Använder mysql_select_db() för att en gång för alla välja databas, och därefter mysql_query() för att ställa frågor. Då slipper man ange databas vid varje fråga.

- Gjort SQL-frågasn säker med addslashes(). Läs mer om varför under punkt 2 här:

//eforum.idg.se/viewmsg.asp?EntriesId=392579#392588

- Tagit bort mysql_close(). Denna behöver man i princip aldrig anropa, om du inte ska göra en ny anslutning till en annan server exempelvis. Görs automatiskt i slutet av skriptet.

 

Link to comment
Share on other sites

Jonas Jönsson

Aha, kanske inte så konstigt då.

 

Men jag fick faktiskt inte det att fungera med ditt heller. Tråkigt nog.

 

Jag började på databasen jag tänkte använda mig av sedan eftersom jag var säker på att ditt förslag skulle funka. Men icke. Så här ser det ut nu:

 

<form method="post" action="emot.php">

<p> F&Ouml;RFATTARE:<br>

<input type="text" name="author">

</p>

<p>RUBRIK:<br>

<input type="text" name="header">

</p>

<p>INNEH&Aring;LL:<br>

<textarea name="body"></textarea>

</p>

<input type="submit" name="Submit" value="Submit">

</p>

</form>

 

 

respektive:

 

 

<?php

$open = mysql_connect ("localhost", "", "");

mysql_select_db("kollekt");

$ok = mysql_query("INSERT INTO artiklar (author) VALUES ('" . addslashes($_POST["author"]) . "')");

?>

 

 

nu händer ingenting. den lägger inte till ngn rad ens. o jag är säker på att alla namn är rätt, jag har kollat måååååååånga gånger.

 

Om jag ska använda mig av fler fält, hur skriver jag då? ($_POST["author"], ["header"]) kanske? vet du möjligtvis nån bra "how-to" som är aktuell? nu vet man ju inte vilka man kan lita på.

 

Link to comment
Share on other sites

Okej, då är det något annat som strular då.

Lägg till "echo mysql_error();" efter varje anrop till en MySQL-funktion:

$open = mysql_connect (...);
echo "1: " . mysql_error() . "<br>";
mysql_select_db(...);
echo "2: " . mysql_error() . "<br>";
$ok = mysql_query(...);
echo "3: " . mysql_error() . "<br>";
if (!$ok) echo "Fel i SQL-frågan";

Då ser du om och var ett eventuellt MySQL-fel uppstod.

 

Testa också att välja ut all data ur tabellen:

$res = mysql_query("SELECT * FROM artiklar");
$i = 0;
while ($rad = @mysql_fetch_assoc($res)) {
$i++;
echo "Rad " . $i . ": " . $rad["author"];
}

Skriver den ut något över huvud taget?

 

Om du vill lägga in fler fält utökar du ju helt enkelt bara SQL-frågan:

INSERT INTO artiklar (author,headers,body) VALUES ('" . addslashes($_POST["author"]) . "', '" . addslashes($_POST["headers"]) . "', '" . addslashes($_POST["body"]) . "')");

 

Säg till om något är oklart eller om du behöver mer hjälp.

 

Link to comment
Share on other sites

Jonas Jönsson

visst säger jag jag till :-)

 

1:

2:

3: Duplicate entry '0000-00-00 00:00:00' for key 2

Fel i SQL-frågan

 

blev svaret. jag är inte säker på vad det betyder, känner mig ganska värdelös :-) jag provade att ta bort standardvärdet men den envisas med att skriva dit det igen.

 

Link to comment
Share on other sites

Saker är nog den att du skapat tabellen med felaktiga parametrar (alltså inget fel på PHP-skriptet).

 

Kan du klistra in vilken SQL-fråga du använde för att skapa tabellen artiklar, så ska jag visa dig hur du rättar till den?

Den delen du ska kolla efter och ändra/ta bort, är PRIMARY KEY eller UNIQUE.

 

Nu verkar du ha satt en DATE-kolumn till PRIMARY KEY, vilket inte är så praktiskt, och än mindre användbart. ;)

 

Link to comment
Share on other sites

Jonas Jönsson

ah, det stämmer. men jag vågar faktiskt påstå att jag inte skrivit fel när jag skapat den. däremot har jag nog klickat lite väl mkt i phpmyadmin :-)

 

jag tog bort fälet o gjorde ett nytt, så nu fungerar det alldeles finfint! tackar för hjälpen!

 

Link to comment
Share on other sites

Jonas Jönsson

Hur ska man göra för att tiden ska registreras? Det står 0000-00-00 00:00:00 på alla.

 

Link to comment
Share on other sites

Hur ska man göra för att tiden ska registreras? Det står 0000-00-00 00:00:00 på alla.

 

Du får modifiera frågan så att den i INSERT-satsen även lägger till ett värde i den DATE-kolumn du har.

 

Något i stil med:

 

$ok = mysql_query("INSERT INTO artiklar (datum, author) VALUES (NOW(), '" . addslashes($_POST["author"]) . "')");

 

 

NOW() kommer att återge den aktuella tiden i form av just yyyy-mm-dd hh:mm:ss.

 

 

.dune.

----------------------------------------------

push@A,$_ for reverse q.e...q.n.;for(@A){$_=unpack(q|c|,$_);@a=split//; shift@a;shift@a if $a[$[]eq$[;$_=join q||,@a};print $_,$/for reverse @A

 

Link to comment
Share on other sites

Lägg till tidkolumnen, och sedan tiden du vill spara i VALUES.

Om du vill spara tiden då raden redigerade kan du exempelvis skriv så här:

INSERT INTO artiklar (tidkolumn) VALUES(NOW())

 

För att spara en specifik tid (11 april 2003, kl. 18:45:00):

INSERT INTO artiklar (tidkolumn) VALUES('20030411185400')

 

 

Link to comment
Share on other sites

Jonas Jönsson

Väldigt mycket tack! Här går det fort minsann! Hur skulle jag klara detta utan er egentligen? :-)

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...