Kör du funktionen insert_kommentar()?
Prova att ändra
mysql_query($sql);
//till
mysql_query($sql) or die('fel: ' . mysql_error());
13 svar · 628 visningar · startad av Yoda
Jag får inte in kommentaren i databasen men ser inte vad som är fel. Någon som har bättre ögon än mig?
Formuläret där man skriver sitt inlägg, ligger i filen blogg_07maj.php:
<form method="post" action="blogg_07maj.php" name="insert_kommentar" onSubmit="return skicka_OnClick();">
Namn:<br />
<input type="text" name="namn"><br />
Kommentar:<br />
<textarea name="kommentar" rows="7" cols="40"></textarea><br />
<input type="submit" name="nytt" value="Spara">
<input type="reset" value="Rensa">
</form>
I filen funktioner.php har jag följande funktion:
function insert_kommentar()
{
global $namn, $kommentar;
$datum = date("Y-m-d H:i:s");
$con = mysql_connect("localhost", "xxxxx", "xxxxxx");
$databas = mysql_select_db("xxxxx", $con);
$sql = "INSERT INTO GrodBlogg(Id, Datum, Namn, Kommentar)
VALUES('', '$datum', '$namn', '$kommentar')";
mysql_query($sql);
mysql_close($con);
}
Och så har jag ett javaScript som jag har sett att det fungerar:
function skicka_OnClick()
{
var nam = document.insert_kommentar.namn.value;
var inl = document.insert_kommentar.kommentar.value;
if((nam.length != 0) && (inl.length != 0))
{
return true;
}
else
{
alert("Du har inte fyllt i allting.");
return false;
}
}
Jag har tagit exemplet från en bok så jag har inte riktigt koll på all kod. Men jag har lyckats hämta upp data från databasen, så det fungerar. Insert-satsen fungerar också, det har jag kollat.
Men jag ser inte vad som inte fungerar.
Kör du funktionen insert_kommentar()?
Prova att ändra
mysql_query($sql);
//till
mysql_query($sql) or die('fel: ' . mysql_error());
Nä, det är väl tveksamt. Jag får inget felmeddelande när jag skriver som du föreslår. Det måste betyda att jag inte anropar funktionen, va? Det går inte heller in i databasen när jag koller direkt i phpMyAdmin.
Aha, det är för exemplet jag tagit ifrån har formulär och funktion i samma fil. Jag har de i separata.
När jag lägger till:
<?php
insert_kommentar();
?>
precis under formuläret så går den in i funktionen men den tar inte med sig värdena från formuläret. Jag måste skicka med dem på något sätt. Hur gör jag nu det?
Jag skulle nog skippa java-grejen (kanske för att jag inte kan det).
Jag antar att du inkluderar din "funktioner.php" i "blogg_07maj.php".
Något liknande i början på blogg_07maj.php efter att du inkluderat funktionerna.
if(isset($_post['mode']) && $_post['mode'] == 'kommentar')
{
if((isset($_post['kommentar']) && $_post['kommentar'] != '') && (isset($_post['namn']) && $_post['namn'] != ''))
{
insert_kommentar($_post['namn'], $_post['kommentar']);
}
else
{
// Göra något när inte alla fält är ifyllda...
}
}
Och funktionen insert_kommentar() skulle jag ändra lite i
function insert_kommentar($namn, $kommentar)
{
$datum = date("Y-m-d H:i:s");
$con = mysql_connect("localhost", "xxxxx", "xxxxxx");
$databas = mysql_select_db("xxxxx", $con);
$sql = "INSERT INTO GrodBlogg(Id, Datum, Namn, Kommentar)
VALUES('', '$datum', '$namn', '$kommentar')";
mysql_query($sql);
mysql_close($con);
}
I forumläret skulle jag lägga till
<input type="hidden" name="mode" value="kommentar">
Sen en header() i slutet på insert_kommentar() så användaren slipper se forumläret igen, utom om fälten var tomma.
Eller något sådant.
/D
Ser att ni blandar Versaler och Gemener i variablerna. Verkar som om det inte är det felet här men ett tipps är att ha som vana att skriva variabeln på samma sätt överallt. Alltså inte "namn" och "Namn" utan enbart "namn" eller "Namn". Ett litet tipps för att komma snabbare ut ur felsökningsträsket, där vi ju alla hamnar förr eller senare :P
du får nog ta och visa all din kod. det är lite kod som saknas för att man ska kunna avgöra var felet ligger.
Mest troligt är det i filen blogg_07maj.php som felet finns.
Mr T skrev:
Ser att ni blandar Versaler och Gemener i variablerna. Verkar som om det inte är det felet här men ett tipps är att ha som vana att skriva variabeln på samma sätt överallt. Alltså inte "namn" och "Namn" utan enbart "namn" eller "Namn". Ett litet tipps för att komma snabbare ut ur felsökningsträsket, där vi ju alla hamnar förr eller senare :P
$sql = "INSERT INTO GrodBlogg(Id, Datum, Namn, Kommentar)
VALUES('', '$datum', '$namn', '$kommentar')";
"Namn" här är ingen variabel utan namnet på ett fält i databasen. Variabeln heter "$namn".
/D
Yoda skrev:
...precis under formuläret så går den in i funktionen men den tar inte med sig värdena från formuläret. Jag måste skicka med dem på något sätt. Hur gör jag nu det?
I och med att värdena kommer från ett formulär kan du använda dem rakt av i din funktion med:
"INSERT INTO GrodBlogg(Id, Datum, Namn, Kommentar)
VALUES('', '".$_POST["datum"]."', ''".$_POST["namn"]."', ''".$_POST["kommentar"]."')";
Annars hade du fått deklarera dina globala variabler med
function f() {
global $namn, $datum;
echo $namn;
}
drew skrev:
Jag skulle nog skippa java-grejen (kanske för att jag inte kan det).
JavaScriptet ser till att normala användare måste fylla i något innan de skickar formuläret. Tyvärr stoppar det inte folk som tycker det är kul att djävlas för sakens skull. Det är fullt möjligt för någon att skriva ett eget skript som laddar din action-sida utan den kollen. Därför bör man av säkerhetsskäl även eller åtminstone kolla de värden som faktiskt kommer in på server-sidan.
Okej, så här ser min php-fil ut. Har ändrat filtyp eftersom .php inte är tillåtet.
Eftersom funktionen och formuläret inte ligger i samma fil måste jag ju anropa funktionen på något sätt och skicka med värdena. Eller tänker jag helt fel? Går väl inte att göra som du (aasah) föreslår med $_POST["datum"]?!
Nä, jag kan inte ha funktionen där jag har den nu. Då anropas ju funktionen varje gång man uppdaterar sidan och skickar just nu in tomma rader i tabellen. En rad för varje uppdatering. Kan jag på något sätt skriva in
onSubmit="return skicka_OnClick(); insert_kommentar();"
Fast just det exemplet ovan fungerar inte.
Och fortfarande får jag inte med mig innehållet i formuläret.
drew skrev:
$sql = "INSERT INTO GrodBlogg(Id, Datum, Namn, Kommentar) VALUES('', '$datum', '$namn', '$kommentar')";"Namn" här är ingen variabel utan namnet på ett fält i databasen. Variabeln heter "$namn".
/D
Så rätt så rätt du har.
Dock har det inte hänt mig bara en gång utan flera att man plötsligt sitter och svär åt att det inte funkar. Det visar sig inte allt för sällan att man skrivit det stora N;et på fel ställe. 2 lika namn med enda skillnaden en Versal och en Gemen. Lätt hänt att det blandas ihop.
Kanske jag som är snurrig bara :)
Jag fortsätter dock att ha min varibler och fältnamn identiska eller med betydlig mer skillnad.
Ett tipps till om ni som jag använder er av engelska variabelnamn. Tänk på att Name, Title och liknade namn är sådana som kan används av SQL och PHP. Ta därför som vana att kanske lägg till ex. "f_" så det blir "f_name" för variabler som kommer från "fromlulär" och "t_" för variabler som bara används temporärt i vissa delar av programmet osv. Bara ett tipps.
Yoda skrev:
Eftersom funktionen och formuläret inte ligger i samma fil måste jag ju anropa funktionen på något sätt och skicka med värdena. Eller tänker jag helt fel? Går väl inte att göra som du (aasah) föreslår med $_POST["datum"]?!
Om funktionen inte ligger i den fil som anges i action i form-taggen så får du inkludera funktionen i den filen.
Exempel
//form.html eller form.php (där formen finns)
<form namn="dummy" method="post" action="test.php">...</form>
//I myFunctions.php
function insert_kommentar()
{
global $namn, $kommentar;
$datum = date("Y-m-d H:i:s");
$con = mysql_connect("localhost", "xxxxx", "xxxxxx");
$databas = mysql_select_db("xxxxx", $con);
$sql = "INSERT INTO GrodBlogg(Id, Datum, Namn, Kommentar)
VALUES('', '".$_POST["datum"]."', ''".$_POST["namn"]."', ''".$_POST["kommentar"]."')";
mysql_query($sql);
mysql_close($con);
}
//I test.php
include_once("/home/..../myFunctions.php");
//Nu kan du anropa insert_kommentar() utan problem.
Yoda skrev:
Nä, jag kan inte ha funktionen där jag har den nu. Då anropas ju funktionen varje gång man uppdaterar sidan och skickar just nu in tomma rader i tabellen. En rad för varje uppdatering. ...
Du måste till att börja med ha en felkoll som gör att du inte lägger in något om raderna är tomma. Det kollas tex enkelt med
$ok = true;
if (!isSet($_POST["namn"]) || strlen(trim($_POST["namn"])) == 0)
$ok = false;
if (!isSet($_POST["datum"]) || strlen(trim($_POST["datum"])) == 0)
$ok = false;
if (!isSet($_POST["kommentar"]) || strlen(trim($_POST["kommentar"])) == 0)
$ok = false;
if ($ok)
insert_kommentar();
else echo "<felmeddelande>";
Visst kan du stoppa in ett krav på onSubmitt, men vad händer då för folk som inte har JavaScript aktiverat? De kan inte använda din form... :( Bättre att lägga felkollen i PHP-filen enligt ovan, IMO.
MrT skrev:
Dock har det inte hänt mig bara en gång utan flera att man plötsligt sitter och svär åt att det inte funkar. Det visar sig inte allt för sällan att man skrivit det stora N;et på fel ställe. 2 lika namn med enda skillnaden en Versal och en Gemen. Lätt hänt att det blandas ihop.
Själv föredrar jag att vara konsekvent på ett annat sätt. Ser till att alla kolumnnamn börjar på stor bokstav - eller inte - att mina variabler alltid (om det inte finns mycket starka skäl för motsatsen - börjar med liten bokstav osv...