dax4fun
Goto Top

Werte die durch eine sql abfrage bekommen werden addieren...

Hi Leute,

hab mir ein html und php script gebastelt wo ich abfragen absenden kann.

funktioniert auch, doch ich möchte es erweitern in dem alle werte die angezeigt werden spalten weise addiert werden.

beim googlen wird immer select sum() erwähnt und das immer nur von ganzen Tabellen und nicht nur von selektierten Datensätzen. Das ist mein Problem

Hab mir das so vorgestellt ich selektiere die benötigten Daten übersichtshalber werden die Sätze zeilenweise als HTML ausgegeben und unterhalb sollen die jeweiligen spalten dieser Sätze zusammengerechnet werden IN OUT BALANCE

Ist das möglich ??? besser wie geht das face-smile

bis jetzt habe ich das hier:
form.html
<html>
<head><title>search EOD info</title></head>
<body>
<h3>SHOP INFO</h3>
<hr>
<form action="abfrage.php" method="post">  
<br>
SHOP:    <input type="text" name="SHOP" size="20" maxlength="20" value="SHOP"><br>  
<br>
DATUM: <input type="text" name="DATUM" size="20" maxlength="20" value="JJJJMMDD"><br>  
<br>
<input type="submit" value="search">  
<input type="reset"  value="reset"><br>  
<br>556% = 556001 - 556999 , 201404% = 20140401 - 20140430<br>
</form>
<hr>
</body></html>
abfrage.php
<?php
    $_db_host = "mysqlsvr35.world4you.com";            # meist localhost  
    $_db_datenbank = "xxx";  
    $_db_username = "xxx";  
    $_db_passwort = "xxx";  

$SHOP = $_POST['SHOP'];  
$DATUM = $_POST['DATUM'];  

mysql_connect($_db_host, $_db_username, $_db_passwort);
mysql_select_db($_db_datenbank);
unset($host,$user,$pass,$_db_datenbank);


$sql="SELECT * FROM GLOBAL WHERE DATUM LIKE '$DATUM' AND SHOP LIKE '$SHOP'";  

$result = mysql_query($sql) or die(mysql_error());;


while($row = mysql_fetch_array($result)) {


echo "  SHOP: " . $row["SHOP"] . "  DATUM: " . $row["DATUM"] . "  ULAZ: " . $row["IN"] .  "  IZLAZ: " . $row["OUT"] . "  BALANS: " . $row["BALANCE"] . "  TIKETA: " . $row["TICKETS"] . "  OP1: " . $row["ONL1"] .  "  OP1 TIKETA: " . $row["ONL1TICKETS"] . "  OP2: " . $row["ONL2"] . "  OP2 TIKETA: " . $row["ONL2TICKETS"] . "<hr>";  
}



mysql_close($link);
?>
Datensätze:
cdc47c6d7bd202d72293191851638e07

Content-ID: 235409

Url: https://administrator.de/contentid/235409

Ausgedruckt am: 18.11.2024 um 07:11 Uhr

EvilMoe
EvilMoe 13.04.2014 aktualisiert um 07:46:12 Uhr
Goto Top
Hallo,


1. Dein Script ist nicht gegen MYSQL Injections geschützt.
2. SUM ist schon richtig.
$sql="SELECT SUM(IN), SUM(OUT), SUM(BALANCE), SUM(TICKETS) ....    
FROM GLOBAL 
WHERE DATUM LIKE '$DATUM' AND SHOP LIKE '$SHOP'  
GROUP BY SHOP";   
Arano
Lösung Arano 13.04.2014, aktualisiert am 14.04.2014 um 20:39:38 Uhr
Goto Top
Moin moin,

das funktioniert aber nur als zweite Abfrage !
So bekommt man die einzelnen Datensätze nicht mehr.
mysql> describe sum;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| wert  | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0,00 sec)

