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.189
180
Ü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.189
180
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
187
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 Workflow - Stücklisten im Auftrag abfragen und korrekt in einer Mail auflisten User helfen Usern - Fragen zu JTL-Wawi 1
Neu Workflow - Stücklistenartikel abfragen 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 1.8 - WMS Teillieferung soll nur Rechung über gelieferte Positionen enthalten Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 0
Verwiesen an Support BUG: Mahnlauf über Workflow ignoriert Zahlungsziel JTL-Workflows - Fehler und Bugs 3
Neu Autorisierte Zahlungen über mollie werden bei Rundungsdifferenz storniert. WooCommerce-Connector 0
Neu Kategorienbaum in einer Unterkategorie über der Filterung ausblenden Allgemeine Fragen zu JTL-Shop 1
Neu Auftragszahlung über Kasse, Auftrag wird nicht als "Verpackt und Versendet" markiert JTL-POS - Fehler und Bugs 1
Neu So ändern Sie den Status von amazon ASIN über die Importdatei in „Aktiv“. JTL Ameise - Eigene Exporte 0
Neu Einem bzw. mehreren Artikeln über den Import mehrere Kategorien zuordnen JTL-Wawi 1.7 1
Neu In Tabelle ein Bild über mehrere Zeilen verteilen in Katalog Vorlage Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Datenimport über Ameise in JTL für Shopware Shopware-Connector 1
Gelöst JTL-POS: Rechnung über Kasse Allgemeine Fragen zu JTL-POS 3
Neu Bestellungen importieren über SFTP Server User helfen Usern - Fragen zu JTL-Wawi 6
Neu Exportformate neu über alles Allgemeine Fragen zu JTL-Shop 2
Neu Rechner über Nacht runter fahren? User helfen Usern - Fragen zu JTL-Wawi 12
JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Vouchers 2
Neu JTL Shop Gutscheine über JTL-Vouchers erstellen Allgemeine Fragen zu JTL-Shop 2
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 6

Ähnliche Themen