Aranjare date selectate pe o saptamana sau luna

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
trif
Mesaje:500

Aranjare date selectate pe o saptamana sau luna

salut, am si eu o mica rugaminte, cum as putea sa fac un script ca sa imi extraga din baza de date resursele adaugate in ultima saptamana sau luna si apoi sa le trimit, dar sa fie grupate pe zile adica:

Cod: Selectaţi tot

08/05/2012
resursa1
resursa2
09/05/2012
resursa2
10/05/2012
nu au fost adaugate resurse
11/05/2012
resursa1
resursa2
resursa3
etc.
va rog, un pic de ajutor.
Astept raspuns, multumesc anticipat! cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Salut
La selectarea datelor dupa o anumita data-timp depinde formatul coloanei ce retine data.
Un exemplu, ca sa extragi inregistrarile din Martie in "col1" si sa le aranjezi cum ai specificat, se poate asa:

Cod: Selectaţi tot

$sql = "SELECT col1, DAYOFMONTH(col_data) AS zi FROM tabel
WHERE YEAR(col_data) = 2012 AND MONTH(col_data) = 3";
$result = mysql_query($sql);
if (mysql_errno()) {
  // daca e eroare
  echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($result) == 0) {
  echo '0 rezultate';
}
else {
  $regs = array();
  while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    // retine datele in array, cu index de la 'zi'
    $regs[$row['zi']][] = $row['col1'];
  }

  // parcurgere a zilelor dintr-o luna si adaugare rezultat in $res
  $res = '';
  for($i=1; $i<32; $i++) {
    $res .= $i. '/03/2012 <br/>';
    // daca exista inregistrare in ziua $i in $regs
    // parcurge array-ul cu inregistrarile din acea zi
    if(isset($regs[$i])) {
      for($i2=0; $i2<count($regs[$i]), $i2++) {
        $res .= $regs[$i][$i2]. '<br/>';
      }
    }
    else $res .= 'nu au fost adaugate resurse <br/>';
  }
 
 echo $res;
 
Ramane sa intelegi codul si sa-l adaptezi la ce ai.

Pentru saptamana se foloseste WEEK(data), returneaza numarul saptamanii, de la 0 la 53.

Sau, o alta modalitate de a selecta inegistrarile cuprinse intr-o anumita perioada, e sa folosesti asa la WHERE:

Cod: Selectaţi tot

WHERE `date` BETWEEN '2012-03-01' AND '2012-03-31' 
WHERE `date` BETWEEN '2012-03-01' AND CURRENT_DATE

trif Mesaje:500
salut, am modificat acest script asa cum imi trebuie mie dar nu imi face ce imi trebuie.
in primul rand vreau sa iti zic ca in bd am format asa

Cod: Selectaţi tot

2012-04-27 13:09:56
si cum as putea sa fac sa il schimb in asa

Cod: Selectaţi tot

27-04-2012 13:09:56
dar fara sa schimb in bd informatia doar sa imi schimba datele pe care le am eu acum.
in al doilea rand am facut asa:

Cod: Selectaţi tot

$sql = "SELECT *, DAYOFMONTH(data) AS zi FROM cantari_ppt
WHERE `data` BETWEEN '2012-04-27' AND CURRENT_DATE";
$result = mysql_query($sql);
$rand = mysql_fetch_array($result);
if (mysql_errno()) {
  // daca e eroare
  echo "<br/>". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($result) == 0) {
  echo '0 rezultate';
}
else {
  $regs = array();
  while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    // retine datele in array, cu index de la 'zi'
    $regs[$row['zi']][] = $row['denumire'];
  }
}
  // parcurgere a zilelor dintr-o luna si adaugare rezultat in $res
  $res = '';
  for($i=1; $i<32; $i++) {
    $res .= '<b>'.$i. ''.date("/m/Y").' <br/></b>';
    // daca exista inregistrare in ziua $i in $regs
    // parcurge array-ul cu inregistrarile din acea zi
    if(isset($regs[$i])) {
      for($i2=0; $i2<count($regs[$i]); $i2++) {
        $res .= $regs[$i][$i2]. '<br/>';
      }
    }
    else
	{
	 $res .= 'nu au fost adaugate resurse <br/>';
  }
  }
 echo $res;
si as vrea ca

Cod: Selectaţi tot

BETWEEN ".date("7-d-m-Y")."
adica 5 minus nr de zi adica sa nu imi trimita pe toata luna ci o data pe sapt dar sa nu adaug eu de fiecare data cand este duminica pana duminica.
problema este ca nu imi ia exact din bd informatia adica am informatie introdusa in 27-04-2012 si mi-o pune in alta data cum ii pica bine. cum as putea schimba sa imi dea doar pe o saptamana adica de duminica in duminica sa imi afiseze automat nu sa ii pun eu datele acelea. Astept raspuns, multumesc anticipat. cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Nu cunosc exact cum se poate selecta inregistrarile din tabel MySQL in functie de saptamana din luna, de Duminica pana Duminica.
Incearca totusi asa, sau poate gasesti imbunatatiri la ele:
- Inregistrarile din ultimele 7 zile:

