[gelöst] Unerklärliche Fehlermeldung bei SQL bei PHP-Format Eingabe
am 03.02.2010 - 07:26 Uhr in
Hallo ich bekomme folgende Fehlermeldung obwohl Abfrage korrekte Ergebnisse erzeugt. Kann mir das jemand erklären? (unten noch das entsprechende Skript)
user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AS sq1, (SELECT n.title as title, n.type as type, u.name as name, 2 * COUNT(su' at line 12 query: SELECT COUNT(*) FROM node n LEFT JOIN signup_log su ON su.nid = n.nid LEFT JOIN users u ON u.uid = su.uid, (SELECT nod.type as type, COUNT(nod.title) as anzahl FROM node nod, event e WHERE nod.title LIKE "%Damen 1%" AND nod.nid = e.nid AND e.event_start < NOW() AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2),SUBSTRING(e.event_start,9,2)) > "20090831" GROUP BY nod.type) AS gesamt, event e WHERE n.nid = e.nid AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2),SUBSTRING(e.event_start,9,2)) > "20090831" AND e.event_start < NOW() AND n.type = gesamt.type AND n.type = "Spieltag" AND su.attended <> "" GROUP BY u.name, n.type) AS sq1, (SELECT n.title as title, n.type as type, u.name as name, 2 * COUNT(su.attended) - SUM(su.attended) as teilnahme, SUM(su.attended) - COUNT(su.attended) as kteilnahme, CONCAT(FORMAT((2 * COUNT(su.attended) - SUM(su.attended))/gesamt.anzahl * 100,2),"%")as ateilnahme FROM node n LEFT JOIN signup_log su ON su.nid = n.nid LEFT JOIN users u ON u.uid = su.uid, (SELECT nod.type as type, COUNT(nod.title) as anzahl FROM node nod, event e WHERE nod.title LIKE "%Damen 1%" AND nod.nid = e.nid AND e.event_start < NOW() AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2)) > "200909" GROUP BY nod.type) AS gesamt, event e WHERE n.title LIKE "%Damen 1%" AND n.nid = e.nid AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2)) > "200909" AND e.event_start < NOW() AND n.type = gesamt.type AND n.type = "Training" AND su.attended <> "" GROUP BY u.name, n.type) AS sq2 WHERE sq1.name = sq2.name in /usr/www/users/volley/includes/common.inc(1685) : eval()'d code on line 47.
<?php
$sql = 'SELECT sq1.name as spieler, sq1.teilnahme as tteilnahme, sq1.kteilnahme as tkteilnahme, sq1.ateilnahme as tanzahl, sq2.teilnahme as steilnahme, sq2.kteilnahme as skteilnahme, sq2.ateilnahme as sanzahl
FROM
(SELECT n.title as title, n.type as type, u.name as name, 2 * COUNT(su.attended) - SUM(su.attended) as teilnahme, SUM(su.attended) - COUNT(su.attended) as kteilnahme,
CONCAT(FORMAT((2 * COUNT(su.attended) - SUM(su.attended))/gesamt.anzahl * 100,2),"%") as ateilnahme
FROM node n LEFT JOIN signup_log su ON su.nid = n.nid LEFT JOIN users u ON u.uid = su.uid,
(SELECT nod.type as type, COUNT(nod.title) as anzahl FROM node nod, event e
WHERE nod.title LIKE "%Damen 1%" AND nod.nid = e.nid AND e.event_start < NOW()
AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2),SUBSTRING(e.event_start,9,2)) > "20090831"
GROUP BY nod.type) AS gesamt, event e
WHERE n.nid = e.nid
AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2),SUBSTRING(e.event_start,9,2)) > "20090831"
AND e.event_start < NOW()
AND n.type = gesamt.type
AND n.type = "Spieltag"
AND su.attended <> ""
GROUP BY u.name, n.type) AS sq1,
(SELECT n.title as title, n.type as type, u.name as name, 2 * COUNT(su.attended) - SUM(su.attended) as teilnahme, SUM(su.attended) - COUNT(su.attended) as kteilnahme,
CONCAT(FORMAT((2 * COUNT(su.attended) - SUM(su.attended))/gesamt.anzahl * 100,2),"%")as ateilnahme
FROM node n LEFT JOIN signup_log su ON su.nid = n.nid LEFT JOIN users u ON u.uid = su.uid,
(SELECT nod.type as type, COUNT(nod.title) as anzahl FROM node nod, event e
WHERE nod.title LIKE "%Damen 1%" AND nod.nid = e.nid AND e.event_start < NOW()
AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2)) > "200909"
GROUP BY nod.type) AS gesamt, event e
WHERE n.title LIKE "%Damen 1%"
AND n.nid = e.nid
AND CONCAT(SUBSTRING(e.event_start,1,4),SUBSTRING(e.event_start,6,2)) > "200909"
AND e.event_start < NOW()
AND n.type = gesamt.type
AND n.type = "Training"
AND su.attended <> ""
GROUP BY u.name, n.type) AS sq2
WHERE sq1.name = sq2.name
ORDER BY tanzahl DESC, sanzahl DESC, spieler ASC';
$header = array(
array('data' => 'Spieler', 'field' => 'spieler'),
array('data' => 'Anwesend', 'field' => 'tteilnahme'),
array('data' => 'Abwesend', 'field' => 'tkteilnahme'),
array('data' => 'Quote Training', 'field' => 'tanzahl'),
array('data' => 'Anwesend', 'field' => 'steilnahme'),
array('data' => 'Abwesend', 'field' => 'skteilnahme'),
array('data' => 'Quote Spiel', 'field' => 'sanzahl')
);
$result = pager_query($sql, 500);
while ($data = db_fetch_object($result)) {
$rows[] = array($data->spieler,
$data->tteilnahme,
$data->tkteilnahme,
$data->tanzahl,
$data->steilnahme,
$data->skteilnahme,
$data->sanzahl);
}
if (!$rows) {
$rows[] = array(array('data' => t('Empty at the moment..'), 'colspan' => '4'));
}
echo theme('table', $header, $rows);
echo theme('pager', NULL, 50, 0);
?>- Anmelden oder Registrieren um Kommentare zu schreiben

