Neu Größere Abfragen über PHP realisieren

thowi

Sehr aktives Mitglied
8. Juni 2018
433
66
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
16
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.795
316
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.227
205
Ü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
433
66
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.227
205
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
433
66
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
433
66
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
433
66
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
433
66
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

Sehr aktives Mitglied
21. April 2021
285
35
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 Seriennummern und SQL Abfragen User helfen Usern - Fragen zu JTL-Wawi 1
Keine Datensicherung über ODBC möglich JTL-Wawi 1.10 0
Neu Kartonagen nicht mehr über Workflow auswählbar nach Update auf 1.11.3 JTL-Workflows - Ideen, Lob und Kritik 0
Neu Materialeinsatz Berechnung über EKNetto JTL Ameise - Eigene Exporte 1
Neu Übergabe Versandlaber an Fulfiller möglich über FFN standallone aber nicht über FFN mit angebundeener JTL-WAWI Arbeitsabläufe in JTL-Wawi 0
Neu Staffelpreise Variantenartikel über alle Varianten User helfen Usern - Fragen zu JTL-Wawi 0
Sammelbuchung bei Zahlungsausgang über das Zahlungsmodul JTL-Wawi 1.10 0
Überverkäufe über Workflow setzen JTL-Wawi 1.10 2
Neu Shop über verschieden Domains in gewünschter Sprache aufrufen ? Betrieb / Pflege von JTL-Shop 5
Ausliefern Workflow über API JTL-Wawi 1.9 6
Neu JTL-Shop Admin Bereich und Shop nur noch 504 Gateway Time-out ( Hosting über JTL ) User helfen Usern - Fragen zu JTL-Wawi 4
Probleme mit dem Einstellen von Artikeln auf Amazon über JTL Wawi mit dem Lister 2.0 Amazon-Lister - Fehler und Bugs 6
Neu Auftrag über WaWi versenden Arbeitsabläufe in JTL-Wawi 3
Über 100 Bestellungen von SCX nicht importiert kaufland.de - Anbindung (SCX) 1
Neu Probleme mit der Email über jtl hosting (plesk) User helfen Usern 2
Neu Fehlermeldungen beim Hochladen von Artikel über Amazon Lister 2.0 Amazon-Lister - Fehler und Bugs 1
Neu Registrierung über amazonpay nicht möglich Plugins für JTL-Shop 0
Statistik über Zahlungsmoral der Kunden / Zahlungsverzug möglich? JTL-Wawi 1.9 4
Merkmalfilter als Leiste über Artikelliste möglich??? Einrichtung JTL-Shop5 3
Neu Kein CN22 über DHL JTL-ShippingLabels - Fehler und Bugs 4
Defekt-Artikel nach Retoure über WMS nicht mehr in JTL-Wawi sichtbar JTL-Wawi 1.10 2
In Bearbeitung Kompakte Kasse gesucht mit der auch Kartenzahlung über 50 € funktioniert? JTL-POS - Fragen zu Hardware 5
Neu Zahlungsimport über CSV ... Ausgangszahlung ? JTL-Wawi - Fehler und Bugs 0
Datenbank ist über 800gb groß Hilfe !!! JTL-Wawi 1.9 23

Ähnliche Themen