Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

MySQL Problem seit Version 5.7

W@ldemar / 9 Antworten / Baumansicht Nickles

Guten Abend allerseits.

Während unter MySQL 5.6 noch alles problemfrei ging, werden nach oder seit Aktualisierung seitens meines Providers auf MySQL 5.7 Fehler ausgegeben: 

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in.......

Konkret handelt es sich um folgenden Teil: 

 ....SUM(ROUND((zeit/60)))......

Hat jemand eine Ahnung, was hier verändert oder abgeändert werden muss? Mein Provider hat mir schon weitergeholfen und mitgeteilt, dass die neue Version 5.7 strenger ist, nur leider kann ich keinen Fehler finden. 

Viele Grüße

bei Antwort benachrichtigen
Borlander W@ldemar „MySQL Problem seit Version 5.7“
Optionen

Welchen Typ hat denn das Feld zeit?

Ich schieb das mal aufs Brett Programmieren…

bei Antwort benachrichtigen
W@ldemar Borlander „Welchen Typ hat denn das Feld zeit? Ich schieb das mal aufs Brett Programmieren“
Optionen

Danke für deine Antwort,

also das Feld "Zeit" ist vom Typ "int(11)"

Wenn ich per PHPmyadmin das ganze teste, zeigt er mir folgenden Fehler an:

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tabelle.datum' which is not functionally dependent
on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Wirklich schlau werde ich nicht daraus

bei Antwort benachrichtigen
Borlander W@ldemar „Danke für deine Antwort, also das Feld Zeit ist vom Typ int 11 Wenn ich per PHPmyadmin das ganze teste, zeigt er mir ...“
Optionen
#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tabelle.datum' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by Wirklich schlau werde ich nicht daraus

Da hast Du dann in der Vergangenheit eine vom ANSI-SQL Standard abweichende Toleranz von MySQL genutzt: Aufnahme von Feldern ohne Aggregatfunktion im SELECT-Statement nach denen nicht gruppiert wird. MySQL liefert in diesem Fall einen "zufälligen" Wert aus den betroffenen Zeilen. Bei funktionale Abhängigkeit hast Du dann keinen zufälligen Wert mehr, weil alle entsprechenden Werte identisch sind.

Du hast nun wahrscheinlich ein SQL-Query der Form:

SELECT a, AGGR(c)
FROM table
GROUB BY b;

Poste doch am besten mal das komplette Statement, dann kann ich Dir wahrscheinlich sofort sagen wo es hakt…

Gruß
Borlander

bei Antwort benachrichtigen
W@ldemar Borlander „Da hast Du dann in der Vergangenheit eine vom ANSI-SQL Standard abweichende Toleranz von MySQL genutzt: Aufnahme von ...“
Optionen

Hallihallo,

ich poste mal das, wovon ich hoffe, dass es ausreicht um den Fehler zu verstehen:

Fehler
SQL-Befehl: Dokumentation


select datum,km,DATE_FORMAT(datum,'2017') as jahr, ROUND(SUM(zeit/60),1) as zeit from training GROUP by jahr order by zeit desc limit 1

MySQL meldet: Dokumentation

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'tabelle.datum' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Ich habe herum experimentiert, wenn ich statt obigem String folgenden nehme, klappt es: Wenn ich einfach "datum,km" weglasse.....aber ich bin sicher, dass das grundsätzlich was faul ist in diesem obigen Befehl. 

select DATE_FORMAT(datum,'2017') as jahr, ROUND(SUM(zeit/60),1) as zeit from training GROUP by jahr order by zeit desc limit 1

bei Antwort benachrichtigen
Borlander W@ldemar „Hallihallo, ich poste mal das, wovon ich hoffe, dass es ausreicht um den Fehler zu verstehen: Fehler SQL-Befehl: ...“
Optionen
DATE_FORMAT(datum,'2017')

Was willst Du damit erreichen? '2017' erscheint mir kein sinnvoller Formatstring zu sein. Damit erzeugst Du doch nur einen Konstanten Wert womit das GROUP BY überflüssig wird (und auch order und limit).

Falls Du das Jahr aus jedem Datensatz ermitteln willst, warum nimmst Du dann nicht YEAR(datum) ?

Bei datum und km vermute ich, dass Du eigentlich ein Minimum oder Maximum haben willst und das bisher vielleicht zufällig funktioniert hat da die Datensätze in einer bestimmten Reihenfolge durchlaufen wurden…

Was soll die Abfrage liefert und was steht in den jeweiligen Feldern drin, bzw. welche Struktur hat die Tabelle? (mal SHOW CREATE TABLE nutzen)

bei Antwort benachrichtigen
W@ldemar Borlander „Welchen Typ hat denn das Feld zeit? Ich schieb das mal aufs Brett Programmieren“
Optionen

Ich habe herausgefunden, dass es möglicherweise etwas mit meiner veralteten Software zu tun hat, die ich auch per SQL wieder anpassen könnte, was ich nicht so gern würde, also lieber wäre mir den Fehler, den ich in meiner alten Software habe zu beheben. 

Mein Provider schlägt im Falle von Fehlern vor, folgendes beim Verbindungsaufbau zu nutzen, möchte ich eher als Workaround im worst case nutzen

SET SESSION sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
bei Antwort benachrichtigen
Borlander W@ldemar „MySQL Problem seit Version 5.7“
Optionen
mysql_fetch_object()

Btw.: die alte MySQL-Implementation für PHP ist auch deprecated. Solltest Du ggf. durch mysqli ersetzen…

https://dev.mysql.com/doc/apis-php/en/apis-php-mysql.html

bei Antwort benachrichtigen
W@ldemar Borlander „Btw.: die alte MySQL-Implementation für PHP ist auch deprecated. Solltest Du ggf. durch mysqli ersetzen ...“
Optionen

Ja, also das Script von mir ist uralt, 10 Jahre um genau zu sein, ist auch wirklich nur für den Hausgebrauch, leider entspricht es nicht dem Programmierstandard eines Könners, ich bin leider nur Hobbyprogrammierer auf sehr sehr altem Stand, daher auch diese Probleme, wenn etwas umgestellt wird, stehe ich da und hab keine Ahnung woran es hängt. 

bei Antwort benachrichtigen
Borlander W@ldemar „Ja, also das Script von mir ist uralt, 10 Jahre um genau zu sein, ist auch wirklich nur für den Hausgebrauch, leider ...“
Optionen

Umstellung von mysql_ auf mysqli_ ist u.U. sogar sehr einfach und kann sich im Extremfall sogar darauf beschränken die Namen der Funktionsaufrufe zu ersetzen. Wäre zumindest zu empfehlen bevor Dein Hoster auf PHP7 umstellt. Wann das genau passiert weiß ich nicht, aber auf jeden Fall hast Du dafür keine weiteren 10 Jahre mehr Zeit ;-)

bei Antwort benachrichtigen