mysql> select * from sum;
+------+------+
| id   | wert |
+------+------+
|    1 |   10 |
|    1 |   20 |
|    2 |   30 |
|    2 |   40 |
+------+------+
4 rows in set (0,00 sec)

mysql> select id,wert,sum(wert) from sum where id=1 group by id;
+------+------+-----------+
| id   | wert | sum(wert) |
+------+------+-----------+
|    1 |   10 |        30 |
+------+------+-----------+
1 row in set (0,00 sec)

mysql> 
SUM() hat zwar richtig zusammen gerechnet, aber durch das GROUP BY `id` wird nur der erste Datensatz angezeigt.

Die Summen könnte man auch in der WHILE-Schleife(PHP) aufaddieren:
$sum_in=0;
$sum_out=0;
$sum_balance=0;
while( $row=mysql_fetch_assoc($result) )
{
    echo 'spalte1, spalte2, spalte-in, spalte-out, spalte-balance';  
    $sum_in+=$row['in'];  
    $sum_out+=$row['out'];  
    $sum_balance+=$row['balance'];  
}
echo 'spalte1, spalte2, '.$sum_in.', '.$sum_out.', '.$sum_balance;  


~Arano
dax4fun
dax4fun 14.04.2014 um 17:52:00 Uhr
Goto Top
Danke für eure Mühe und Hilfe ich habe es hingebogen face-smile

@EvilMoe
1.Hab mir das schon vorher angeschaut Mysql Injection und habe es probiert anzuwenden "mysql_real_escape_string" aber es ging nicht (das Script), jetzt wo ich den Befehl gesucht habe um ihn hier einzufügen habe hab ich eine noch detaillierte Anleitung gefunden. Wenn es dir nicht schwer fällt bzw. es nicht viel Arbeit ist, könntest du es auf dieses Script anwenden.

2.keine Ahnung warum das sql nicht funktioniert ich hab es direkt in phpmyadmin eingefügt habe noch zu sum(IN) ' hinzugefügt und habe keine Fehlermeldung bekommen aber auch kein Ergebnis hab mehrere Varianten probiert ab und zu hab ich auch ein Ergebnis bekommen SUM IN, SUM OUT... doch alle mit 0 ???

$sql="SELECT SUM('IN'), SUM('OUT'), SUM('BALANCE') from global ......

@Arano
Habe es mit deiner Schleife hinbekommen funktioniert perfekt das habe ich auch gesucht und es schaut like Batch aus was mir noch mehr gefallen hat face-smile

aber eine Frage hab ich noch

echo 'TOTAL IN '.$sum_in.', TOTAL OUT  '.$sum_out.' , TOTAL BALANCE  '.$sum_balance;  
ich hab Stunden verbracht das echo zu formatieren ???? warum kommt nach '.$sum_balance kein ' mehr, schaut irgendwie asymmetrisch aus... bzw. ist es auch anders formatiert als das echo aus meinem Script
echo "  SHOP: " . $row["SHOP"] .  
???

Danke euch face-smile

mfG
Dax

nun Sieht es so aus:
Abfrage.php
<?php

function safe($value){ 
   return mysql_real_escape_string($value); 
} 
    $_db_host = "xxx";            # meist localhost  
    $_db_datenbank = "xxx";  
    $_db_username = "xxx";  
    $_db_passwort = "xxx";  

$SHOP = $_POST['SHOP'];  
$DATUM = $_POST['DATUM'];  

mysql_connect($_db_host, $_db_username, $_db_passwort);
mysql_select_db($_db_datenbank);
unset($host,$user,$pass,$_db_datenbank);

$sql = "SELECT * FROM GLOBAL WHERE DATUM LIKE '$DATUM' AND SHOP LIKE '$SHOP'";  

$result = mysql_query($sql) or die(mysql_error());;

