Neu Größere Abfragen über PHP realisieren

thowi

Sehr aktives Mitglied
8. Juni 2018
424
64
Hey zusammen,

ich habe bereits eine kleine feine Abfrage in PHP gebaut, die wunderbar und fehlerfrei funktioniert.

PHP:
$query2 = "select kArtikel, cArtNr, fVKNetto, fUVP from tartikel";

$result = mssql_query($query);
$a = array();
while ($row = mssql_fetch_assoc($result)) {
    $a['data'][] = $row;
}

echo json_encode($a);

Nun tausche ich $query2 folgendermaßen aus:

PHP:
$query2 = "
SELECT ABP.cArtNr AS 'Artikelnummer',
       MAX(SUBSTRING(ABP.cName,8,50)) AS 'Beschreibung',
       SUM(ABP.nQuantityPurchased) AS 'Anzahl',
       SUM(ABP.nQuantityPurchased) * MAX(AA.fPrice) AS 'Brutto-Umsatz'
FROM pf_amazon_bestellung
INNER JOIN pf_amazon_bestellungpos ABP ON pf_amazon_bestellung.kAmazonBestellung = ABP.kAmazonBestellung
INNER JOIN pf_amazon_angebot AA ON ABP.cArtNr = AA.cSellerSKU
WHERE dPurchaseDate >= DateAdd(DAY, DateDiff(DAY, 0, getDate()), 0)
  AND pf_amazon_bestellung.cOrderStatus <> 'Canceled'
GROUP BY ABP.cArtNr
";

Und zack - nix geht mehr :(

Um der Sache mal auf die Spur zu kommen, habe ich ein paar Debug-Abfragen eingefügt:

PHP:
echo "Start";
echo "<br>";
echo "Query2 variable";
echo "<br>";
echo $query;
echo "<br>";
echo "MSSQL Query result";
echo "<br>";
echo $result;
echo "<br>";
echo "JSON encode a";
echo "<br>";
echo json_encode($a);
echo "<br>";
echo "End";

Hier das Ergebnis:Bildschirmfoto 2018-09-19 um 15.26.35.jpg

Man kann also sehen, dass $query OK ist, allerdings liefert mssql_query($query); lediglich "Resource id #3".

Natürlich habe ich schonmal etwas gegoogelt und mssql_fetch_assoc durch mssql_fetch_array oder row ersetzt - leider ohne Erfolg. Auch hab ich die große Abfrage mal so verändert, dass sie in 1 Zeile steht - hab auch alle Aliase entfernt - hat nichts geholfen.
Natürlich läuft diese Abfrage im SSMS einwandfrei.

Hat jemand von euch noch ne Idee, woran das liegen kann?
Wie gesagt, mit der "kleinen" Abfrage $query2 = "select kArtikel, cArtNr, fVKNetto, fUVP from tartikel"; funktioniert alles wunderbar! Nur mit der großen nicht...
 

luffi

Aktives Mitglied
6. November 2013
50
15
Um weiter zu debuggen könntest du entweder einen Debugger installieren, oder u.A. var_dump() nutzen um weitere Daten über deine Objekte zu bekommen.
Relevant wäre erstmal zu wissen, ob du wirklich nur den Query änderst, oder auch den Code der durch das Resultat iteriert. Falls diese identisch sind, würde ich nochmals prüfen welche Daten in $result liegen.
Unmittelbar klingt es so, als würdest du genau das in $result zurück bekommen was dir die Doku sagt: ein Ressourcen Objekt.
Returns a MS SQL result resource on success, TRUE if no rows were returned, or FALSE on error.
Wenn das so sein soll, würde ich in deiner Debugsektion durch $result mit mssql_fetch_assoc iterieren und ein var_dump() auf $row ausgeben lassen - nur um zu sehen, was da wirklich drin ist.
Schreib mir sonst gern mal eine PN, vielleicht kann ich dir auf die Sprünge helfen. :)
 

Xantiva

Sehr aktives Mitglied
28. August 2016
1.787
313
Düsseldorf
Das kann so nicht stimmen ...
ich habe bereits eine kleine feine Abfrage in PHP gebaut, die wunderbar und fehlerfrei funktioniert.

