[PHP] Telt niet alle ID's vanuit database

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Goeiemorgen,

Ik moet een script aanpassen alleen nu gaat er iets fout.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?
if(mysql_num_rows($sql) > 0)

{
    $id = array("0");
    while($row = mysql_fetch_array($sql))
    {
        array_push($id, $row['productid']);
    }
    $id = array_unique($id);
    sort($id);
    $end = count($id);
    $count = 1;
    while($end != $count) 
    {
                $sql2 = mysql_query("SELECT * FROM orders WHERE productid = '".$id[$count]."' AND confirmationdate BETWEEN '".date('Y-m-d')." 00:00:00' AND  '".date('Y-m-d')."  23:59:59'") or die(mysql_error());
                $sql3 = mysql_query("SELECT * FROM products WHERE id = '".$id[$count]."'") or die(mysql_error());
                $i=0;
                while($row = mysql_fetch_array($sql2))
                {
                    $i++;
                }
                $count++;
                $row3 = mysql_fetch_array($sql3);
                if(!$array){$array = array($row3['id'] => $i);}
                else{ $array[$row3['id']] = $i;}        
    }
    arsort($array);
    $result1 = mysql_query ("SELECT id FROM products");
    $result = mysql_query ("SELECT * FROM products"); 
    $numOfRows = mysql_num_rows($result1); 

    for ($i = 0; $i < $numOfRows; $i++) 

   { 
    $row1 = mysql_fetch_array($result); 
    $result_array[$i] = $row1['naam']; 
   }  
    foreach($array as $key => $value)
    {
        echo "<tr><td>".$key."</td>";
        echo "<td>".$value."<td></tr>"; 
    }
}
mysql_query("");
echo $result_array['1242'];
echo $numOfRows;
?> 


Er zijn 1249 id's in de database en mijn script telt maar tot 1219 en toont ook nog eens de verkeerde product naam bij de laatste 2 id's die hij kan tellen (1218,1219).

Ik kom er echt niet uit en zit hier toch al aardig wat uur mee te kloten.

Iemand tips of ideeën?

Alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-06 14:45

Yoozer

minimoog

Waarom gebruik je geen SELECT COUNT(id)?

edit: dit riekt naar code die ergens in 1998 is geschreven en zonder kennis is gekopieerd, lijkt me sowieso geen goed idee. Zou een JOIN gebruiken geen beter idee zijn? Wat wil je bereiken, hoe zien je tabellen er uit, etc.

[ Voor 73% gewijzigd door Yoozer op 01-02-2013 12:07 ]

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Yoozer schreef op vrijdag 01 februari 2013 @ 12:06:
Waarom gebruik je geen SELECT COUNT(id)?

edit: dit riekt naar code die ergens in 1998 is geschreven en zonder kennis is gekopieerd, lijkt me sowieso geen goed idee. Zou een JOIN gebruiken geen beter idee zijn? Wat wil je bereiken, hoe zien je tabellen er uit, etc.
Bijna goed, 2006 :P.

Er is een tabel met orders, daarin staat een productid per order. In de tabel products staan alle producten met daarin een ID en een naam.

Nu wil ik gewoon simpelweg met de hand van deze code per ID de naam laten zien.

Nu staat er dus bijv. dit:

1218 - (aantal)

en dat moeten worden:

Productnaam - (aantal)

Ik zou graag dit opnieuw willen schrijven maar men wil het script behouden dus zit ik nog wel vast.

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
Ik zou graag dit opnieuw willen schrijven maar men wil het script behouden dus zit ik nog wel vast.
Dat noemen ze nu refactoring, als je er gewoon voor zorgt dat de output van je functie hetzelfde blijft kun je prima de query omschrijven naar een fatsoenlijke join/group en mysql laten doen wat het goed kan ipv het door php te laten joinen en groupen ;)

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 18-07 08:11
Ja, het is een goede gewoonte als je met databases werkt, de data logica door de database te laten uitvoeren.
In dit geval bijzonder eenvoudig:

