Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
07.01.2006, 19:10
K-Putt



Fortsetzung der Diskussion, die in diesem Thread begonnen hat.

Zitat thedon (unoptimierte Queries):
Quellcode:SELECT id FROM wb_threads WHERE id = 1
SELECT name FROM wb_threads WHERE id = 1
SELECT id, name, forum_id FROM wb_threads WHERE id = 1
SELECT name FROM wb_forums WHERE id = 1

SELECT COUNT(*) FROM wb_posts WHERE thread_id = 1

SELECT id, user_id, timestamp, text FROM wb_posts WHERE thread_id = 1 LIMIT 0,10
SELECT name FROM wb_users WHERE id = 1
SELECT name FROM wb_users WHERE id = 2
SELECT name FROM wb_users WHERE id = 3
SELECT name FROM wb_users WHERE id = 1
SELECT name FROM wb_users WHERE id = 2
SELECT name FROM wb_users WHERE id = 1
SELECT name FROM wb_users WHERE id = 3
SELECT name FROM wb_users WHERE id = 4
SELECT name FROM wb_users WHERE id = 9
SELECT name FROM wb_users WHERE id = 7
Zitat thedon (optimierte Queries):
Quellcode:1.) SELECT t.id, t.name, b.name FROM wb_threads t, wb_boards b WHERE t.id = 1 AND b.id = t.forum_id

2.) SELECT COUNT(id) FROM wb_posts WHERE thread_id = 1

3.) SELECT p.id, p.user_id, p.timestamp, p.text, u.name FROM wb_posts p WHERE t.thread_id = 1 LEFT OUTER JOIN wb_users u ON u.id = p.user_id LIMIT 0,10
Also. Query #1 und #2, wie von dir gepostet, sind klar.

Query #3 jedoch ist fehlerhaft.

So schlecht sind meine SQL Kenntnisse nun auch wieder nicht, also hab ich das t.thread_id in p.thread_id umbenannt, t wurde im Query nirgends definiert.

Trotzdem meldet die Kommandozeile nen Syntaxfehler- nur wo?
Die Bezeichnungen der Tabellen und Felder sind korrekt.

Quellcode:mysql> SELECT p.id, p.user_id, p.timestamp, p.text, u.name FROM wb_posts p WHERE p.thread_id = 1 LEFT OUTER JOIN wb_users u ON u.id = p.user_id
Quellcode:mysql> ERROR 1064: You have an error in your SQL syntax.  ...for the right syntax to use near 'LEFT OUTER JOIN wb_users u ON u.id = p.user_id' at line 1

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 07.01.2006 um 19:11 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
07.01.2006, 19:18
scus



so dann poste ich das ma hier:

Zitat:
zum thema 'aus funktionen heraus' könntest du so ne art klasse machen, die die thread daten verwaltet:
PHP-Quellcode:<?php
class thread {
 
$threaddata = array();

 function 
thread($id) {
  
$query 'SELECT id, name, ... FROM wb_threads WHERE id = $id';
  
$result mysql_query($query);
  ...

  
$this->threaddata['name'] = ...;
 }

 function 
getData($index) {
  return 
$this->threaddata[$index];
 }
}

$GLOBALS['thread'] = new thread(1);

$GLOBALS['thread']->getData('name');
usw.
?>
is mir grad so gekommen die idee, kA wie effektiv dat is

--

sincères amitiés scus
--
Tand, Tand ist das Gebilde von Menschenhand


Dieser Beitrag wurde am 07.01.2006 um 19:20 von scus bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
07.01.2006, 19:22
theDon



Zitat:
K-Putt postete
Query #3 jedoch ist fehlerhaft.

So schlecht sind meine SQL Kenntnisse nun auch wieder nicht, also hab ich das t.thread_id in p.thread_id umbenannt, t wurde im Query nirgends definiert.

Das t war ein Tippfehler. So sollte es laufen:

Quellcode:SELECT p.id, p.user_id, p.timestamp, p.text, u.name FROM wb_posts p LEFT OUTER JOIN wb_users u ON u.id = p.user_id WHERE p.thread_id = 1 LIMIT 0,10

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 07.01.2006 um 19:22 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
07.01.2006, 20:42
K-Putt



scus:
Danke, die Idee ist gut, werde ich umsetzen.

thedon:
Dein Tipp war Gold wert, funktioniert prächtig.
Werde das in Zukunft immer so handhaben.

Ne letzte Frage noch: Was passiert mit dem Query, wenn der Datensatz in der User-Tabelle nicht mehr existiert, auf den in der Post-Tabelle verwiesen wird?
Schlägt das gesamte Query fehl?
Bin zzt. nicht am Arbeitsrechner, kanns daher nicht testen.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
004
07.01.2006, 20:52
theDon



