Curs Php-mysql

In acest tutorial este prezentat un script PHP pentru inregistrarea vizitatorilor unui site.
Pe langa IP va fi inregistrat si numarul de vizite a fiecaruia precum si data ultimei accesari.
Scriptul va fi in doua variante, prima, mai usoara, in care datele sunt inregistrate intr-un fisier TXT pe server, iar in a doua varianta se foloseste ca mediu de stocare un tabel MySQL.

1. Inregistrare IP-uri intr-un fisier pe server

Pentru ca modulul PHP sa poata inregistra date intr-un fisier pe server trebuie sa aibe drepturi de scriere in acel fisier (aici va fi folosit cu numele "ipuri.txt"), cu CHMOD 0755 sau 0777.
Urmatorul script inregistreaza in fisierul "ipuri.txt" IP-ul fiecarui vizitator, numarul de vizite si data ultimei vizite (in format UNIX), separate prin caracterul "^" si fiecare IP cu aceste date pe cate un rand (Alte explicatii sunt in cod).

Cod-ul scriptului

<?php
$fisier = 'ipuri.txt';         // Fisierul in care sunt stocate datele
$randuri = array();         // Variabila in care sunt preluate datele
$sep = '^';         // Separatorul datelor ip, vizite si data
$ip = $_SERVER['REMOTE_ADDR'];         // Preia ip-ul crent

// Construeste un Array cu datele ce trebuie adaugate pt. rand nou (ip, nr_vizite, data_ultima)
$rand = array($ip, 1, time());

