03. marts 2012 - 12:38
Der er
19 kommentarer og 1 løsning
Indsætte current time i Mysqli php prepare statement?
Hej. Jeg er vant til bare at bruge NOW(), når jeg skulle indsætte den tiden i databasen, men nu ved jeg ikke helt, hvad jeg skal gøre, når jeg brugere php preparre statement? Nogen, som kender en metode? På forhånd tak for hjælpen.
Annonceindlæg fra Arrow
03. marts 2012 - 13:28
#1
Du kan vel stadig bruge NOW() i SQL...?
03. marts 2012 - 14:55
#2
Altså, jeg får hvert flad fejlen: Fatal error: Call to undefined function NOW() i /* Bind parametre */ $stmt->bind_param('siii', $topic_subject, NOW(), $topic_cat, $id); Jeg google det, og nogen skrev noget om man ikke kunne gøre det i mysqli?
03. marts 2012 - 14:55
#3
Du skal bare gøre det direkte i SQL-sætning, og ikke som ?-parameter. NOW() er ikke farligt.
03. marts 2012 - 15:12
#4
Mange tak, det virkede.. :) Må lige stille et spørgsmål mere, som jeg har problemer med? Kan nemlig se at du ikke samler på point, men måske istedet gør det for kun at hjælpe? :)
03. marts 2012 - 15:25
#5
Spørg løs...
03. marts 2012 - 15:32
#6
Tak :) Jeg henter en forum-kategori ned fra en option; echo "<select class='select' name='topic_cat'>"; while ($stmt->fetch()) { echo "<option class='optionnyheder' value='" . $cat_id . "'>" . $cat_name . "</option>"; } echo "</select><br />"; Henter den: $topic_cat=$_POST['topic_cat']; $mysqli->real_escape_string($topic_cat); Så hvis jeg udposter den i browseren: echo ' før kat: ' . $topic_cat . ' <br />'; Giver den: før kan: 1 Men hvis jeg så sætter den ind i: else if ($stmt = $mysqli->prepare('INSERT INTO `topics` (`topic_subject`, `topic_date`, `topic_cat`, `topic_by`) VALUES (?, NOW(), ?, ?)')) { echo ' kat efter: ' . $topic_cat . ' <br />'; /* Bind parametre */ $stmt->bind_param('sii', $topic_subject, $topic_cat , $id); $stmt->execute(); echo '<br />Succesfuldt ind i topics<br />'; echo '<br /><br />topicsub: ' . $topic_subject . ' cat: ' . $topic_cat . ' Id: ' . $id; $stmt->close(); } else { /* Der er opstået en fejl */ echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error; } Så bliver der udpostet en cat: 0 Jeg kan ikke helt gennemskue, hvad jeg har gjort forkert? :)
03. marts 2012 - 15:39
#7
Øhm, heller ikke .... men hvor får $topic_cat en værdi?
03. marts 2012 - 15:55
#8
Den får værdien her: echo "<select class='select' name='topic_cat'>"; /* Hent rækker og udskriv data */ while ($stmt->fetch()) { echo "<option class='optionnyheder' value='" . $cat_id . "'>" . $cat_name . "</option>"; Hvor der bliver hentet 5 kategorier fra databasen, og så vælger man så en kategorierne ud $cat_name, men value er $cat_id Så når jeg har postet formen, så tager jeg topic_cat ud fra name i select: $topic_cat=$_POST['topic_cat']; $mysqli->real_escape_string(topic_cat); Sådan henter jeg værdien. Værdien skifter også rigtigt ud fra hvilke kategori der er valgt, når jeg poster den med echo ud i browseren, men værdien skifter til 0 indeni else if ($stmt = $mysqli->prepare('INSERT INTO `topics` (`topic_subject`, `topic_date`, `topic_cat`, `topic_by`) VALUES (?, NOW(), ?, ?)')) { echo ' kat efter: ' . $topic_cat . ' <br />'; /* Bind parametre */ $stmt->bind_param('sii', $topic_subject, $topic_cat , $id); $stmt->execute(); echo '<br />Succesfuldt ind i topics<br />'; echo '<br /><br />topicsub: ' . $topic_subject . ' cat: ' . $topic_cat . ' Id: ' . $id; $stmt->close(); } else { /* Der er opstået en fejl */ echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error; }
03. marts 2012 - 16:01
#9
<ole>
mysqli_real_escape_
string hedder funktionen *o)
Der er ingen grund til at escape værdier. Det er jo det, der er fordelen ved at bruge prepared statements. Databasen foretager selv den fornødne escaping.
Hvis du i stedet prøvede at skrive variablen ud med:
var_dump($topic_cat);
- ville du sikkert se, at der er tale om en streng. Så duer det ikke at fortælle databasen, det er en integer - eller forsøge at sætte den ind i f.eks. et INT-felt.
Langt bedre ville det være at skrive:
$topic_cat = (int) $_POST['topic_cat'];
Så er indholdet af variablen casted som integer.
/mvh
</bole>
03. marts 2012 - 16:07
#10
- og så burde jeg jo nok have skrevet: "Det er jo det, der er en af fordelene ved at bruge prepared statements." . Der er selvfølgelig flere =)
03. marts 2012 - 16:17
#11
Tak for dit svar Ole :) Det er rettet nu- det gav selvfølgelig ingen mening, det jeg gjorde.. Men problemet er skam det samme.. $topic_cat = (int) $_POST['topic_cat']; echo ' før kat: ' . $topic_cat. ' <br />'; Udskriver: før kat: 1 else if ($stmt = $mysqli->prepare('INSERT INTO `topics` (`topic_subject`, `topic_date`, `topic_cat`, `topic_by`) VALUES (?, NOW(), ?, ?)')) { echo ' efter kat: ' . $topic_cat. ' <br />'; $stmt->bind_param('sii', $topic_subject, $topic_cat , $id); $stmt->execute(); echo '<br />Succesfuldt ind i topics<br />'; /* Luk statement */ $stmt->close(); } else { /* Der er opstået en fejl */ echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error; } Udskriver: efter kat: 0
03. marts 2012 - 16:33
#12
Det kan ikke passe, at variablen skifter værdi, når du opretter et statement - hvor du end ikke har brugt variablen til noget. Fejlen ligger i noget kode, du ikke viser =)
03. marts 2012 - 16:41
#13
Jeg siger tak for hjælpen :) else if ($topic_cat = "") { echo "Du mangler at angive en kategori"; include 'footer.php'; exit; } else if ($topic_cat = 0) { echo "Du mangler at angive en kategori"; include 'footer.php'; exit; } Det kunne den ikke lide :)
03. marts 2012 - 16:49
#14
Hehe ... nej en sammenligning forgår med mindst
to lighedstegn:
else if ($topic_cat == "") { echo "Du mangler at angive en kategori"; include 'footer.php'; exit; } else if ($topic_cat == 0) { echo "Du mangler at angive en kategori"; include 'footer.php'; exit; }
- ellers sætter du i stedet variablen til værdien, du ønskede at sammenligne den med *o)
Læg selv et svar og accepter det, så tråden lukkes =)
03. marts 2012 - 17:26
#15
Aha, tak igen Ole :)
03. marts 2012 - 18:20
#16
Selvtak - og læg godt mærke til orderne:
"mindst to lighedstegn" !
Med to lighedstegn sammenligner du to værdier:
$var = '123'; if ($var == '123') // opfyldt if ($var == 123) // opfyldt
Med tre lighedstegn sammenligner du både værdierne og typerne:
$var = '123'; if ($var === '123') // opfyldt if ($var === 123) // ikke opfyldt
Læs evt. om
sammenligningsoperatorer her
03. marts 2012 - 18:28
#17
For nu at gøre forvirringen komplet: 1) Man kan bruge = i en if eller while, hvis man mener man både vil lave en tilordning, og sammenligne på samme tid: while ($row = ....) 2) Der er sprog, hvor sammenligning i en if og while netop er et enkelt = fx Basic og Pascal
03. marts 2012 - 18:56
#18
Med hensyn til #1 bruges = ikke som sammenligning, men som tilordning. While er det, som får udtrykket til at ligne en sammenligning - mens konstruktionen i virkeligheden siger: "Sålænge tilordningen lykkes, så ..." *o) Men på den anden side ... uden pindebrænde kan det være vanskeligt at tænde op i noget *D
03. marts 2012 - 19:09
#19
Tilordningen lykkes vel altid. Det er mere om den værdi, der.tilordnes vil blive opfattet som sand eller falsk. Insekterotik.
03. marts 2012 - 19:24
#20
Nuvel ... de fleste behov ændres jo med alderen =)
Vi tilbyder markedets bedste kurser inden for webudvikling