Avatar billede Morten Professor
05. november 2015 - 21:33 Der er 13 kommentarer og
1 løsning

Mysqli besøgstæller meget simpel prøver jeg til at starte med.

Hej Eksperter

Jeg prøver at lege noget mere med mysqli, og derfor prøver jeg lidt ting af.
Jeg kan ikke forstå hvorfor min kode ikke virker:

/* Opret et prepared statement */
if ($stmt = $hellestrik->prepare('INSERT INTO `tbl_besogstaeller` (`ip`, `hits`, `besoeg`, `datetime`) VALUES (?, ?, ?, ?)')) {

    /* Bind parametre */
    $stmt->bind_param('ssi', $ip, $hits, $besoeg, $datetime);

    /* Sæt værdier på parametrene */
    $ip = $_GET['privat'];
    $hits = 1;
    $besoeg = 1;
    $datetime = date('Y-m-d H:i:s');
    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */
   
    /* Hent rækker og udskriv data */
    while ($stmt->fetch()) {
          echo $ip;
    }

} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $hellestrik->error;
}
Avatar billede Morten Professor
05. november 2015 - 21:34 #1
Den sidder det ikke ind i databasen, har gjort som jeg har gjort ved andre ting der virker fint og kommer ind i databasen.

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
05. november 2015 - 21:56 #2
ved første øjekast, her mangler en variabel type, kan være flere fejl
$stmt->bind_param('ssi', $ip, $hits, $besoeg, $datetime);

hvad datatype er 
$ip ??
$hits ?? 
$besoeg ??
$datetime ??

du har sat
$ip til at vlre en string (OK)
$hits til at være en string (jeg forvendter heltal)
$besoeg til at være et heltal
$datetime til at være ?????? mangler skulle vel være en string

uden at have set dine data vil jeg gætte på du skal anvende denne bind_param
$stmt->bind_param('siis', $ip, $hits, $besoeg, $datetime);

da ip er med punktummer imellem tallene, og hits og besøg forvendter jeg er heltal, samt datetime er der bindestring og collon i
Avatar billede olsensweb.dk Ekspert
05. november 2015 - 22:04 #3
dette vil aldrig virke:
/* Hent rækker og udskriv data */
while ($stmt->fetch()) {
      echo $ip;
}

du har ikke selected noget der kan fetch()

skal vel se sådan ud
(utested)
/* Opret et prepared statement */
if ($stmt = $hellestrik->prepare('INSERT INTO `tbl_besogstaeller` (`ip`, `hits`, `besoeg`, `datetime`) VALUES (?, ?, ?, ?)')) {
    /* Bind parametre */
    $stmt->bind_param('siis', $ip, $hits, $besoeg, $datetime);

    /* Sæt værdier på parametrene */
    $ip = $_GET['privat'];
    $hits = 1;
    $besoeg = 1;
    $datetime = date('Y-m-d H:i:s');
    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */   
    $stmt->close();
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $hellestrik->error;
}

kontroller ved at se i databasen om de kommer ind
Avatar billede Morten Professor
05. november 2015 - 22:15 #4
Så virker det med siis.

Kan du lære mig hvordan jeg kan se hvad jeg skal bruge du ved det med "ssi" "siis" "i" "ii"
Jeg har vist ikke helt forstået betydningen.
Avatar billede Morten Professor
05. november 2015 - 22:22 #5
Hvis jeg forstår ret står "s" for flere tal / tekst
"i" hvis det er et helt tal.
Kunne jeg forstå ud fra det du skrev.

Så hvis jeg har et hele tal vil det være "i"
og hvis jeg har flere ting altså så som bogstaver og . og hvad det nu eller skal være i en sætning vil det være "s"
Avatar billede olsensweb.dk Ekspert
05. november 2015 - 22:48 #6
>Kan du lære mig hvordan jeg kan se hvad jeg skal bruge du ved det med "ssi" "siis" "i" "ii"
>Jeg har vist ikke helt forstået betydningen.

regl 1: antallet af ? i din sql,  skal passe med antallet af datatyper, og variable bind_param

datatyper kan være:
citat http://www.eksperten.dk/guide/1480
*)  s: string
*)  i: integer
*)  d: double
*)  b: blob (binære data, sendt som pakker)

se i database feltet hvad du har defineret collonnen til
i: bruges til heltal (eks 47)

d: bruges til float, double (alt tal med komma eks 47.5)

b: hvis man feks indsætter et billed  i databasen  (ikke url til billed), jeg har aldrig skulle bruge det.

s: alt andet,
eks en ip addresse 62.44.135.217, du kan se der er punktummer i mellem altså han det ikke være heltal, da dette ikke tillader punktummer, kunnne det være double? nej der er for mange punktummer