Das entsprechende Feld im Datensatz ist dann Null.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
005
08.01.2006, 20:05
K-Putt



Jetzt tut sich ein neues Problem in Verbindung mit PHP auf.

Frage ich ein Feld aus 2 Tabellen in einem Query ab (der name des Feldes lautet gleich), überschreit der eine Wert den anderen im Ergebnis.

Beispiel (Pseudo-Code):
Quellcode:SELECT t.id, t.forum_id, t.name, f.name FROM wb_threads t, wb_forums f WHERE t.id=1 AND t.forum_id=f.id
Holt man sich die Daten jetzt per mysql_fetch_array, oder mysql_fetch_assoc, kriegt man ein Array bzw. Objekt, welches so aussieht:

Quellcode:Array
{
[id] => 1
[forum_id] => 1
[name] => "Name des Forums" *
}
In der mit * markierten Stelle liegt das Problem => t.name wird durch f.name überschrieben.

Momentane Lösung: mysql_fetch_row verwenden, aber dann wird das Werte holen aus dem Array umständlich, weil die Keys 0...1...2 usw. lauten.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 08.01.2006 um 20:05 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
08.01.2006, 20:09
Adrian_Broher
Admin


Das sollte sich so lösen lassen (keine garantie):

Quellcode:SELECT t.id, t.forum_id, t.name AS threadname, f.name AS forumname FROM wb_threads t, wb_forums f WHERE t.id=1 AND t.forum_id=f.id
das sollte sich dann so selektieren lassen:

Quellcode:Array
{
[id] => 1
[forum_id] => 1
[threadname] => "Name des Threads"
[forumname] => "Name des Forums"
}

--

There is nothing wrong with high standards. It's your problem that you don't meet them.
If you think it's simple, then you have misunderstood the problem.
When a customer says "nothing has changed", assume they're lying.

zum Seitenanfang zum Seitenende Profil || Suche
007
08.01.2006, 21:10
K-Putt



Ich bin entzückt ;)

[edit]
Ich denke es soll einfach nicht sein...

Nun hab ich sämtliche Posts in einem Array ($posts), aber beim durchlaufen mit foreach() wird nach dem ersten Post die Schleife abgebrochen.

Code:
PHP-Quellcode:<?php
/* Der Inhalt von $posts sieht so aus:
Array
(
    [0] => Array
        (
            [id] => 5
            [user_id] => 1
            [name] => sro
            [timestamp] => 1134770365
            [text] => [b]Dieser Text soll fett erscheinen[/b]
        )

    [1] => Array
        (
            [id] => 6
            [user_id] => 1
            [name] => sro
            [timestamp] => 1134770766
            [text] => Test
        )

    [2] => Array
        (
            [id] => 7
            [user_id] => 1
            [name] => sro
            [timestamp] => 1134771630
            [text] => [i]Dieser Text soll kursiv erscheinen[/i]
        )
)
*/

// Schleife, vereinfacht
foreach($posts as $post)
{
    echo 
$post['id']."\n";
}
?>
Die Schleife sollte doch 3x durchlaufen, 1x für jedes Array in $posts, doch sie läuft nur 1x durch, und liefert den Wert des letzten Arrays in $posts.

Auch ein reset($posts); vor der Schleife brachte nichts.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 08.01.2006 um 21:22 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
08.01.2006, 22:03
Adrian_Broher
Admin


Sicher das das auch WIRKLICH der inhalt des $post arrays ist? Ich hab das gerade mal mit genau den Inhalten nachgebaut und er hat das foreach sauber durchgeführt.

zeig mal den source, der diese $posts array erzeugt bzw füllt.

--

There is nothing wrong with high standards. It's your problem that you don't meet them.
If you think it's simple, then you have misunderstood the problem.
When a customer says "nothing has changed", assume they're lying.

zum Seitenanfang zum Seitenende Profil || Suche
009
08.01.2006, 23:45
K-Putt



Das geschieht hier:

PHP-Quellcode:<?php
/* Auszug aus CThread */
class CThread
{
    var 
$posts = array();

