Autor Zpráva
Pumpa
Profil *
Zdar,
mám malý problém. Na netu jsem narazil na takové počítadlo, které pracuje pomocí DB. Avšak již při tvorbě tabulky tímto kódem to hodí chybu:

CREATE TABLE `pocitadlo` (
`ip` varchar(19) NOT NULL DEFAULT '',
`datum` date NOT NULL DEFAULT '0000–00–00',
`cas` int(10) NOT NULL DEFAULT '0',
KEY `datum` (`datum`)
) TYPE=MyISAM;


#1067 – Invalid default value for 'datum' 


Zdrojový kód scriptu:

<?php
function pocitadlo()
{
# funkce zjisti, jestli je dnes v tabulce navstevnik a podle toho ho bud vlozi, nebo mu zmeni cas navstevy na aktualni

$ip = getenv("REMOTE_ADDR"); //zjistime IP

#zjistime, jestli se IP dnes nachazi v tabulce
$dotaz = mysql_query("SELECT * FROM pocitadlo WHERE datum=NOW() AND ip='$ip'");

#jestli tam je, tak zmenime cas navstevy (kvuli online uzivatelum)
if (mysql_num_rows($dotaz))
$dotaz2 = mysql_query("UPDATE pocitadlo SET cas='".time()."' WHERE datum=NOW() AND ip='$ip'");
else #pokud neni, tak IP vlozime
$dotaz2 = mysql_query("INSERT INTO pocitadlo (ip, datum, cas) VALUES('$ip',NOW(),'".time()."');");
}
function navstevy()
{
#funkce vraci pole s poctem navstev
$navstevnici = array();
#vybereme pocet vsech ulozenych IP adres
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo");
#vlozime hodnotu do pole
list($navstevnici['celkem'])=mysql_fetch_array($dotaz);

#vybereme pocet unikatnich dennich IP adres pro dnesni den
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW()");
#vlozime hodnotu do pole
list($navstevnici['dnes'])=mysql_fetch_array($dotaz);

#vybereme dnesni IP, ktere nejsou starsi nez 180 sekund = 3 minuty
$dotaz = mysql_query("SELECT count(*) FROM pocitadlo WHERE datum=NOW() AND cas>='".(time()-180)."'");
#vlozime hodnotu do pole
list($navstevnici['online'])=mysql_fetch_array($dotaz);

# vratime pole
# $navstevnici['celkem'] = pocet navstev celkem
# $navstevnici['dnes'] = pocet navstev za dnesni den
# $navstevnici['online'] = pocet navstev, ktere nejsou starsi jak 3 minuty
return $navstevnici;
}
#pripojime se k databazi

#zavolame pocitadlo
pocitadlo();
#vytvorime pole s pristupy
$navstevnici = navstevy();

#pole $navstevnici vypiseme
echo "ONLINE: $navstevnici[online]<br>
DNES: $navstevnici[dnes]<br>
CELKEM: $navstevnici[celkem]<br>";
?>




Zkoušel jsem tam dát PRIMARY KEY, a ještě jiné fígle, ale pořád to nefunguje. Mohl by někdo pomoci?
Joker
Profil
Pumpa
#1067 – Invalid default value for 'datum'
Stačí si to přeložit: sloupec datum má neplatnou výchozí hodnotu, tj. hodnota '0000-00-00' nemůže být výchozí hodnotou pro sloupec datum.
Pumpa
Profil *
Aha... a nevíš, jakou hodnotu tam dát, aby to fachčilo? Teprve s MySQL začínám a pár věcí mi ještě není jasných.
Pumpa
Profil *
Poradí mi někdo prosím?
Alphard
Profil
Stačí si to přeložit: sloupec datum má neplatnou výchozí hodnotu, tj. hodnota '0000-00-00' nemůže být výchozí hodnotou pro sloupec datum.
:-) mně to jde, zkus si to

takže, jak jsem napsal, když mi to funguje, tak to nemohu vyzkoušet, takže jen pár nápadů
MySQL also allows you to store '0000-00-00' as a “dummy date” (if you are not using the NO_ZERO_DATE SQL mode). This is in some cases more convenient (and uses less data and index space) than using NULL values.
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html

The special date '0000-00-00' can be stored and retrieved as '0000-00-00'. When using a '0000-00-00' date through MyODBC, it is automatically converted to NULL in MyODBC 2.50.12 and above, because ODBC can't handle this kind of date.
http://dev.mysql.com/doc/refman/5.0/en/using-date.html

to jsem rychlosti našel, kdyžtak počkej na jiné rady a taky trochu hledej sám
Pumpa
Profil *
Zkoušel jsem vše, ale nefunguje. Co tohle?

http://www.pcsvet.cz/art/article.php?id=3416 - není dostupné, použil jsem archiv Google. V tamním fóru si neví rady.



Tabulka pro ukládání informací o celkové návštěvnosti:

create table Celkem (
Pocet int null
);

Tabulka o měsíční návštěvnosti:

create table Mesicni (
Mesic varchar(10) not null,
Pocet int null,
PRIMARY KEY(Mesic)
);

Tabulka pro ukládání denní návštěvnosti:

create table Dnes (
Datum date not null,
Pocet int null,
PRIMARY KEY(Datum)
);

Tabulka pro ukládání počtu návštěv na IP Adresu:

create table Host (
IP varchar(20) not null,
Datum date null,
Pocet int null,
PRIMARY KEY(IP)
);





<?php
$spojeni = MySQL_Connect("SERVR", "DATABAZE", "HESLO");
MySQL_Select_DB("databáze");