dato 2015-11-05 23:00 her er der binde stringer imellem og også collon, hvis du prøver at indsætte det som heltal vil den lave regnestykket (2015 minus 11 minus 05) og sikkert bare ignorer det efterfølgende

text er også bare en string; eks "hej med dig, læs guiden af olebole igen"
Avatar billede Morten Professor
05. november 2015 - 22:50 #7
Jeg har så her udvidet den lidt, men syntes ikke det virker efter hensigten.
/* Opret et prepared statement */
if ($stmt = $hellestrik->prepare('INSERT INTO `tbl_besogstaeller` (`ip`, `hits`, `besoeg`, `datetime`) VALUES (?, ?, ?, ?)')) {
    /* Bind parametre */
    $stmt->bind_param('siis', $ip, $hits, $besoeg, $datetime);

    /* Sæt værdier på parametrene */
    $ip = $_GET['privat'];
    $hits = 1;
    $besoeg = 1;
    $datetime = date('Y-m-d H:i:s');
    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */   
   

}
else if ($ip = $_GET['privat'])

{/* Update et prepared statement */
if ($stmt = $hellestrik->prepare('UPDATE `tbl_besogstaeller` SET `hits`=? WHERE `ip`= '.$_GET['privat'])) {

    /* Bind parametre */
    $stmt->bind_param('i', $hits);

    /* Sæt værdier på parametrene */
    $hits = +1;

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */
    $stmt->close();
   
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $hellestrik->error;
}}
Avatar billede Morten Professor
05. november 2015 - 22:53 #8
1000 tak for den gode beskrivelse, for en ikke så god til at forstå helt hvad der står nogen steder :o)

Du er simpelhen en gutter mand
Avatar billede Morten Professor
05. november 2015 - 22:55 #9
Jeg ved godt det er en udvidelse af mit spørgsmål men tænkte det var under det samme.
Ellers skal jeg nok oprette et mere.
For du skal have dine point for det du hjælper med.
Avatar billede olsensweb.dk Ekspert
05. november 2015 - 23:07 #10
#7
du vil aldrig komme i din else medmindre din insert fejler, så har du en database fejl.

du er nød til at teste om din ip findes

Pseudocode
   
findes min IP addresse i listen ??
hvis nej insert
hvis ja update besøgs tæller



Pseudocode
   
$status = besogstaeller_IsIpCreated($conn, $ip); // retunerer 0 hvis ikke oprettet, og eller retuneres 1
if($status==0){
    besogstaeller_Create($conn, $ip);
}
else{
    besogstaeller_Update($conn, $ip);
}

så det er bare 3 små functioner

besogstaeller_IsIpCreated det er noget select
besogstaeller_Create det er noget insert
besogstaeller_Update det er noget udate
Avatar billede Morten Professor
06. november 2015 - 09:07 #11
Hej Ronols

Mange tak, jeg vil prøve det.

Vil du smide et svar, du har gjort mere end hvad jeg startede med at spørge om.

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
06. november 2015 - 11:34 #12
får du her
Avatar billede Morten Professor
06. november 2015 - 19:56 #13
Her får i lige en simpel counter:

<?php
/* Select et prepared statement */
if ($stmt = $hellestrik->prepare('SELECT ip, hits, besoeg, `datetime` FROM `tbl_besogstaeller` WHERE ip = ?')) {

    /* Bind parametre */
    $stmt->bind_param('s', $ip);

    /* Sæt værdier på parametrene */
    $ip = $_GET['privat'];

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Bind resultatet */
    $stmt->bind_result($ip, $hits, $besoeg, $datetime);

    /* Hent rækker og udskriv data */
    while ($stmt->fetch()) {
    echo $ip;
    echo $hits;}
   
    if ($ip <= NULL ){
/* Opret et prepared statement */
if ($stmt = $hellestrik->prepare('INSERT INTO `tbl_besogstaeller` (ip, hits, besoeg, `datetime`) VALUES (?, ?, ?, ?)')) {

    /* Bind parametre */
    $stmt->bind_param('siis', $ip, $hits, $besoeg, $datetime);

    /* Sæt værdier på parametrene */
    $ip = $_GET['privat'];
    $hits = 1;
    $besoeg = 1;
    $datetime = date('Y-m-d H:i:s');
    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */

}}}
    if ($hits >= 0){
    {
        if ($stmt = $hellestrik->prepare('UPDATE `tbl_besogstaeller` SET `hits`=? WHERE `ip`= 61')) {

    /* Bind parametre */
    $stmt->bind_param('i', $hits);

    /* Sæt værdier på parametrene */
    $hits = $hits+1;

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Luk statement */
   

} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $hellestrik->error;
}
    }};
?>
Avatar billede Morten Professor
06. november 2015 - 20:30 #14
Så bort fra mit indlæg det virkede kun localhost
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
Computerworld tilbyder specialiserede kurser i database-management

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