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"?(IMG:
style_emoticons/default/questionmark.gif)
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