$ipadresa = $REMOTE_ADDR;
// proměnná obsahující IP adresu návštěvníka
$dnesnidatum = Date("Y-m-d");
// proměnná obsahující dnešní datum v potřebném formátu
$mesic = Date("m");
SetType($mesic, "integer");
// deklarace proměnné, obsahující číslo měsíce a přetypování na integer
$rok = Array(1=>"Leden","Únor","Březen","Duben","Květen","Červen","Červenec", "Srpen","Září","Říjen","Listopad","Prosinec");
// pole obsahující názvy měsíců
$result = Array();
// pole výsledků
$counter = Array();
// pole obsahující zpočítaná data
$month = $rok[$mesic];
// název aktuálního měsíce


$result[0] = MySQL_Query("SELECT * FROM Host WHERE IP='".$ipadresa."'");
$host = MySQL_Fetch_Object($result[0]);
$poslednipristup = $host->Datum;
// zjistíme, zda již IP adresa v tabulce je:
if ($poslednipristup==""):
    $pocitat=true;
    MySQL_Query("INSERT INTO Host VALUES('".$ipadresa."', '".$dnesnidatum."',1)");
    // pokud ne, vložíme ji
else:
    // zjistíme, zdali návštěvník ten samý den nebyl na stránce
    if ($poslednipristup!=$dnesnidatum):
        $pocitat = true;
        MySQL_Query("UPDATE Host SET Datum = '".$dnesnidatum."', Pocet = Pocet+1 WHERE IP = '".$ipadresa."'");
        // pokud ne, připočteme návštěvu IP adrese a uložíme aktuální datum
    else:
        $pocitat=false;
        MySQL_Query("UPDATE Host SET Pocet = Pocet+1 WHERE IP = '".$ipadresa."'");
        // jinak připočteme návštěvu IP adrese a nepočítáme jiné přístupy
    endif;
endif;


if ($pocitat):
    // zjistíme, zdali máme počítat
    $result[1] = MySQL_Query("SELECT * FROM Celkem");
    if (MySQL_Num_Rows($result[1])!=0):
        $counter[0] = MySQL_Result($result[1],0)+1;
        MySQL_Query("UPDATE Celkem SET Pocet = Pocet+1");
    else:
        $counter[0] = 1;
        MySQL_Query("INSERT INTO Celkem VALUES(1)");
    endif;
    $result[2] = MySQL_Query("SELECT * FROM Mesicni WHERE Mesic = '$month'");
    $aktmesic = MySQL_Fetch_Object($result[2]);
    $counter[1] = $aktmesic->Pocet+1;
    if ($counter[1]==1):
        MySQL_Query("INSERT INTO Mesicni VALUES('$month',1)");
    else:
        MySQL_Query("UPDATE Mesicni SET Pocet = Pocet+1 WHERE Mesic = '$month'");
    endif;
    $result[3] = MYSQL_Query("SELECT * FROM Dnes WHERE Datum='$dnesnidatum'");
    $zaznam = MySQL_Fetch_Object($result[3]);
    $counter[2] = $zaznam->Pocet+1;
    if ($counter[2] == 1):
        MySQL_Query("INSERT INTO Dnes VALUES ('$dnesnidatum', 1)");
    else:
        MySQL_Query("UPDATE Dnes SET Pocet = Pocet+1 WHERE Datum = '$dnesnidatum'");
    endif;
    // pokud ano, připočteme všem hodnotám jednu a vrátíme výsledky v poli $counter
else:
    $result[4] = MySQL_Query("SELECT * FROM Celkem");
    $counter[0] = MySQL_Result($result[4],0);
    $result[5] = MySQL_Query("SELECT * FROM Mesicni WHERE Mesic = '$month'");
    $tentom = MySQL_Fetch_Object($result[5]);
    $counter[1] = $tentom->Pocet;
    $result[6] = MYSQL_Query("SELECT * FROM Dnes WHERE Datum='$dnesnidatum'");
    $dnes = MySQL_Fetch_Object($result[6]);
    $counter[2] = $dnes->Pocet;
     // jinak jen načteme všechny hodnoty do pole $counter
endif;


$result[7] = MySQL_Query("SELECT * FROM Host WHERE IP = '".$ipadresa."'");
$counter[3] = MySQL_Result($result[7],0,2);
echo "Celkem: ".$counter[0]."<br>";
echo $month.": ".$counter[1]."<br>";
echo "Dnes: ".$counter[2]."<br>";
echo "IP: ".$counter[3]."
";

?>
Pumpa
Profil *
Tenhle skript bohužel taky nefunguje. Hlásí to spostu chyb:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/free/ic.cz/a/xxxroot/www/xxx.php on line 46
 
 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/free/ic.cz/a/xxxroot/www/xxx.php on line 70
 
 Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/free/ic.cz/a/xxx/root/www/xxx.php on line 78
 
 Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/free/ic.cz/a/xxx/root/www/xxx.php on line 86
 
 Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/free/ic.cz/a/xxx/root/www/xxx.php on line 108

Alphard
Profil
chyba je v dotazu na databázi, vypíšeš ji pomocí echo mysql_error();
autor předpokládá nastavení register globals on, na to bych také nevsázel

zkus u toho prvního:
místo řádku
`datum` date NOT NULL DEFAULT '0000–00–00',
použít
`datum` date DEFAULT '0000–00–00',
nebo jen
`datum` date,

a uvidí se, nevím, nečetl jsem jsem celý kód
Pumpa
Profil *
OK. Poslední možnost funguje - ale pak to vypíše:

ONLINE: 0
DNES: 0
CELKEM: 1

co to má znamenat?
Pumpa
Profil *
A při každym reloadu se celkem zvýší o 1 ale ostatní jsou na nule.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0