while($row = mysql_fetch_array($result)) {

echo "  SHOP: " . $row["SHOP"] . "  DATUM: " . $row["DATUM"] . "  ULAZ: " . $row["IN"] .  "  IZLAZ: " . $row["OUT"] . "  BALANS: " . $row["BALANCE"] . "  TIKETA: " . $row["TICKETS"] . "  OP1: " . $row["ONL1"] .  "  OP1 TIKETA: " . $row["ONL1TICKETS"] . "  OP2: " . $row["ONL2"] . "  OP2 TIKETA: " . $row["ONL2TICKETS"] . "<hr>";  

}

$sum_in=0;
$sum_out=0;
$sum_balance=0;

$sqlb = "SELECT * FROM GLOBAL WHERE DATUM LIKE '$DATUM' AND SHOP LIKE '$SHOP'";  

$resultb = mysql_query($sql) or die(mysql_error());;

while( $rowb=mysql_fetch_assoc($resultb) )

{
    $sum_in+=$rowb['IN'];  
    $sum_out+=$rowb['OUT'];  
    $sum_balance=$sum_in - $sum_out;
}
echo 'TOTAL IN '.$sum_in.', TOTAL OUT  '.$sum_out.' , TOTAL BALANCE  '.$sum_balance;  
?>
<br>

<a href="global.html">Back 2 search</a><br>  
Arano
Arano 14.04.2014 um 20:03:11 Uhr
Goto Top
Hi,

bei meinem ECHO sind es zwei Dinge:
  1. Habe ich einfache Anführungszeichen (') verwendet und musste deswegen
  2. zusätzlich den Verkettungsoperator (.) (den Punkt) verwenden.

Die einfachen Anführungszeichen werden __nicht__ geparst. Das heist wenn eine Variable dazwischen steht, wird diese nicht durch ihren Wert ersetzt sondern es wird einfach "$variable" ausgegeben. Das ist natürlich schneller wenn der Text einfach ausgegeben werden kan ohne das nach möglichen Variablen gesucht werden muss. Aber was wenn man eine verwenden möchte?
Dann bricht man den Parameter auf echo <parameter>; und fügt die Variabel mit Hilfe des Verkettungsoperator ein.
echo 'ersterteil '  
     .$variable
     .' zweiterteil';  
$foo='Welt';  
echo 'Hallo '.$foo;  


Zu deinem neuem Script kann ich auch noch etwas sagen.
Das Ausrechnen der Bilanz macht doch erst Sinn, wenn alle IN- und OUT-Werte zusammenaddiert sind !
Jetzt errechnest du die Bilanz mit jedem Schleifendurchlauf. Das sind genau soviele Berechnungen wie die Datenbankabfrage Datensätze liefert - obwohl eine einzige Berechnung ganz am Ende reichen würde !

Darüber hinaus, kannst (solltest) du die beiden Schleifen kombinieren bzw. vereinen. Also die Berechnungen aus der zweiten Schleife kannst du genau so gut in die Erste einfügen.
Dann sparst du dir die zweite Datenbankabfrage und Schleife.


~Arano
dax4fun
dax4fun 14.04.2014 um 20:38:29 Uhr
Goto Top
danke erst mal für das echo das muss ich noch probieren face-smile

zur Bilanz da sind Daten (noch nicht importiert sind noch in txt und unformatiert ) von einigen Monaten drin, aber die Abrechnung geschieht Monatlich somit bekomme ich eine Auflistung der einzelnen Shops bzw. sollten Daten fehlen kann ich das erkennen und nachfordern.Immerhin besser als früher einzelne txt Dateien piepen in eine txt dann importieren ins excel zusammenrechnen face-smile

ja hab jetzt strikt die Anfragen getrennt werd mal schauen das ich sie kürze face-smile

Bastle gerade an einem Script um die Datenbank zu füttern, habe 500+ txt Dateien in diesem Format

Inhalt von 555006....%datum%.txt
SHOP_555006, in:188600, out:198128, balance:-9528, tickets:1113,
mal schauen wie weit ich komm face-smile

vielen danke erst mal

mfG
dax