// Verifica daca fisierul txt exista
if(file_exists($fisier)) {
    // Preia randurile din fisier, cu parametri pt. eliminare caractere de rand nou si spatii exterioare de pe fiecare rand
    $randuri=file($fisier, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $nr_r = count($randuri);         // Numar randuri

    // Parcurge randurile poreluate
    // Separa intr-un Array (cu "explode()") datele din fiecare rand si verifica daca ip-ul curent e deja inregistrat
    for($i=0; $i<$nr_r; $i++) {
        $rand_ip = explode($sep, $randuri[$i]);

        // Daca ip-ul exista deja, redefineste $rand incrementand nr. vizitari si modificand timpul ultimei accesari
        if($ip == $rand_ip[0]) {
            $rand = array($ip, ($rand_ip[1]+1), time());
            break;         // Opreste parcurgerea, astfel se retine si valoarea lui $i cu indicele pt. rand
        }
    }

    $randuri[$i] = implode($sep, $rand);         // Adauga / Actualizeaza randul cu ip-ul curent (la randul unde a ajuns $i)
    $ad_randuri = implode("\n", $randuri);         // Include intr-un sir toate randurile ce trebuie readaugate

    // Scrie acest sir in fisier, in caz de esec afiseaza mesaj
    if(!file_put_contents($fisier, $ad_randuri)) echo 'IP-ul nu poate fi adaugat in'. $fisier;

    // Afiseaza ip-ul curent, nr. vizitari si data ultimei vizite (cu datele aflte in matricea $rand)
    echo '<br />IP: '. $rand[0]. '<br />Nr. vizite: '. $rand[1]. '<br />Data ultimei vizite: '. date('j-M-Y, H:i', $rand[2]);
}
else echo 'Fisierul '. $fisier. ' nu exista.';
?>
- Inainte de a folosi scriptul, creati fisierul "fisier.txt" pe server (in acelasi loc cu scriptul PHP) si acordati permisiunile CHMOD de scriere.

2. Inregistrare IP-uri in tabel MySQL

In cazul unui volum mai mare de date (mii de randuri) este indicat ca acestea sa fie stocate intr-o baza de date (aici MySQL).
In continuare e prezentata o alta versiune a scriptului de mai sus, aceasta salveaza aceleasi tipuri de date, dar intr-un tabel MySQL (aici denumit "ipuri").
Sunt necesare 3 fisiere:

- Iata codul PHP pentru fiecare fisier:

Cod conn.php

<?php
// Datele pt. conectare la serverul si baza de date MySQL
$host = 'localhost';         // Serverul MySQL
$utilizator = 'user';         // Utilizator pt. server
$parola = 'pass';         // Parola utilizator
$numebd = 'nume_bd';         // Numele bazei de date

// Conectarea la server
$conn = mysql_connect($host, $utilizator, $parola);
if (!$conn) { echo '<h4>Conectare nereusita la MySQL</h4>'; }

// Selectarea bazei de date
if (!mysql_select_db($numebd, $conn)) { echo '<h4>Baza de date nu a putut fi selectata deoarece : '. mysql_errno(). ' : '. mysql_error().'</h4>'; }

mysql_set_charset('utf8', $conn);         // Setarea pt. lucru cu format UTF-8
?>

Cod make_table.php

<?php
include('conn.php');         // Include fisierul pt. conectare-selectare baza de date

// Creaza tabelul ipuri, avand coloanele ip, vizite, si data (cu 'ip' PRIMARY KEY)
$sql = "CREATE TABLE `ipuri` (ip VARCHAR(15) PRIMARY KEY, vizite DECIMAL(6,0) DEFAULT 1, data DECIMAL(10,0)) CHARACTER SET utf8 COLLATE utf8_general_ci";
if (mysql_query($sql, $conn)) echo '<h4>Tabelul <u>ipuri</u> a fost creat.</h4>';
else echo 'h4>Tabelul <u>ipuri</u> nu a putut fi creat deoarece - '. mysql_errno(). ' : '. mysql_error(). '</h4>';

mysql_close($conn);
?>

Cod ipuri.php

<?php
include('conn.php');         // Include fisierul pt. conectare-selectare baza de date

$ip = $_SERVER['REMOTE_ADDR'];         // Preia ip-ul curent

// Comanda SQL pt. adagare ip nou in tabel sau update daca deja exista (cu actualizare data si incrementare vizite)
$sql = "INSERT INTO `ipuri` (ip, data) VALUES ('$ip', ".time().") ON DUPLICATE KEY UPDATE `vizite`=`vizite`+1";
if (!mysql_query($sql, $conn)) echo 'IP-ul nu poate fi adaugat in tabel '.mysql_error();

// Interogarea SQL pt. selectarea randului cu ip-ul curent
$sql2 = "SELECT * FROM `ipuri` WHERE `ip`='$ip' LIMIT 1";
if ($rezult = mysql_query($sql2, $conn)) {
    if (mysql_num_rows($rezult)==0) { echo '0 rezultate'; }
    else { $rand = mysql_fetch_array($rezult, MYSQL_NUM); }
}
mysql_close($conn);

// Afiseaza ip-ul curent, nr. vizitari si data ultimei vizite
echo '<br />IP: '. $rand[0]. '<br />Nr. vizite: '. $rand[1]. '<br />Data ultimei vizite: '. date('j-M-Y, H:i', $rand[2]);
?>

- Prima data se creaza cele 3 fisiere PHP ce au codul prezentat mai sus (toate in ascelasi director), si se definesc datele pentru conectare la MySQL si numele bazei de date in fisierul "conn.php".
- Urmatorul pas este crearea tabelului "ipuri" prin apelarea din browser a fisierului "make_table.php" (De ex.: http://localhost/make_table.php).
- Acum scriptul e functional. De fiecare data cand e accesat "ipuri.php", scriptul preia IP-ul vizitatorului curent, daca acest IP nu e deja in tabelul MySQL il adauga, cu numar vizite 1 (default la coloana "vizite") si timpul curent. Daca e deja inregistrat in tabel, ii face update, marind numar vizite cu o unitate si la data pune timpul curent. Toate intr-o singura interogare SQL.
- Ca sa afiseze date despre IP-ul curent, se face un SELECT in tabel, dupa randul cu acest IP, apoi, cu datele stocate intr-un Array ("$rand") le preia si afiseaza.

Un Test simplu in fiecare zi

HTML
CSS
JavaScript
PHP-MySQL
Engleza
Spaniola
Care tag defineste zona de click intr-o harta creata dintr-o imagine?
<map> <img> <area>
<img src="image.jpg" usemap="#map1">
<map name="map1">
  <area shape="rect" coords="9, 120, 56, 149" href="#">
  <area shape="rect" coords="100, 200, 156, 249" href="#">
</map>
Ce proprietate CSS indica ce sa se intample cand continutul unui element depaseste dimensiunile lui?
display overflow position
#id {
  overflow: auto;
}
Clic pe evenimentul care este declansat cand mouse-ul e deasupra unui obiect.
onclick onmouseover onmouseout
document.getElementById("id").onmouseover = function(){
  document.write("Sa ai Viata Buna");
}
Indicati variabila PHP ce contine datele adaugate in adresa URL, dupa caracterul "?".
$_SESSION $_GET $_POST
if(isset($_GET["id"])) {
  echo $_GET["id"];
}
Clic pe pronumele reflexiv care e potrivit in propozitia: "Marc is the boy ... won the prize".
who which whoever
Marc is the boy who won the prize.
- Marc e baiatul care a castigat premiul.
Clic pe pronumele reflexiv care e potrivit in propozitia: "Voy a ver al pintor de ... les hablé ayer".
que quien cuyo
Voy a ver al pintor de quien les hablé ayer.
- Ma duc sa vad pictorul despre care ti-am vorbit ieri.
Inregistrare IP-uri in fisier si tabel MySQL

Last accessed pages

  1. Lectia 150, Recapitulare 139-140 (23)
  2. Accentul si Pronuntia (26330)
  3. Verbele in limba engleza - Verbs (40068)
  4. Verbe frazale din limba Engleza (39381)
  5. Prezent perfect si Prezent perfect continuu - Present perfect and Continuous (89332)

Popular pages this month

  1. Cursuri si Tutoriale: Engleza, Spaniola, HTML, CSS, Php-Mysql, JavaScript, Ajax (618)
  2. Conditional IF in Limba Engleza - Fraze Conditionale (532)
  3. Gramatica limbii engleze - Prezentare Generala (439)
  4. Exercitii engleza - English Tests and exercises - Grammar (379)
  5. Coduri pt culori (362)