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 Computerworld it-jobbank
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