SQL SQL Abfrage gibt manchmal mehr aus als gewollt

Skidrow1988

Lt. Commander
Registriert
Nov. 2014
Beiträge
1.035
Moin Leute,

ich habe eine SQL Abfrage für mein kleines Spiel erstellt. Das verrückte ist aber, das manchmal mehr Daten kommen als gewollt. Ich habe Produkte "p_id" die aus einer Tabelle "sp_lager" geladen werden. Jedes Produkt hat dabei eine Qualität "quali". Es sollen aber lediglich die angezeigt werden wo menge größer als X ist. Es werden aber trotzdem immer wieder kleinere Werte ausgelesen. Ich habe überprüft oft der Wert der für "menge" übergeben wird passt, aber trotzdem werden öfter kleinere angezeigt. Ich hoffe mir kann jemand helfen.


Code:
SELECT menge, quali FROM sp_lager WHERE sp_id = ? AND menge >= ? AND p_id = ? ORDER BY quali

Edit:
Natürlich wird das DBMS etc benötigt.
MariaDB

menge, quali, sp_id und p_id sind alles INTs.
"sp_id" ist die SpielerID

Die Daten werden über ein PHP Skript eingefügt. Das funktioniert auch sehr ordentlich. Es ist lediglich so, das alle X mal zu viele Daten gelesen werden. Auch, wenn alle zur Verfügung stehenden Daten passen.
 
Zuletzt bearbeitet:
In welcher bisher unbekannten Datenbank ist es denn was für ein Datentyp und kommt wie genau in die Datenbank? Datenbank Schema für die Tabelle mal posten?
Du merkst, ein paar mehr Infos könnten helfen, wenn die echten DB Experten hier auftauchen.

Ansonsten klingt das Verhalten natürlich erstmal fehlerhaft, allerdings steht und fällt alles mit möglichen Datentyp Fehlern, Bugs auf dieser elementaren Ebene würde ich erstmal nicht vermuten (aber wer weiß)
 
  • Gefällt mir
Reaktionen: Skidrow1988 und guzzisti
Wenn du dieses Query direkt an die DB schickst wird meiner Meinung nach jedes Mal das selbe raus kommen.

Dein Problem wird also an den Parametern liegen ODER bei PHP, weil Du noch Daten im Ausgabepuffer haben könntest.

Dein Text sagt "menge größer", dein Code größer gleich ... Nur um auch solche kleinigkeiten zu berücksichtigen.
PHP ist nicht typsicher. Du kannst da auch prima String "5" und die Zahl 5 stehen haben. Die sehen für dich gleich aus, aber wenn Du String und Int addierst (. Operator; + Operator) kommt da auch mal NULL raus oder nur ein Teil des Strings, Zahl. Das bringt "lustige" Effekte in der Datenbank mit sich.

Ich sehe deinen Fehler also beim Parameter oder wie der Parameter gewonnen wird und nicht im Query
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Raijin, Skidrow1988 und BeBur
Skidrow1988 schrieb:
Ich habe überprüft oft der Wert der für "menge" übergeben wird passt, aber trotzdem werden öfter kleinere angezeigt.
Spontan würde ich das Problem ebenfalls bei den Parametern vermuten. Du kannst doch in den SQL Logs die Queries sehen, führe den nochmal 1:1 manuell aus, wenn der Fehler da dann auftritt, dann kopiere 1:1 den Query hier in den Thread.

Ich habe im Internet so ziemlich keine Fragethreads, weil spätestens der Bau eines Minimalbeispiels das Problem aufzeigt und identifizierbar macht.
 
  • Gefällt mir
Reaktionen: Raijin, aronlad und Skidrow1988
Danke für deine Antwort. Ich checke mal ob ich etwas in den Logs sehen kann. Darüber habe ich noch nicht nachgedacht. Danke!
 
Du könntest auch in der MariaDB den QueryLog aktivieren und somit genau die Abfragen prüfen, welche Richtung DB gegangen sind.
 
Du schreibst und ich bin gerade fertig. Also der Log selbst ist scheinbar nur bei Fehlern aktiv. Da gab es aber keine, daher leer. Die Geschichte QueryLog werde ich mir jetzt Mal angucken. In der Workbench konnte ich den Fehler nämlich nicht nachstellen.
 
Zeig doch einfach mal das Schema der fraglichen Tabelle inklusive Datentypen. Ich bin in MariaDB nicht wirklich bewandert, aber google sagt mir show columns from sp_lager sollte entsprechende Ausgaben liefern.

Darüber hinaus wäre natürlich auch die fragliche Stelle in deinem PHP-Code interessant. So kann ein Helfer die Situation gegebenenfalls nachstellen, wenn der Fehler nicht direkt beim Hinsehen auffällt.
 
Es könnte auch sein, dass die Spalte menge vom Typ string ist und nicht int.
Würde den von dir beschriebenen Effekt erklären. Strings lassen sich auch mittels < oder > vergleichen,
der Vergleich bezieht sich dann aber auf die Sortierreihenfolge der Strings. Bei Zahlen als String funktioniert das nicht immer. In diesem Fall könnte es helfen, die Spalte nach int zu konvertieren oder die Konvertierung im SQL Statement vorzunehmen.
 
Deswegen wäre es ja sinnvoll, das Tabellenschema sowie den PHP-Code zu zeigen. Damit kann man ja recht schnell erkennen ob es sich um ein Problem mit den Datentypen handelt oder nicht. Ohne diese Infos kann man nur beliebig spekulieren.
 
Sorry das ich erst jetzt antworte. Also ich habe wirklich lange gesucht, den Fehler aber gefunden. Es war ein Schreibfehler im PHP Skript. Habe das ganze über die Logs rausgefunden.

Vielen Dank an alle die mir helfen wollten!
 
  • Gefällt mir
Reaktionen: Raijin und BeBur
Zurück
Oben