SQL:
1
2
3
4
5
select p.name as product
,      count(*) aantal
from   orders   o
join   products p on o.product_id = p.id
group by p.name

Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
BazzPsychoNut schreef op vrijdag 01 februari 2013 @ 13:33:
Ja, het is een goede gewoonte als je met databases werkt, de data logica door de database te laten uitvoeren.
In dit geval bijzonder eenvoudig:

SQL:
1
2
3
4
5
select p.name as product
,      count(*) aantal
from   orders   o
join   products p on o.product_id = p.id
group by p.name
Ja dit werkt, krijg nu alle aantallen per product te zien, nu wil ik dit alleen die van vandaag hebben.
code:
1
2
3
4
5
SELECT naam AS products, COUNT( * ) aantal
FROM orders o
JOIN products p ON o.productid = p.id
GROUP BY naam
AND confirmationdate BETWEEN '2013-02-01 00:00:00' AND  '2013-02-01'


Dan krijg ik 290000 aantallen van 1 boek op 1 dag. Dat lijkt mij niet te kloppen. Sorry, zou iemand mij kunnen uitleggen wat ik fout doe. Want ik zie door de bomen het bos niet meer. Ik heb nu dit staan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$sql = mysql_query("SELECT naam AS products, COUNT( * ) aantal
FROM orders o
JOIN products p ON o.productid = p.id
ORDER by aantal ") or die("Mislukt".mysql_error());
                while($row = mysql_fetch_array($sql)){
                        echo "<tr><td>".$row['products']."</td>";
                            echo "<td>".$row['aantal']."<td></tr>";
                }

?>


Nu alleen nog van vandaag en dan heb ik het maar ik snap het gewoon echt niet meer. :'(

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-07 10:44

Janoz

Moderator Devschuur®

!litemod

Dat komt omdat je nu een group by doet op "naam
AND confirmationdate BETWEEN '2013-02-01 00:00:00' AND '2013-02-01'"

Die confimationdate moet je natuurlijk in een where clausule opnemen, niet bij de group by clausule.

http://dev.mysql.com/doc/refman/5.0/en/select.html

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
Janoz schreef op vrijdag 01 februari 2013 @ 15:12:
Dat komt omdat je nu een group by doet op "naam
AND confirmationdate BETWEEN '2013-02-01 00:00:00' AND '2013-02-01'"

Die confimationdate moet je natuurlijk in een where clausule opnemen, niet bij de group by clausule.

http://dev.mysql.com/doc/refman/5.0/en/select.html
Daar staat ie nu en dan krijg ik alsnog niks te zien :S

code:
1
2
3
4
5
SELECT naam AS products, COUNT( * ) aantal
FROM orders o
JOIN products p ON o.productid = p.id
WHERE confirmationdate BETWEEN '".date('Y-m-d')." 00:00:00' AND  '".date('Y-m-d')."'
GROUP by naam


Sorry als ik het misschien niet helemaal begrijp maar ben nog niet zo lang bezig met PHP en SQL :(

Acties:
  • 0 Henk 'm!

  • daaan
  • Registratie: Maart 2000
  • Laatst online: 12-06 12:21

daaan

Brandweer Zoutkamp

date('Y-m-d')." 00:00:00' en date('Y-m-d') zijn het zelfde.

Je kunt beter date('Y-m-d', strtotime("tomorrow")) gebruiken als laatste parameter. Dan pak je alles tussen 2013-02-01 en 2013-02-02, wat dus vandaag is.

One's never alone with a rubber duck.


Acties:
  • 0 Henk 'm!

  • rubjo99
  • Registratie: Februari 2011
  • Laatst online: 30-07-2020
daaan schreef op vrijdag 01 februari 2013 @ 15:34:
date('Y-m-d')." 00:00:00' en date('Y-m-d') zijn het zelfde.

Je kunt beter date('Y-m-d', strtotime("tomorrow")) gebruiken als laatste parameter. Dan pak je alles tussen 2013-02-01 en 2013-02-02, wat dus vandaag is.
Hoezee, dat werkt :D. Alleen laat ie nu 1 product zien en het totale aantal is er een goede manier om dat te scheiden?

Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 18-07 08:11
Je vraag is niet duidelijk. Wat wil je van elkaar scheiden?
Pagina: 1