Antworten auf deine Fragen:
Neues Thema erstellen

PHP implode, Trennzeichen mit Variable

owieortho

Aktives Mitglied

Hallo liebe Forengenies,

nachdem mir ja heute morgen schon so trefflich geholfen wurde, stehe ich jetzt mit dem anderen Bein auf dem Schlauch...
Ich will folgende SQL-Query konstruieren (das ist nur der SELECT-Teil):
PHP:
avg( `q1` ) AS durchnittq1, avg( `q2` ) AS durchnittq2, avg( `q3` ) AS durchnittq3, etc. pp.
Hierbei kommen q1, q2, q3, etc jeweils zweimal vor. Ich habe das bis hierher so gelöst:
PHP:
$sql = "SELECT q_id FROM ....  WHERE .....";
    $count = mysql_query ($sql);
    while ($row = mysql_fetch_array ($count))
    $rows[] = $row;
   
    $pos = array();
    foreach ($rows AS $row) {
    $pos[] = $row['q_id'];
    }
    $select_string = implode ('\') AS durchschnitt'.$pos.', AVG(\'',$pos);
    $select_string = "AVG('".$select_string."')";
    echo $select_string;
Das Echo gibt mir aus: AVG('q1') AS durchschnittArray, AVG('q2') AS durchschnittArray, AVG('q3') AS durchschnittArray....
Gebe ich im implode durchschnitt'.$pos[].' an, bekomme ich eine Fehlermeldung das [] nicht zum Lesen genutzt werden kann (Cannot use [] for reading...).
Mit der Bitte um Erleuchtung.

Vielen Dank und viele Grüße
O.
 

holdudiladio

Noch nicht viel geschrieben

Nachdem ich mir deinen Code angeschaut habe, hätte ich zwei Anmerkungen.
  • Die Schreibweise $pos[] dient nur dazu einen neuen Datensatz an das Array $pos anzuhängen. Für einen lesenden Zugriff, musst du den Schlüssel angeben, der ausgelesen werden soll. Also z.B. $pos['text'] oder $pos[3], jenachdem ob du ein assoziatives oder numerisches Array verwendest. Deshalb gibt es diese "Cannot use for reading..." Fehlermeldung.
  • Du verwendest den Befehl implode nicht ganz richtig. Das Trennzeichen muss ein string sein, der dann zwischen die Datensätze des Arrays gesetzt wird.
    Wenn du die Werte von $pos mitten in einem string haben willst, ist eine Schleife über die Werte besser geeignet um dir deinen Ausgabestring zu konstruieren.
Hoffe das hilft dir weiter.
 

owieortho

Aktives Mitglied

Danke @
So ganz durch bin ich noch nicht. Vielleicht wird es verständlicher, wenn ich den Hintergrund beschreibe. Ich habe zwei Datentabellen:
Tabelle 1:
id | Frage
---------------------
q1 | Text Frage 1
q2 | Text Frage 2


Tabelle 2:
... | q1 | q2 | ...
--------------------
... | Zahl | Zahl | ...
... | Zahl | Zahl | ...


Mein gewünschtes Ergebnis soll eine Tabelle sein:
Text Frage 1 | Mittelwert Zahlen q1
Text Frage 2 | Mittelwert Zahlen q2
......usw.
Ich habe den Rat befolgt und jetzt den String für die SELECTS nicht mit implode konstruiert. Aber wie kriege ich jetzt die separaten foreach-Schleifen abwechselnd zur Füllung der zweiten Tabellenzelle jeder Zeile?
PHP:
$sql = "SELECT q, de FROM fragen WHERE `type` = 'radio'";
    $count = mysql_query ($sql);
    while ($row = mysql_fetch_array ($count))
    $rows[] = $row;
  
    foreach ($rows AS $pos) {
    $p = $pos['q'];
    $select = $select."AVG(`".$p."`) AS avg".$p.", ";
    $where = $where."`".$p."`<>0 AND `".$p."`<6 AND ";
}
$select = rtrim($select,", ");
$where = rtrim($where,", AND ");

    $sql = "SELECT ".$select." FROM `codes` WHERE ".$where;

    $result = mysql_query ($sql);
    while ($avg = mysql_fetch_array ($result))
    $rows2[] = $avg;
  
    foreach ($rows AS $row) {
    $question = $row['de'];
    echo "<tr>\n<td>".$question."</td>\n<td>?????????</td></tr>\n";
    }
Herzlichen Dank
O.

 

holdudiladio

Noch nicht viel geschrieben

PHP:
echo "<tr><td>" . $question . "</td><td>" . $rows2['avg' . $row['q']] . "</td></tr>";
Dies sollte die Ausgabe erzeugen.
Da du uns den Hintergrund der ganzen Sache verraten hast, gehe ich davon aus, dass sich deine gewünschte Tabelle bereits mit einer einzigen Abfrage realisieren lässt. Meine SQL-Kenntnisse sind nur nicht gut genug, um sowas einfach aus dem Ärmel zu schütteln. Vielleicht weiß das jemand, der sich besser mit verschachtelten Abfragen auskennt.

So als Tip noch: Du solltest versuchen Schleifen, die die selben Datensätze iterieren, zusammenzufassen.
PHP:
$select = '';
$where = '';
while ($row = mysql_fetch_array ($count)){
$rows[] = $row;
$select .= "AVG(`" . $row['q'] . "`) AS `avg" . $row['q'] . "`, ";
$where .= "`" . $row['q'] . "`<>0 AND `" . $row['q'] . "`<6 AND ";
}
 

ovbb

es gibt für alles eine weg

muss gestehen, dass ich noch nicht richtig verstanden habe was du möchtest?
wie hängen den tabelle 1 & 2 denn zusammen?
welche schlüssel gibt es?
was sollte die aussage der abfrage sein?
...

außerdem könnte man sich auch fragen:
sind die tabellen normalisiert (normalformen)?
wieviele datensätze hat das ganze?
muss die performance der abfrage hoch sein oder reicht es aus wenn das rauskommt was man will?
...

hoffe doch, dass wir gemeinsam das problem erarbeiten können :)


edit: hab gerade deinen anderen post gesehen (lese leider von oben nach unten :)) und frag mich gerade ob du die ergebnisse der abfragen auch auf plausibilität überprüft hast? kommt das raus was du wirklich haben möchtest?
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.635
Beiträge
1.538.449
Mitglieder
67.556
Neuestes Mitglied
Ggirl
Oben