Witam,
Jaki czas temu udało mi się napisać skrypt, który aktualizował dwie tabele w bazie danych odnośnie monitorowania ściągnięć plików.
jedna tabela zbiera ilości ściągnięć danego pliku
druga historie wszystkich ściągnięć: czas z jakiego serwera itp.
Skrypt działał przez długo czas poprawnie ale niestety nagle przestał. oto ten skrypt:
<?php
$plik = $_GET['plik']; //pobiera nazwę pliku, który użytkownik chce pobrać
$baza_ip = '127.0.0.1'; //adres bazy danych
$baza_uzytkownik = 'nazwa'; //nazwa użytkownika bazy
$baza_haslo = 'haslo'; //hasło dla danego użytkownika bazy
$baza = 'baza'; //nazwa bazy glównej
$baza_zrodlo1 = 'dr_sciagnieteile'; //tabela, w której są zapisywane wpisy o ilości pobrań
$baza_zrodlo = 'dr_sciagnietekto' ;
$folder_z_plikami = 'sciezka/'; //tutaj będą znajdować się pliki do pobrania
//sprawdzam czy zmienna plik jest pusta, jeżeli jest pusta nie wywołuję
//dalej kodu tylko informuję o błędzie.
//sprawdzam czy zmienna plik jest pusta, jeżeli jest pusta nie wywołuję
//dalej kodu tylko informuję o błędzie.
//...
if ($plik != '')
{
//sprawdzam czy podany plik istnieje na serwerze
{
//jeżeli plik nie istnieje to nie wykonuję dalszych operacji tylko
//wyświetlam informację o błedzie
print "Podany plik: $plik nie istnieje"; }
else
{
/*
Powyższym kodem łączę się z bazą danych mySQL korzystając ze
stałych zdefiniowanych na początku skryptu. Znak małpy przed zmienną
$db konieczny jest ze względu na możliwość wystąpienia błędu, który jeżeli
i tak zaistnieje to i tak zostanie znaleziony za chwilę.
*/
if ($db) //sprawdzam czy zostaliśmy połączeni z bazą
{ //Jeżeli tak wykonujemy poniższe czynności
//sprawdzam czy w tabeli $baza_zrodlo istnieje nazwa naszego pliku
$result = mysql_query("SELECT * FROM $baza_zrodlo1 WHERE nazwapliku='$plik' "); //sprawdzam ile razy występił wpis o nazwie pliku w $plik
if($num >= 1) //jeżeli występuje jeden plik, lub więcej o tej nazwie to...
{
//...poberam do zmiennej $ile ilość pobrań danego pliku <- w tym miejscy
function IleRazyPobrano($plik, $baza, $baza_zrodlo1)
{
//wybieram bazę
//wysyłam zapytanie do bazy o liczbę ściągnięć
$ilerazy = mysql_query("SELECT iloscpobran FROM $baza_zrodlo1 WHERE nazwapliku = '$plik'"); //pobieram wynik w komórki, którą otrzymałem w zmiennej $ilerazy
//zwracam pierwszy wynik ponieważ zmienna $wynik jest typu array
return $wynik[0];
}
// korzystam ze skryptu "pobrano.php"
$ile = IleRazyPobrano($plik, $baza, $baza_zrodlo1);
$nowy = $ile+1; // dodaję jedno pobranie
//Tutaj rozpoczyna się już właściwie pobieranie pliku
header('Pragma: no-cache'); //ustawiamy: aby zawartość nie była cache'owana, header('Content-Transfer-Encoding: binary'); //zawartość wysyłanego pliku jest binarna, header('Content-type: application/xls'); //aplikacja odpowiedzialna za plik, header("Content-Disposition: attachment; filename=$plik"); //nazwa pliku,
//koniec części odpowieadającej za pobieranie
//wysyłam do bazy prośbę o uaktualnienie wpisu ilości pobrań
$czas=date("Y.m.d - G:i:s, D");//'{$_SERVER['REMOTE_ADDR']}', '$hostname', '$plik' , '{$_SERVER["HTTP_REFERER"]}', '{$_SERVER["HTTP_USER_AGENT"]}' $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
mysql_query("Insert INTO $baza_zrodlo VALUES ('', '$czas')"); mysql_query("update $baza_zrodlo1 set iloscpobran=$nowy where nazwapliku='$plik'");
// wysyłanie mail' z info o sciagnieciu
if ($plik == "konkretny_plik.pdf") {
$tresc = "Sciagnieto Twoj abstrakt \"{$plik}\" .\r\n\r\nCzas: ".$czas."\r\nHost: ".$hostname." (".$_SERVER['REMOTE_ADDR'].")\r\nZ łącza: ".$_SERVER["HTTP_REFERER"]."\r\npo raz:".$nowy."\r\n ";
mail( "adres@tlen.pl", "OD", $tresc, "From: tytuł<adres@tlen.pl>\r\n" ); }
}
else // jeżeli nie znaleziono pliku w tabeli o tej nazwie to...
{
//wysyłamy prośbę o dodanie pliku z wartością 1 ściągnięcia
mysql_query("insert into $baza_zrodlo1 values ('$plik', 1)"); $czas=date("Y.m.d - G:i:s, D"); $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
mysql_query("insert into $baza_zrodlo values ('', '$czas', '{$_SERVER['REMOTE_ADDR']}', '$hostname', '$plik' , '{$_SERVER["HTTP_REFERER
"]}', '{$_SERVER["HTTP_USER_AGENT
"]}')");
if ($plik == "konkretny_plik.pdf") {
$tresc = "Sciagnieto Twoj abstrakt \"{$plik}\" .\r\n\r\nCzas: ".$czas."\r\nHost: ".$hostname." (".$_SERVER['REMOTE_ADDR'].")\r\nZ łącza: ".$_SERVER["HTTP_REFERER"]."\r\npo raz:".$nowy."\r\n ";
mail( "adres@tlen.pl", "Doktoranci Info", $tresc, "From: tytuł<adres@tlen.pl>\r\n" ); }
//Poniższe wysyłanie jest identyczne jak w przypadku powyższym
header('Content-Transfer-Encoding: binary'); header('Content-type: application/xls'); //aplikacja odpowiedzialna za plik, header("Content-Disposition: attachment; filename=$plik"); //nazwa pliku, //koniec wysyłania
}
}
else
{
//jeżeli nie można połączyć się z bazą mySQL wyświetl komunikat o błędzie
print "Błąd: Nie mogę połączyć się z bazą danych"; }
}
}
else
{
//jeżeli zostały wysłane złe dane do skryptu wyświetl błąd
print "Błąd wywołania skryptu!!!"; }
?>
najdziwniejsze jest to, że jedna tabela z ilością ściągnięć cały czas jest aktualizowana. Problem jest z tą drugą.
nie zapisuję mi wartości do niej tak jakby komenda "insert" nie działała. nawet mail jest wysyłany.
przejrzałem historię i wynika z niej, że błąd prawdopodobnie pojawił się po zmianie z php4 na php5. Czy możliwe, żeby zmieniła się składnia komendy "insert"?
Uprawnienia użytkownika są ustawione na full za pomocą MYSQL Administrator. Ja już nie mam pomysłu.
co mogło się stać.
Bardzo proszę o pomoc.
dziękuję przepraszam jeśli jestem w złym dziale ale jestem tu nowy.
Ten post edytował Gregoire 20.05.2010, 15:17:37