zufaellige Auswahl einer Ergebniszeile

Gesperrt
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

zufaellige Auswahl einer Ergebniszeile

Beitrag von Halchteranerin »

Hallo,

ich versuche mal so langsam (baby steps :wink:), PHP zu lernen. Ein kleines Modul habe ich gerade fertig:

Code: Alles auswählen

<?php 
$pfad=$cfgClient[$client]["path"]["frontend"];//der Serverpfad zum Mandanten...
$spruchdatei=$pfad."sprueche.csv";//... ergaenzt um den Dateinamen.
$spruecheautorenarray=file($spruchdatei);//Einlesen der Dateiinhalte in Array
$zufallsspruch=array_rand($spruecheautorenarray);//Zufaellige Auswahl eines Arrayelements
$aktspruch=$spruecheautorenarray[$zufallsspruch];//Zuweisung des ausgewaehlten Arrayelements zu einer Variablen
$a = explode("§§§",$aktspruch);
echo '"'.trim($a[2]).'"';//Ausgabe des aktuellen Spruchs ...
if ($a[1]!="NULL") {echo ' ('.$a[1].')';}//... ggf. mit Angabe des Autors ...
else {echo ' (Autor unbekannt)';}// ... sonst 'Autor unbekannt'
?>
Ich habe eine Datenbanktabelle angelegt mit den Spalten ID (auto_increment), Autor und Spruch, und diese mit Daten gefuettert. Der Autor ist nicht immer bekannt, an diesen Stellen steht 'NULL'. Weil es mir einfacher erschien (war es am Ende auch), habe ich die Daten aus der DB in eine CSV-Datei exportiert, auf die ich mit obigem Modul zugreife, so dass bei jedem Laden der Seite ein zufaellig ausgewaehlter Spruch angezeigt wird.

Um aber meine PHP-Kenntnisse zu erweitern :), moechte ich gerne das gleiche direkt aus der Datenbanktabelle machen, also zufaellig einen Spruch auswaehlen und diesen anzeigen. Das Problem ist, dass mir einfach der Ansatzpunkt fehlt, denn bisher habe ich nur fertige Module geaendert, und das auch nur an den Stellen, wo ich (wenigstens ungefaehr) wusste, was ich tat. Daher helfen mir SelfPHP und php.net auch nicht wirklich weiter. :cry:

Erstes Problem:

Code: Alles auswählen

$query = "SELECT Autor, Spruch FROM ".$cfg["tab"]["spruchdestages"]." ";
funktioniert nicht. Die Tabelle heisst con_spruchdestages, und ich dachte, dass es analog zu anderen Queries funktionieren muesste. Aber wohl falsch gedacht. :cry: Wenigstens geht $query = "SELECT Autor, Spruch FROM con_spruchdestages"; Und $count = "SELECT COUNT (*) FROM con_spruchdestages";, um die Anzahl der Sprueche zu ermitteln. Aber was mache ich nun mit dem Ergebnis? Wie greife ich auf eine zufaellig ausgewaehlte Zeile zu? Bzw. was liefert ueberhaupt die erste Abfrage? Ein Array?

Auf Hilfe hoffend
Christa
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

Schau dir mal die Doku zur PHPlib an (phplib.sf.net oder ähnlich). Wichtig ist, daß du zuerst einen query-aufruf machst (und nicht nur $query = "QUERY" schreibst, da dies nur den SQL-string in $query speichert) sowie zumindest ein next_record aufrufst, damit die nächste (also erste) Zeile zurückgeliefert wird.

mit $db->f("feldname") kommst du an das feld.
Darth-Vader
Beiträge: 661
Registriert: So 25. Jan 2004, 19:06
Wohnort: Stuttgart-Bad Cannstatt
Kontaktdaten:

Beitrag von Darth-Vader »

du hast ja per count(*) die anzahl der sprüche / zeilen in mysql, nun gehst du hin und packst die in ein array mit jeweils einer zahl als key von 0 aufwärts halt...

dann generierst du eine zufallszahl zwischen 0 und der anzahl der zeilen.

diese zahl stellt dann den index deiner zufällig gewählten zeile dar, bsp:

Code: Alles auswählen

$zufallszahl = 5;
$zufalls_spruch = $sprueche_aus_DB[$zufallszahl];
nemhen wir also an, du hast die zufallszahl "5" erhalten,
dann holst du dir eben das 5. element aus dem array deiner sprüche... ;)


so long,
Darth. :twisted:
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

Darth-Vader hat geschrieben:du hast ja per count(*) die anzahl der sprüche / zeilen in mysql
schoen waer's, ich komme nicht mal SO weit. :cry:

Fuer den Anfang (wir wollen ja nicht gleich uebertreiben :wink:) habe ich mich daran versucht, die Anzahl der Sprueche auszugeben, und zwar folgendermassen:

Code: Alles auswählen