PHP:
$query2 = "select kArtikel, cArtNr, fVKNetto, fUVP from tartikel";

$result = mssql_query($query);
$a = array();
while ($row = mssql_fetch_assoc($result)) {
    $a['data'][] = $row;
}

echo json_encode($a);

Du weist das SQL Statement der Variable $query2 zu, übergibst dann aber $query (ohne 2) an die mssql_query() Methode ...

Unten im Code dann noch mal. Du schreibst "Query2 Variable", gibst aber $query aus. Die Zuweisung darüber ging aber an $query2?

Bitte prüfe das erst mal in deinem Code ...
 

elevennerds.de

Sehr aktives Mitglied
23. September 2015
1.187
179
Über PDO läuft der Query:
PHP:
try  { 
    $db = new PDO( 'sqlsrv:server='.DB::SERVER.' ; Database='.DB::DB, DB::USER, DB::PASS); 
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
} catch(Exception $e) {   
    die( print_r( $e->getMessage() ) );   
}

$smt = $db->query("SELECT ABP.cArtNr AS 'Artikelnummer',
       MAX(SUBSTRING(ABP.cName,8,50)) AS 'Beschreibung',
       SUM(ABP.nQuantityPurchased) AS 'Anzahl',
       SUM(ABP.nQuantityPurchased) * MAX(AA.fPrice) AS 'Brutto-Umsatz'
FROM pf_amazon_bestellung
INNER JOIN pf_amazon_bestellungpos ABP ON pf_amazon_bestellung.kAmazonBestellung = ABP.kAmazonBestellung
INNER JOIN pf_amazon_angebot AA ON ABP.cArtNr = AA.cSellerSKU
WHERE dPurchaseDate >= DateAdd(DAY, DateDiff(DAY, 0, getDate()), 0)
  AND pf_amazon_bestellung.cOrderStatus <> 'Canceled'
GROUP BY ABP.cArtNr");
while(($o = $smt->fetch(PDO::FETCH_ASSOC)) !== false) {
    print_r($o);
}
$db = NULL;
 

thowi

Sehr aktives Mitglied
8. Juni 2018
424
64
Danke euch allen für das großartige Feedback!
Doch das passt schon, ich hab mich lediglich beim Zusammenkopieren hier vertan, sorry.
Cool, danke dir für den Tipp! PDO habe ich bisher nicht benutzt, weil ich dazu relativ wenig Beispiele im Web gefunden hab. Ich habe deinen Code mal eingefügt und getestet, bei mir wird folgende Fehlermeldung angezeigt:
Code:
Fatal error: Class 'DB' not found in /www/htdocs/w011d369/Statistiken/server_processing2.php on line 8
Hast du das genauso bei dir getestet und es lief?
Falls es wichtig ist: ich bin leider auf PHP 5.6 angewiesen, da All-Inkl auf neueren PHP Versionen kein mssql unterstützt. Liegt's vielleicht daran?
Relevant wäre erstmal zu wissen, ob du wirklich nur den Query änderst, oder auch den Code der durch das Resultat iteriert.
Jepp, ich ändere wirklich nur den Query, sonst nichts.
Falls diese identisch sind, würde ich nochmals prüfen welche Daten in $result liegen.
Wenn ich $result per echo ausgebe, steht dort "Resource id #3"
Wenn das so sein soll, würde ich in deiner Debugsektion durch $result mit mssql_fetch_assoc iterieren und ein var_dump() auf $row ausgeben lassen - nur um zu sehen, was da wirklich drin ist.
Schreib mir sonst gern mal eine PN, vielleicht kann ich dir auf die Sprünge helfen. :)
Puh, das klingt kompliziert - ich schau mal, ob ich es nicht vielleicht sogar mit PDO hinbekomme, sonst meld ich mich nochmal :D danke dir!
 

elevennerds.de

Sehr aktives Mitglied
23. September 2015
1.187
179
DB ist meine eigene Klasse für die DB-Einstellungen. Du brauchst nur diese Zeile zu ändern:
PHP:
$db = new PDO( 'sqlsrv:server='.DB::SERVER.' ; Database='.DB::DB, DB::USER, DB::PASS);
und für DB::SERVER deinen Server eintragen, DB::DB deine DB usw..
 