Hi, zu allererst würde ich
am 03.02.2010 - 09:25 Uhr
Hi,
zu allererst würde ich vorschlagen, dass du die Anfrage so schreibst, dass sie zum Drupal Coding Standard passt.
Dann schau dir mal die Zeile an:
GROUP BY u.name, n.type) AS sq1,
mfg Cyberschorsch
_________
Mei is des schee
Drupal Coding Standard
am 03.02.2010 - 09:34 Uhr
Hallo Cyberschorsch,
danke für Deine Antwort...Aber was ist das?
Drupal Coding Standard
am 03.02.2010 - 10:10 Uhr
Hallo,
http://drupal.org/contributors-guide
hinsichtlich sql Anfragen solltest du darauf achten, dass die Tabellennamen in geschweiften Klammern stehen, Werte nicht direkt in der Anfrage stehen sondern als parameter per db_query übergeben werden, usw.
Kleines Beispiel, wie man bspw. alle Nodes des eingeloggten Users anzeigt (nicht getestet):
//Get the global $user (holds the information of current userglobal $user;
//Get every node the user has created
$sql = "Select n.title
From {node} n, {users} user
Where user.uid = %d
And n.uid = user.uid";
//Get the result, passing the current uid to the sql query
$result = db_query($sql, $user->uid);
Wie du siehst, hab ich jetzt in der SQL Anfrage die Userid mit einem Platzhalter belegt und erst bei der db_query Funktion den Wert mit übergeben. Du kannst da auch fixe Werte eingeben. Sinn der Sache ist, dass die Database Layer von Drupal SQL Injections verhindern soll.
mfg Cyberschorsch
_________
Mei is des schee
den Coding Standard in Praxis sehen
am 03.02.2010 - 10:35 Uhr
Auf die Idee, mal im Code anderer Module wie beispielsweise dem Node Modul oder dem Taxonomy Modul usw., bist Du offenbar noch nicht gekommen.
Da kannst Du den Coding Standard in Praxis sehen.
------------------------
Quiptime Group
Da es sich bei Deinem
am 03.02.2010 - 10:43 Uhr
Da es sich bei Deinem SQL-Statement um eine ziemlich komplexe Geschichte handelt die ganz dumme Frage: Hast Du die Abfrage mal in PhpMyAdmin vorher getestet? Es könnte sich ja um ein "schlichtes" Problem der SQL-Syntax handeln.
Beste Grüße
Werner
PHPmyAdmin sagt, das alles okay ist, aber...
am 04.02.2010 - 17:55 Uhr
was ist an der Zeile:
"GROUP BY u.name, n.type) AS sq1,"
falsch?!
Ist es ein Problem, dass Drupal Schwierigkeiten mit Subselect..
am 08.02.2010 - 08:14 Uhr
...hat? Auch bei dem Code:
<?php
$sql = 'SELECT @rownum:=@rownum+1 as platz, result.* FROM (SELECT @rownum:=0) AS r,
(SELECT ck.field_konkurrenz_value as konkurrenz, n.title as team, cb.field_punkte_value as punkte
FROM {node} n, {content_field_konkurrenz} ck, {content_type_ranglistenbasis} cb
WHERE n.type = "Ranglistenbasis"
AND n.vid = ck.vid
AND n.vid = cb.vid
ORDER BY cb.field_punkte_value DESC) AS result';
$header = array(
array('data' => 'Platz', 'field' => 'platz'),
array('data' => 'Konkurrenz', 'field' => 'konkurrenz'),
array('data' => 'Team', 'field' => 'team'),
array('data' => 'Punkte', 'field' => 'punkte')
);
$result = pager_query($sql, 500);
while ($data = db_fetch_object($result)) {
$rows[] = array($data->platz,
$data->konkurrenz,
$data->team,
$data->punkte
);
}
if (!$rows) {
$rows[] = array(array('data' => t('Empty at the moment..'), 'colspan' => '4'));
}
echo theme('table', $header, $rows);
echo theme('pager', NULL, 50, 0);
?>
kommt folgende Fehlermeldung:
user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6 query: SELECT COUNT(*) FROM (SELECT @rownum:=0) AS r, (SELECT ck.field_konkurrenz_value as konkurrenz, n.title as team, cb.field_punkte_value as punkte FROM node n, content_field_konkurrenz ck, content_type_ranglistenbasis cb WHERE n.type = "Ranglistenbasis" AND n.vid = ck.vid AND n.vid = cb.vid in /usr/www/users/volley/includes/common.inc(1685) : eval()'d code on line 18.
die ursprüngliche Syntax hab ich korrigiert zu:...
am 08.02.2010 - 08:16 Uhr
<?php
$sql = 'SELECT sq1.name as spieler, sq1.teilnahme as tteilnahme, sq1.kteilnahme as tkteilnahme, sq1.ateilnahme as tanzahl, sq2.teilnahme as steilnahme, sq2.kteilnahme as skteilnahme, sq2.ateilnahme as sanzahl
FROM
(SELECT SUM(su.attended) as teilnahme,
COUNT(su.attended) - SUM(su.attended) as kteilnahme,
CONCAT(FORMAT((SUM(su.attended))/gesamt.anzahl * 100,2),"%") as ateilnahme, n.type, u.name, e.event_start
FROM {signup_log} su, {node} n, {users} u, {event} e,
(SELECT nod.type as type, COUNT(nod.title) as anzahl
FROM {node} nod, {event} eve WHERE nod.title LIKE "%Damen 1%" AND nod.nid = eve.nid AND eve.event_start < NOW() AND eve.event_start > "2009-08-31 23:59:59" GROUP BY nod.type) AS gesamt
WHERE n.nid = su.nid
AND n.nid = e.nid
AND u.uid = su.uid
AND n.title LIKE "%Damen 1%"
AND e.event_start > "2009-08-31 23:59:59"
AND e.event_start < NOW()
AND n.type = "Training"
AND n.type = gesamt.type
GROUP BY u.name, n.type) AS sq1,
(SELECT SUM(su.attended) as teilnahme,
COUNT(su.attended) - SUM(su.attended) as kteilnahme,
CONCAT(FORMAT((SUM(su.attended))/gesamt.anzahl * 100,2),"%") as ateilnahme,
n.type, u.name, e.event_start
FROM {signup_log} su, {node} n, {users} u, {event} e,
(SELECT nod.type as type, COUNT(nod.title) as anzahl
FROM {node} nod, {event} eve WHERE nod.title LIKE "%Damen 1%" AND nod.nid = eve.nid AND eve.event_start < NOW() AND eve.event_start > "2009-08-31 23:59:59" GROUP BY nod.type) AS gesamt
WHERE n.nid = su.nid
AND n.nid = e.nid
AND u.uid = su.uid
AND n.title LIKE "%Damen 1%"
AND e.event_start > "2009-08-31 23:59:59"
AND e.event_start < NOW()
AND n.type = "Spieltag"
AND n.type = gesamt.type
GROUP BY u.name, n.type) AS sq2
WHERE sq1.name = sq2.name
ORDER BY tteilnahme DESC, steilnahme DESC, spieler ASC';
$header = array(
array('data' => 'Spieler', 'field' => 'spieler'),
array('data' => 'Anwesend', 'field' => 'tteilnahme'),
array('data' => 'Abwesend', 'field' => 'tkteilnahme'),
array('data' => 'Quote Training', 'field' => 'tanzahl'),
array('data' => 'Anwesend', 'field' => 'steilnahme'),
array('data' => 'Abwesend', 'field' => 'skteilnahme'),
array('data' => 'Quote Spiel', 'field' => 'sanzahl')
);
$result = pager_query($sql, 500);
while ($data = db_fetch_object($result)) {
$rows[] = array($data->spieler,
$data->tteilnahme,
$data->tkteilnahme,
$data->tanzahl,
$data->steilnahme,
$data->skteilnahme,
$data->sanzahl);
}
if (!$rows) {
$rows[] = array(array('data' => t('Empty at the moment..'), 'colspan' => '4'));
}
echo theme('table', $header, $rows);
echo theme('pager', NULL, 50, 0);
?>
PHPmyAdmin meldet keinerlei Probleme, aber bei Drupal 6.x Folgendes:
user warning: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AS sq1, (SELECT SUM(su.attended) as teilnahme, COUNT(su.attended) - SUM(su.a' at line 12 query: SELECT COUNT(*) FROM signup_log su, node n, users u, event e, (SELECT nod.type as type, COUNT(nod.title) as anzahl FROM node nod, event eve WHERE nod.title LIKE "%Damen 1%" AND nod.nid = eve.nid AND eve.event_start < NOW() AND eve.event_start > "2009-08-31 23:59:59" GROUP BY nod.type) AS gesamt WHERE n.nid = su.nid AND n.nid = e.nid AND u.uid = su.uid AND n.title LIKE "%Damen 1%" AND e.event_start > "2009-08-31 23:59:59" AND e.event_start < NOW() AND n.type = "Training" AND n.type = gesamt.type GROUP BY u.name, n.type) AS sq1, (SELECT SUM(su.attended) as teilnahme, COUNT(su.attended) - SUM(su.attended) as kteilnahme, CONCAT(FORMAT((SUM(su.attended))/gesamt.anzahl * 100,2),"%") as ateilnahme, n.type, u.name, e.event_start FROM signup_log su, node n, users u, event e, (SELECT nod.type as type, COUNT(nod.title) as anzahl FROM node nod, event eve WHERE nod.title LIKE "%Damen 1%" AND nod.nid = eve.nid AND eve.event_start < NOW() AND eve.event_start > "2009-08-31 23:59:59" GROUP BY nod.type) AS gesamt WHERE n.nid = su.nid AND n.nid = e.nid AND u.uid = su.uid AND n.title LIKE "%Damen 1%" AND e.event_start > "2009-08-31 23:59:59" AND e.event_start < NOW() AND n.type = "Spieltag" AND n.type = gesamt.type GROUP BY u.name, n.type) AS sq2 WHERE sq1.name = sq2.name in /usr/www/users/volley/includes/common.inc(1685) : eval()'d code on line 50.
Was ist an GROUP BY u.name, n.type) AS sq1, Falsch?
am 10.02.2010 - 08:08 Uhr
PHPmyAdmin meldet keine Fehlermeldung, was muss ich in Drupal machen, damit keine Fehlermeldung erscheint?
Wäre Euch um Ratschläge sehr dankbar!
Grüße Christian
SQL
am 10.02.2010 - 08:34 Uhr
Ich würde mit einer vereinfachten Version des SQL-Befehls starten und den dann langsam, Stück für Stück zu diesem unübersichtlichen Monster erweitern. So siehst Du, bei welcher Komplexität der Fehler auftritt.
Und ich würde
"mit'vertauschen.Stefan
--
Sei nett zu Deinem Themer!
reduzierte SQL
am 11.02.2010 - 11:12 Uhr
Also ich habe es jetzt mal beschränkt auf:
SELECT sq1.name as spieler FROM
(SELECT SUM(su.attended) as teilnahme, n.type, u.name
FROM {signup_log} su, {node} n, {users} u
WHERE n.nid = su.nid
AND u.uid = su.uid
GROUP BY u.name, n.type) AS sq1
Da taucht der Fehler immer noch auf... :-(
Versuch: SELECT u.nameFROM
am 11.02.2010 - 11:19 Uhr
Versuch:
SELECT u.nameFROM {signup_log} su, {node} n, {users} u
WHERE n.nid = su.nid
AND u.ui= su.uid
GROUP BY u.name, n.type
mfg Cyberschorsch
_________
Mei is des schee
naja das ist ja nur ein teil der syntax...
am 11.02.2010 - 11:22 Uhr
ich brauche ja das SUBSELECT um noch mehr Daten (Summenwerte, etc.) aus sq1 zu bekommen...
So wie das dann aussieht,
am 11.02.2010 - 11:35 Uhr
So wie das dann aussieht, kommt die Drupal Datenbankschicht nicht mit dem in MySql erlaubten SUBSELECT klar. Da hilft nur ein Issue aufmachen.
Beste Grüße
Werner
oder noch einfacher...
am 11.02.2010 - 14:15 Uhr
$sql = "SELECT sq1.type as typ FROM
(SELECT SUM(su.attended) as teilnahme, n.type
FROM {signup_log} su, {node} n
WHERE n.nid = su.nid
GROUP BY n.type) AS sq1";
Was meinst Du mit Issue aufmachen? Was ist das?
Grüße Christian
Auf Drupal.org einen Issue
am 11.02.2010 - 14:40 Uhr
Auf Drupal.org einen Issue bei der Datenbankschicht des Drupal Cores eintragen, damit das zentral gelöst wird.
Beste Grüße
Werner
issue
am 11.02.2010 - 14:42 Uhr
Aber bittte vorher ausführlich schauen (und suchen), ob es nicht bereits eine vergleichbare Anfrage gab. Das vergessen nämlich manche Leute immer mal wieder gerne.
Stefan
--
Sei nett zu Deinem Themer!
hat denn keiner von Euch Erfahrung mit SUBSELECTS?
am 12.02.2010 - 14:04 Uhr
... habe mal ne ähnliche Fehlermeldung bekommen wenn man im Subselect Order BY macht, ich denke es liegt am GROUP BY, aber kA?
Weiß jemand ne Dokumentation / Buch...
am 15.02.2010 - 12:18 Uhr
...wo SQL-Statements für Drupal erklärt werden?
Es muss doch möglich sein Statements der Art:
SELECT sq.name FROM (SELECT n.name AS name from node n) AS sq;
zu schreiben oder nicht?
hab den Fehler:
am 16.02.2010 - 12:10 Uhr
$result = db_query(db_rewrite_sql($sql, 'story', 1));
heißt es korrekt...