<?php 
$db = new DB_Contenido;
$count = "SELECT COUNT (*) AS anzahl FROM con_spruchdestages";
$db->query($count); 
$db->next_record(); 
$anzahlsprueche = $db->f("anzahl");
echo $anzahlsprueche;
?>
Ergebnis: nix, ausser Eintraege im errorlog:

Code: Alles auswählen

[24-May-2004 09:01:28] Invalid SQL: SELECT COUNT (*) AS anzahl FROM con_spruchdestages<br><br>
[24-May-2004 09:01:28] next_record called with no query pending.
Die Frage ist: was passt ihm an meiner SQL-Anweisung nicht, ausser dass bei allen anderen Beispielen, die ich mir angeschaut habe, noch ein WHERE-Teil dabei war, der aber eigentlich optional ist?
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

Darth-Vader hat geschrieben:du hast ja per count(*) die anzahl der sprüche / zeilen in mysql, nun gehst du hin und packst die in ein array mit jeweils einer zahl als key von 0 aufwärts halt...

dann generierst du eine zufallszahl zwischen 0 und der anzahl der zeilen.

diese zahl stellt dann den index deiner zufällig gewählten zeile dar, bsp:

Code: Alles auswählen

$zufallszahl = 5;
$zufalls_spruch = $sprueche_aus_DB[$zufallszahl];
nemhen wir also an, du hast die zufallszahl "5" erhalten,
dann holst du dir eben das 5. element aus dem array deiner sprüche... ;)


so long,
Darth. :twisted:
das geht auch ein bisschen einfacher. zum einen steht mit array_rand() eine php-funktion zur verfügung, die unmittelbar einen eintrag (oder auch mehrere einträge) aus dem array extrahiert.

bei einer grossen zahl von einträgen würde ich allerdings unbedingt verzichten wollen, alle einträge zu fetchen. die fetch-routinen benötigen oftmals mehr ressourcen als das absetzen der abfrage.

ich würde deshalb in einem ersten schritt die anzahl einträge ermitteln, dann eine zufallszahl ($rand) ermitteln und dann die abfrage bereits auf mysql-niveau entsprechend limitieren, damit man nur einen eintrag erhält:

Code: Alles auswählen

[...] LIMIT $rand, $rand+1
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

kummer hat geschrieben: bei einer grossen zahl von einträgen würde ich allerdings unbedingt verzichten wollen, alle einträge zu fetchen. die fetch-routinen benötigen oftmals mehr ressourcen als das absetzen der abfrage.

ich würde deshalb in einem ersten schritt die anzahl einträge ermitteln, dann eine zufallszahl ($rand) ermitteln und dann die abfrage bereits auf mysql-niveau entsprechend limitieren, damit man nur einen eintrag erhält:
Du magst recht haben, zumindest klingt's vernuenftig, aber das ist schon Optimierung, und mein Problem setzt vorher an: ich kriege noch nicht mal die Anzahl der Eintraege ausgegeben. :cry: Sollte ich aber weiterkommen, werde ich Deinen Vorschlag auch beruecksichtigen, denn es sind immerhin ueber 1000 Eintraege, und je nach Zufallszahl (wenn die nicht gerade aus dem oberen Bereich kommt :) ) kann das schon Ressourcen sparen.
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

aus meiner sicht ist alles richtig. allerdings könnte ich mir vorstellen, dass probleme auftreten könnten, wenn zwischen dem count und der klammer eine lücke ist:

Code: Alles auswählen

count (*)
ich würde es mal ohne lücke versuchen:

Code: Alles auswählen

count(*)
aber sonst müsste es gehen. eine where-klausel wird nicht benötigt, wenn keine einschränkungen vorgenommen werden sollen.

hilfreich ist übrigens auch, wenn du den query zuvor in phpmyadmin absetzt und schaust, was du dort für eine fehlermeldung erhälst.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

noch ein kleiner tipp am rande: ich würde für eigene tabellen eine eigene präfix verwenden. der vorteil der präfixe ist ja der, eigene tabellen von denen von contenido unterscheiden zu können, wenn du mal ein update vornehmen willst.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin »

kummer hat geschrieben: hilfreich ist übrigens auch, wenn du den query zuvor in phpmyadmin absetzt und schaust, was du dort für eine fehlermeldung erhälst.
Ufff, danke fuer den Tip, aber zum Glueck hast Du das mit dem Leerzeichen vorher geschrieben, denn dieses schlaue PHPMyAdmin hat 'natuerlich' das Leerzeichen geloescht, bevor es die Anfrage abgesetzt hat, da haette ich lange den Fehler suchen koennen!

So, der erste Schritt klappt endlich, ich mache mal mit dem zweiten weiter. ;-) Danke erstmal!
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

Noch ein Tip: "Contenido" an sich macht weder mit deinen SQL-Statements noch mit deinem PHP-Code irgendwelche Tricks (ausser die CMS_-Sachen). Wenn man das zu Herzen nimmt, erspart man sich viele graue Haare! ;)
Gesperrt