Cod: Selectaţi tot

$sql = "SELECT *, DAYOFMONTH(data) AS zi FROM cantari_ppt
WHERE `data` > DATE_SUB(CURDATE(),INTERVAL 7 DAY)";
- Inregistrarile din saptamana precedenta:

Cod: Selectaţi tot

$sql = "SELECT *, DAYOFMONTH(data) AS zi FROM cantari_ppt
WHERE `data` BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 WEEK) and CURDATE()";
Sau:

Cod: Selectaţi tot

$sql = "SELECT *, DAYOFMONTH(data) AS zi FROM cantari_ppt
WHERE YEAR(`data`) = 2012 AND WEEK(`data`) = (WEEK(CURRENT_DATE) - 1)";

trif Mesaje:500
salut, ms de raspuns, merge cum ai zis tu in

Cod: Selectaţi tot

WHERE `data` BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 WEEK) and CURDATE()";
dar mai este o mica problema cum fac acest for sa imi afiseze doar 7 zile? am facut asa

Cod: Selectaţi tot

for($i=date(d+7); $i<date(d); $i++) {
    $res .= '<b>'.$i. ''.date("/m/Y").' <br/></b>';
    // daca exista inregistrare in ziua $i in $regs
    // parcurge array-ul cu inregistrarile din acea zi
    if(isset($regs[$i])) {
      for($i2=0; $i2<count($regs[$i]); $i2++) {
        $res .= $regs[$i][$i2]. '<br/>';
si daca trec de 7 zile imi mai afiseaza din urma, adica daca intervalul de 7 zile este intre 7-13 daca trec in 14 imi afiseaza for-ul intre 7-14 si tot asa ramane pe 7. cum fac ca sa se modifice si 7 in functie de zi? astept raspuns. multumesc anticipat. cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Acel for() e bun in cazul a 31 de zile.
Pentru interval de o saptamana, de Duminica pana Sambata inclusiv, inlocuieste cu acest cod:

Cod: Selectaţi tot

$lastweek = date('W') - 1;     // number of last week
$year = date('Y');
$res = '';

// traverse the index of the days in a week (0 = Sunday)
for($i=0; $i<7; $i++){
  // gets the number of the day in the week
  $day = date('d', strtotime($year."W".$lastweek.$i));

  $res .= '<b>'.$day. date("/m/Y").' <br/></b>';
  // daca exista inregistrare in ziua $i in $regs
  // parcurge array-ul cu inregistrarile din acea zi
  if(isset($regs[$day])) {
    for($i2=0; $i2<count($regs[$day]); $i2++) {
      $res .= $regs[$day][$i2]. '<br/>';
    }
  }
  else {
    $res .= 'nu au fost adaugate resurse <br/>';
  }
}
 

trif Mesaje:500
salut, multumesc de raspuns, dar faza este ca nu imi afiseaza toate rezultatele ci doar in anumite date. dar ceea ce imi trebuie mie este in felul urmator:

Cod: Selectaţi tot

10/05/2012 -- duminica
r1
r2
11/05/2012
r1
12/05/2012
r1
r2
13/05/2012
r1
r2
14/05/2012
r1
r2
15/05/2012
r1
r2
16/05/2012 sambata
r1
r2
r3
r4
asta apare cand este duminica dar eu vreau sa vad de exemplu miercuri data 06/05/2012

Cod: Selectaţi tot

06/05/2012 -- miercuri
r1
r2
07/05/2012
r1
08/05/2012
r1
r2
09/05/2012
r1
r2
10/05/2012
r1
r2
11/05/2012
r1
r2
12/05/2012 marti
r1
r2
r3
r4
adica in oricare din zi o aleg sa imi arate cele 7 zile din saptamana
daca aleg marti sa imi aleaga cele 7 zile de la ziua aleasa. sper ca ai inteles. cam asta doresc. ceea ce mi-ai dat u este ca imi i-a duminica si imi calc 7 zile de duminica pana sambata dar nu imi merge ci cum am zis imi afiseaza in anumite situatii iar in altele nu! sper ca ati inteles. multumesc anticipat. astept raspuns, cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Incearca cu acest cod:

Cod: Selectaţi tot

$lastweek = date('W') - 1;     // number of last week
$year = date('Y');
$startday = 0;       // ziua aleasa (0=Duminica, 1=luni, date('N')=ziua curenta)
$res = '';

// traverse the index of the days in a week (0 = Sunday)
for($i=0; $i<7; $i++){
  $setday = $startday + $i;
  $setweek = $lastweek;

  // if $setday is 7 or higher, decrease 7 days, and increment $setweek with one week
  if($setday >= 7) {
    $setday -= 7;
    $setweek = $lastweek + 1;
  }

  // gets the number of the day in the week
  $day = date('d', strtotime($year.'W'.$setweek.$setday));

  $res .= '<b>'.$day. date("/m/Y").' <br/></b>';
  // daca exista inregistrare in ziua $day in $regs
  // parcurge array-ul cu inregistrarile din acea zi
  if(isset($regs[$day])) {
    for($i2=0; $i2<count($regs[$day]); $i2++) {
      $res .= $regs[$day][$i2]. '<br/>';
    }
  }
  else {
    $res .= 'nu au fost adaugate resurse <br/>';
  }
}
La linia:

Cod: Selectaţi tot

$startday = 0;       // ziua aleasa (0=Duminica, 1=luni, date('N')=ziua curenta)
Se alege ziua de start, dupa cum arata comentarea.

trif Mesaje:500
salut, am facut asa:

Cod: Selectaţi tot

$lastweek = date('W') - 1;     // number of last week
$year = date('Y');
$res = '';
// traverse the index of the days in a week (0 = Sunday)
for($i=0; $i<7; $i++){
  // gets the number of the day in the week
  $day = date('d', strtotime($year."W".$lastweek.$i));
  $res .= '<b>'.$day.date("-m-Y"). ' <br/></b>';
  // daca exista inregistrare in ziua $i in $regs
  // parcurge array-ul cu inregistrarile din acea zi
  if(isset($regs[$day])) {
    for($i2=0; $i2<count($regs[$day]); $i2++) {
      $res .= $regs[$day][$i2]. '<br/>';
    }
  }
  else {
    $res .= 'nu au fost adaugate resurse <br/>';
  }
  }
 echo $res;
si nu imi merge ci sare direct la

Cod: Selectaţi tot

$res .= 'nu au fost adaugate resurse <br/>';
chit ca am informatii introduse in acea zi!
am facut select asa

Cod: Selectaţi tot

$sql = "SELECT *, DAYOFMONTH(data) AS zi FROM tabel
WHERE `data` BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 WEEK) and CURDATE()";
si imi da rezultat asa:

Cod: Selectaţi tot

20-05-2012 
nu au fost adaugate resurse 
21-05-2012 
nu au fost adaugate resurse 
22-05-2012 
nu au fost adaugate resurse 
23-05-2012 
nu au fost adaugate resurse 
24-05-2012 
nu au fost adaugate resurse 
25-05-2012 
nu au fost adaugate resurse 
26-05-2012 
nu au fost adaugate resurse
si mai ales cand o sa dau pe data de 27.05.2012 imi apare info din

Cod: Selectaţi tot

13-05-2012 
nu au fost adaugate resurse 
14-05-2012 
nu au fost adaugate resurse 
15-05-2012 
nu au fost adaugate resurse 
16-05-2012 
nu au fost adaugate resurse 
17-05-2012 
nu au fost adaugate resurse 
18-05-2012 
nu au fost adaugate resurse 
19-05-2012 
nu au fost adaugate resurse
si nu este corect!
nu stiu ce are. astept raspuns, multumesc anticipat! cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Partea de Select trebuie sa adauge randurile in $regs, apoi cealalta parte cu functia for() care le parcurge.
Cred ca trebuie asa:

Cod: Selectaţi tot

$sql = "SELECT *, DAYOFMONTH(data) AS zi FROM `cantari_ppt`
WHERE `data` BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 WEEK) and CURDATE()";
$result = mysql_query($sql);
if (mysql_errno()) {
  // daca e eroare
  echo "<br/>". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($result) == 0) {
  echo '0 rezultate';
}
else {
  $regs = array();
  while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    // retine datele in array, cu index de la 'zi'
    $regs[$row['zi']][] = $row['denumire'];
  }
}

$lastweek = date('W') - 1;     // number of last week
$year = date('Y');
$res = '';
// traverse the index of the days in a week (0 = Sunday)
for($i=0; $i<7; $i++){
  // gets the number of the day in the week
  $day = date('d', strtotime($year."W".$lastweek.$i));
  $res .= '<b>'.$day.date("-m-Y"). ' <br/></b>';
  // daca exista inregistrare in ziua $i in $regs
  // parcurge array-ul cu inregistrarile din acea zi
  if(isset($regs[$day])) {
    for($i2=0; $i2<count($regs[$day]); $i2++) {
      $res .= $regs[$day][$i2]. '<br/>';
    }
  }
  else {
    $res .= 'nu au fost adaugate resurse <br/>';
  }
  }
echo $res;
Daca nu merge, nici eu nu stiu de ce. In cazul asta e necesar depanarea codului:
- daca select-ul merge bine la test in PhpMyAdmin.
- print_r($regs);, ce date sunt in $regs.
Si ce mai crezi ca stii si tu din ce apare, apoi studiind atent codul, poate gasesti ce sa schimbi sa mearga.

Subiecte similare