    function 
ReadPosts($from$num)
    {
        global 
$db;

        if(
$this->thread_exists)
        {
            
$query $db->query("SELECT p.id,p.user_id,p.timestamp,p.text,u.name FROM ".DB_PREFIX."posts p LEFT OUTER JOIN ".DB_PREFIX."users u ON u.id=p.user_id WHERE p.thread_id=".$this->id." LIMIT ".$from.", ".$num);
            while(
$res $db->fetch_object($query))
            {
                
$this->posts[] = array("id" => $res->id"user_id" => $res->user_id"name" => ParseHTML($res->name), "timestamp" => $res->timestamp"text" => $res->text);
            }

            return 
$this->posts;
        }
        else
        {
            return 
false;
        }
    }
}
?>
die Posts landen auf jeden Fall im Array, was die Ausgabe von print_r($posts) zeigt. Nur die Schleife bricht beim durchlauf wie gesagt ab.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 08.01.2006 um 23:46 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
12.01.2006, 19:13
K-Putt



Ich verstehe die Welt nicht mehr...jetzt klappen gar keine Schleifen mehr?

Sowas wie:
PHP-Quellcode:<?php
for($i=0$i <= 4$i++);
{
echo 
$i." ";
}
?>
sollte doch "0 1 2 3 4" ausgeben.

Bei mir jedoch, wir nur "4" ausgegeben.
Was ist denn da kaputt?

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
011
12.01.2006, 19:26
hausi



Mach mal ein PHP-update... Vielleicht hat deine Version einen Bug.

--

zum Seitenanfang zum Seitenende Profil || Suche
012
12.01.2006, 20:39
Kriz



Mach mal das Semikolon hinter der for-Schleife weg o_O

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
013
12.01.2006, 20:39
K-Putt



Zitat:
Superhausi postete
Mach mal ein PHP-update... Vielleicht hat deine Version einen Bug.
Hab ich bereits vor meinem Post getan, jedoch ohne Erfolg.

Das Skript funktioniert übrigens auch beim Provider nicht, der wiederrum eine andere PHP-Version, sowie ein anderes OS einsetzt...

[edit]

Keine Ahnung was jetzt los ist, hab das File aus nem Backup zurückgespielt, die selbe Schleife erneut eingebaut, und jetzt funktionierts.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 12.01.2006 um 20:45 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
014
12.01.2006, 21:06
dp
Administrator


Zitat:
K-Putt postete
Zitat:
Superhausi postete
Mach mal ein PHP-update... Vielleicht hat deine Version einen Bug.
Hab ich bereits vor meinem Post getan, jedoch ohne Erfolg.

Das Skript funktioniert übrigens auch beim Provider nicht, der wiederrum eine andere PHP-Version, sowie ein anderes OS einsetzt...

[edit]

Keine Ahnung was jetzt los ist, hab das File aus nem Backup zurückgespielt, die selbe Schleife erneut eingebaut, und jetzt funktionierts.

guck dir mal #012 an.

--

zum Seitenanfang zum Seitenende Profil || Suche
015
12.01.2006, 21:06
HammerBlade



Wie Kirz schon sagt, das Komma Semikolon ist/war Schuld. Durch das Komma Semikolon ist der {}-Block nach der for-Schleife nicht der Rumpf dieser sondern der Rumpf ist leer. Die for-Schleife zählt dann gemütlich bis 4 und dann gibt das echo aus dem {}-Block, den du wohl eigentlich als Rumpf der for-Schleife haben wolltest, einmal das $i mit Inhalt 4 aus.

Edit 1: Der Thread hier hat einen Hang zu zeitgleichen Post :D
Edit 2: Hast natürlich recht Kriz (#017). Ich sollte nicht posten wenn ich müde bin...

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 12.01.2006 um 23:28 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
016
12.01.2006, 21:14
K-Putt



Meine Güte, also jetzt wirds wirklich peinlich.

Das kommt davon, wenn man beim Bund seine Zeit verplempern muss, und dadurch einfachste Grundregeln des programmierens vergisst.

Asche über mein Haupt, danke für die Hilfe.

Das foreach()-Problem besteht allerdings immer noch :/

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database


Dieser Beitrag wurde am 12.01.2006 um 21:15 von K-Putt bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
017
12.01.2006, 21:33
Kriz



@HammerBlade: Nicht das Komma war schuld, sondern das Semikolon. Idee erkannt, Ausführung verpatzt ;)

@K-Putt: Du machts deinem Namen geistig alle Ehre, hrhrhr. Naja, wie heißt es doch so schön? "Bitte Gehirn am Montagmorgen bei der Wache abgeben und Freitags nach Dienstschluß wieder abholen" :P

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
018
13.01.2006, 15:51
K-Putt



@Kriz

Ganz richtig, ein Glück dass jetzt Freitag ist ;)
Naja, ende Februar ist der Mist für mich abgeschlossen, und ich bin wieder frei \o/

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche