webForumDet fria alternativet

INSERT fungerar inte i funktion - Vad är fel?

PHP

13 svar · 628 visningar · startad av Yoda

Medlem sedan nov. 2002291 inlägg
Frågan#1

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.

Medlem sedan mars 20025 907 inlägg
#2

Kör du funktionen insert_kommentar()?
Prova att ändra

mysql_query($sql);
//till
mysql_query($sql) or die('fel: ' . mysql_error());
Medlem sedan nov. 2002291 inlägg
#3

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.

Medlem sedan nov. 2002291 inlägg
#4

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?

Medlem sedan mars 2007845 inlägg
#5

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

Medlem sedan maj 20071 061 inlägg
#6

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

Medlem sedan juni 20031 837 inlägg
#7

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.

Medlem sedan mars 2007845 inlägg
#8

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

Medlem sedan mars 20034 471 inlägg
#9

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.

Medlem sedan nov. 2002291 inlägg
#10

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"]?!

Medlem sedan nov. 2002291 inlägg
#11

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.

Medlem sedan maj 20071 061 inlägg
#12

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.

Medlem sedan mars 2007845 inlägg
#13

Jag har gjort en del ändringar i din fil. Så skulle jag göra. Kasta ett öga på den.

/D

Medlem sedan mars 20034 471 inlägg
#14

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

265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)