thowi

Sehr aktives Mitglied
8. Juni 2018
424
64
Uh, vielleicht steh ich so früh morgen etwas auf dem Schlauch :D ich hatte es jetzt so eingebaut:
PHP:
$server = "1235:56789\JTLWAWI";
$user = "sa";
$pw = "abcdef";
$database = "Mandant_1";

try  {
    $db = new PDO( 'sqlsrv:server='.DB::$server.' ; Database='.DB::$database, DB::$user, DB::$pw);
Hab jetzt die "DB::" rausgelöscht, nun läuft's zumindest dort durch ... aaaaaber
Code:
could not find driver1
Vermutlich ist der sqlsrv nicht installiert... ärgerlich. Hier habe ich gelesen, dass man es scheinbar auch mit einem ODBC Treiber lösen kann - soll sogar schneller sein. Habe mal beim All-Inkl Support angefragt, wie genau der Treiber bei denen heißt, dann würde ich es damit mal testen.
 

thowi

Sehr aktives Mitglied
8. Juni 2018
424
64
Also, der All-Inkl. Support hat mir geraten, pdo_dblib zu benutzen. Das hat nun super funktioniert! Wenn ich das richtig sehe, habe ich nun mehrere einzelne Arrays in der Ausgabe:
Code:
Array ( [Artikelnummer] => eins [Beschreibung] => blabla [Anzahl] => 1 [Brutto-Umsatz] => 99.99 ) Array ( [Artikelnummer] => zwei [Beschreibung] => blabla [Anzahl] => 1 [Brutto-Umsatz] => 99.99 ) Array ( [Artikelnummer] => drei [Beschreibung] => blabla [Anzahl] => 1 [Brutto-Umsatz] => 99.99 ) Array ( [Artikelnummer] => vier [Beschreibung] => blabla [Anzahl] => 1 [Brutto-Umsatz] => 99.99 ) Array ( [Artikelnummer] => fuenf [Beschreibung] => blabla [Anzahl] => 1 [Brutto-Umsatz] => 99.99 )
Das muss ich nun noch in ein JSON Objekt gewandelt bekommen.
So geht es leider nicht, wenn ich dies statt deinem while einbaue:
PHP:
$o = array();
while(($o = $smt->fetch(PDO::FETCH_ASSOC)) !== false) {
    $o['data'][] = $row;
}
echo json_encode($o);
Liefert einfach nur "false" zurück. Hast du hier noch einen Tipp für mich?
 

thowi

Sehr aktives Mitglied
8. Juni 2018
424
64
Danke, das klingt gut! Hab ich direkt mal getestet, direkt auch mit nem json_encode:
PHP:
echo json_encode(['data' => $smt->fetchAll()]);
Liefert leider lediglich eine weiße Seite.
Wenn ich die Ausgabe ohne das json_encode durchführe, bekomme ich lediglich "Array" als Ergebnis.
Aber
PHP:
$result = $smt->fetchAll();
print_r($result);
funktioniert einwandfrei....
 

thowi

Sehr aktives Mitglied
8. Juni 2018
424
64
Okay, die Browser-Ausgabe war ja eh nur zu Debug-Zwecken gedacht. Letztendlich muss ich die Daten lediglich an mein Javascript übergeben. Das tut's auch nicht, ergibt die Fehlermeldung "invalid JSON".
Aaaaaach man, hatte ich mir einfacher vorgestellt :D
 

arich001

Gut bekanntes Mitglied
21. April 2021
185
15
Uh, vielleicht steh ich so früh morgen etwas auf dem Schlauch :D ich hatte es jetzt so eingebaut:
PHP:
$server = "1235:56789\JTLWAWI";
$user = "sa";
$pw = "abcdef";
$database = "Mandant_1";

try  {
    $db = new PDO( 'sqlsrv:server='.DB::$server.' ; Database='.DB::$database, DB::$user, DB::$pw);
Hab jetzt die "DB::" rausgelöscht, nun läuft's zumindest dort durch ... aaaaaber
Code:
could not find driver1
Vermutlich ist der sqlsrv nicht installiert... ärgerlich. Hier habe ich gelesen, dass man es scheinbar auch mit einem ODBC Treiber lösen kann - soll sogar schneller sein. Habe mal beim All-Inkl Support angefragt, wie genau der Treiber bei denen heißt, dann würde ich es damit mal testen.
schon eeeewig her, aber.....wie genau hattest Du den Fehler "could not find driver1" behoben ?
Bin auch bei allinkl.com
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu Größere Stückzahl eines Gleichen artikels scannen / eingeben. Packtisch User helfen Usern - Fragen zu JTL-Wawi 2
Neu /navi.php?q=2 Abfragen laufen auf 404 Gelöste Themen in diesem Bereich 4
Neu Consent Status per Smarty Var abfragen Technische Fragen zu Plugins und Templates 2
In Diskussion Lagerbestand in einem bestimmten Lager abfragen JTL-Workflows - Ideen, Lob und Kritik 1
Neu Bestellungen importieren über SFTP Server User helfen Usern - Fragen zu JTL-Wawi 0
Neu Exportformate neu über alles Allgemeine Fragen zu JTL-Shop 0
Neu Rechner über Nacht runter fahren? User helfen Usern - Fragen zu JTL-Wawi 11
JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Vouchers 1
Neu JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Shop 0
Neu Freitextfeld über Variation - Zeichenbeschränkung für Gravur Allgemeine Fragen zu JTL-Shop 8
In Bearbeitung Artikel über csv-Datei bearbeiten und importieren Allgemeine Fragen zu JTL-POS 3
Neu Verordnung über die allgemeine Produktsicherheit (GPSR) JTL-Wawi - Ideen, Lob und Kritik 0
Neu Kundenpreise in Artikelübersicht (über Umwege)? Arbeitsabläufe in JTL-Wawi 0
Neu Verbindungsproblem Wawi (1.8.12.0) zum JTL-Shop (5.2.4) über localhost User helfen Usern - Fragen zu JTL-Wawi 0
Auftragsimport über eBay - Bezeichnung der Versandart auf der Rechnung leer JTL-Wawi 1.8 1
Wie kann ich eine Benachrichtigung bei einem Wareneingang auslösen mit einer Mail über die Artikel die eingebucht wurden JTL-Wawi 1.8 2
Artikel wurden über Weclapp über FFN-Connect an JTL FFN übermittelt jedoch leider nicht an Wawi & WMS JTL-Wawi 1.8 0
Gutschrift über einen Set-Artikel JTL-Wawi 1.7 0
Teilrechnung Erstellen über/nach Packtisch+ JTL-Wawi 1.8 1
Neu SCSS-Datei bearbeiten über FTP Allgemeine Fragen zu JTL-Shop 6
Neu Email Versand über OAuth JTL-Wawi - Ideen, Lob und Kritik 2
Neu Informationspflicht über Sicherstellung der Echtheit von Kundenbewertungen Business Jungle 5
Neu SQL Abfrage über ODBC für Bewegunghistorie (WMS) Eigene Übersichten in der JTL-Wawi 4
Neu PayPal - Benachrichtungen über Zahlung -> EMail. Wo kann man den Betreff bearbeiten? User helfen Usern - Fragen zu JTL-Wawi 6
Neu Mails über Microsoft 365 User helfen Usern - Fragen zu JTL-Wawi 17
Neu Verkaufte Stückzahl pro Artikel über Ameise ausgeben JTL Ameise - Eigene Exporte 1
Statistik über ALLE Kunden mit Umsatz JTL-Wawi 1.6 1
Neu Anbindung kaufland und Otto über JTL 1.7.15.4 noch möglich? User helfen Usern - Fragen zu JTL-Wawi 1
Neu Artikelname für WMS über Ameise importieren JTL-Ameise - Fehler und Bugs 6
Positionen alle auf einmal z.B über csv in einen bestehenden Auftrag einfügen JTL-Wawi 1.8 2
Neu Exportvorlage Hermes wir über Packtisch nicht mehr ausgegeben JTL-ShippingLabels - Fehler und Bugs 0
Neu Überverkäufe in Amazon, wenn Artikel über "Dranhängen"/ Jetzt Verkaufen in Amazon/ Seller Central erstellt wird. Amazon-Anbindung - Fehler und Bugs 3

Ähnliche Themen