Avatar billede Jakie Juniormester
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.
Avatar billede erikjacobsen Ekspert
03. marts 2012 - 13:28 #1
Du kan vel stadig bruge NOW() i SQL...?
Avatar billede Jakie Juniormester
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?
Avatar billede erikjacobsen Ekspert
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.
Avatar billede Jakie Juniormester
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? :)
Avatar billede erikjacobsen Ekspert
03. marts 2012 - 15:25 #5
Spørg løs...
Avatar billede Jakie Juniormester
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? :)
Avatar billede erikjacobsen Ekspert
03. marts 2012 - 15:39 #7
Øhm, heller ikke .... men hvor får $topic_cat en værdi?
Avatar billede Jakie Juniormester
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;
}
Avatar billede olebole Juniormester
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>
Avatar billede olebole Juniormester
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  =)
Avatar billede Jakie Juniormester
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
Avatar billede olebole Juniormester
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  =)
Avatar billede Jakie Juniormester
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 :)
Avatar billede olebole Juniormester
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  =)
Avatar billede Jakie Juniormester
03. marts 2012 - 17:26 #15
Aha, tak igen Ole :)
Avatar billede olebole Juniormester
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
Avatar billede erikjacobsen Ekspert
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
Avatar billede olebole Juniormester
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
Avatar billede erikjacobsen Ekspert
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.
Avatar billede olebole Juniormester
03. marts 2012 - 19:24 #20
Nuvel ... de fleste behov ændres jo med alderen  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester