Zufallszugriff auf MySQL-DB klappt net
zwerg
- php
Glück auf!
Ich bin am verzweifeln. Habe aus einem Buch ein Skript für
ein Zufallsmotto abgeschrieben. In der MySQL-Tabelle:
"motto_tabelle" habe ich z. Zt. 4 Einträge und will diese
(und später weitere) mit PHP auslesen.
Jetzt suche ich schon seit 4 Stunden nach dem Fehler,
weil ich - wie gesagt - das Skript nahezu inhaltsgleich
abgeschrieben hab (lediglich der Name der Tabelle ist
anders).
Wäre nett, wenn sich jmd. mal das Skript ansieht, ob
er da einen (oder mehrere) Fehler findet:
<!-- Verbindung zur Datenbank aufbauen -->
<?php include ("../MySQL/mysql.inc"); ?>
<!-- Ermittlung einer Zufallszahl aus der Gesamtzahl der Tabelleneinträge -->
<?php
$query = "SELECT COUNT(*) FROM motto_tabelle";
$sql = mysql_query ($query);
$max = mysql_result ($sql,0);
$id = rand (1,$max);
?>
<!-- Schreiben des zufälligen Tabelleneintrages in Variablen -->
<?php
$query = "SELECT motto, quelle FROM motto_tabelle WHERE id = $id";
$sql = mysql_query($query);
$ds = mysql_fetch_object($sql);
$motto = htmlentities ($ds -> motto);
$quelle = htmlentities($ds -> quelle);
mysql_close($dz);
?>
Die Verbindung wird offenbar richtig aufgebaut. Habe
das getestet, indem ich mir alle Inhalte der Tabelle
fehlerfrei anzeigen lassen hab.
Das Motto und die Quellenangabe füge ich weiter unten
im HTML-Dokument mit:
<!-- Ende Eintragungen -->
<hr />
<!-- Zufallsmotto -->
<?php echo "$motto" ?><br /><i><?php echo "$quelle" ?></i>
ein.
Ich hoffe das verstößt jetzt net allzu sehr gegen die
Foren-Regeln. Wenn doch, wäre ich dankbar, wenn mir
wenigstens die Problemzeile geschildert wird, dann sehe
ich die mir selber nochmal an.
Beste Grüße
Zwerg Alex
Moin zwerg,
Ich hoffe das verstößt jetzt net allzu sehr gegen die
Foren-Regeln.
Nö, aber was sagen Dir die Fehlermeldungen? Gibt es welche?
Und was sagt Dir insbesondere die Funktion print mysql_error();
regds
Mike©
Moin, moin!
Nö, aber was sagen Dir die Fehlermeldungen? Gibt es welche?
Bekomme keine Fehlermeldung(en).
Und was sagt Dir insbesondere die Funktion print mysql_error();
Hab ich noch nie was von gehört. Wie und wo und zu welchem
Zweck gebe ich das ein?
Moin zwerg,
Und was sagt Dir insbesondere die Funktion print mysql_error();
Hab ich noch nie was von gehört. Wie und wo und zu welchem
Zweck gebe ich das ein?
Das liest Du bitte mal hier nach:
http://de.php.net/manual/de/function.mysql-error.php
regds
Mike©
Sorry, hab etwas voreilig gefragt. Hab da auch
beim "googeln" was zu gefunden.
Das liest Du bitte mal hier nach:
http://de.php.net/manual/de/function.mysql-error.php
Also mit "echo mysql_errno() . ": " . mysql_error(). "\n";"
kriege ich "0:" bzw. einmal nur ":", also hilft das wohl auch
net weiter. Oder?
Habe gerade festgestellt, dass die ID (Primärschlüssel der
Tabelle nicht von 1-4 sondern 10, 11, 12 und 15 ist (hatte
zwischendurch was gelöscht. Liegt womöglich da der Fehler?
Moin zwerg,
Habe gerade festgestellt, dass die ID (Primärschlüssel der
Tabelle nicht von 1-4 sondern 10, 11, 12 und 15 ist (hatte
zwischendurch was gelöscht. Liegt womöglich da der Fehler?
Nein.
regds
Mike©
Na ja, doch, irgendwie schon
Auszug aus seinem Code:
$id = rand (1,$max);
$query = "SELECT motto, quelle FROM motto_tabelle WHERE id = $id";
Die Tabelle hat also 4 Sätze. Select COUNT(*) liefert also als Wert für $max 4, $id wird demnach 1..4 - diese Sätze existieren aber nicht.
@zwerg: Nein nein, das ist kein Fehler, IDs sollen lediglich eindeutig sein, von durchgängig und niedrig hat keiner was gesagt, auch wenn viele das immer wieder glauben.
Der grundsätzliche Ansatz der Ermittlung ist unglücklich. Einfacher wäre der Datenbank zu sagen, sie möde nach einem Zufallswert sortieren. Anschließend nimmt man einfach das Ergebnis, das sie als erstes liefert, also schematisch etwa:
SELECT motto, quelle FROM motto_tabelle ORDER BY RAND() LIMIT 1
-> anschließend einfach mit PHP auslesen wie bisher auch angedacht. Das vorherige mit SELECT COUNT(*) etc. kann man sich sparen.
MfG
Rouven
Moin Rouven,
Na ja, doch, irgendwie schon
Auszug aus seinem Code:
$id = rand (1,$max);
$query = "SELECT motto, quelle FROM motto_tabelle WHERE id = $id";Die Tabelle hat also 4 Sätze. Select COUNT(*) liefert also als Wert für $max 4, $id wird demnach 1..4 - diese Sätze existieren aber nicht.
Yep, Du hast Recht und ich habe das in dieser Tiefe nicht betrachtet, da ich befürchte das zwerg die Grundlagen noch nicht so ganz inne hat.
(Asche auf mein Haupt)
Ich wollte zwerg dazu bewegen sich mal mit der eigentlichen Materie zu beschäftigen.
regds
Mike©
Yep, Du hast Recht und ich habe das in dieser Tiefe nicht betrachtet, da ich befürchte das zwerg die Grundlagen noch nicht so ganz inne hat.
(Asche auf mein Haupt)
Ich wollte zwerg dazu bewegen sich mal mit der eigentlichen Materie zu beschäftigen.
Stimmt schon und du hast recht, dass ich die Grundlagen noch
net inne hab. Aber ich dachte learning per doin wär die beste
Methode.
Danke, dass du dich mit meinem Problem beschäftigt hast.
@zwerg: Nein nein, das ist kein Fehler, IDs sollen lediglich eindeutig sein, von durchgängig und niedrig hat keiner was gesagt, auch wenn viele das immer wieder glauben.
Der grundsätzliche Ansatz der Ermittlung ist unglücklich. Einfacher wäre der Datenbank zu sagen, sie möde nach einem Zufallswert sortieren. Anschließend nimmt man einfach das Ergebnis, das sie als erstes liefert, also schematisch etwa:
SELECT motto, quelle FROM motto_tabelle ORDER BY RAND() LIMIT 1
-> anschließend einfach mit PHP auslesen wie bisher auch angedacht. Das vorherige mit SELECT COUNT(*) etc. kann man sich sparen.
Danke für den Tipp. Werde mich in diese Richtung mal schlau machen.
Noch nen angenehmes Wochenende.
Moin zwerg,
Also mit "echo mysql_errno() . ": " . mysql_error(). "\n";"
kriege ich "0:" bzw. einmal nur ":", also hilft das wohl auch
net weiter. Oder?
du musst es richtig einsetzen. Ich befürchte das Du es nicht auf die Husche und vielleciht auch nicht um diese Uhrzeit hinbekommst.
Ein geeignter Punkt wäre hier. (Habe ich nicht als potenielle Fehlerquelle gecheckt, ist nur ein Beispiel)
$max = mysql_result ($sql,0);
if (!$max)
{
print mysql_error();
die("Query $query ist ungültiges SQL.");
}
BTW: Deine Syntax stimmt nicht. Bitte nimm das SQL Handuch zu Hilfe.
regds
Mike©
du musst es richtig einsetzen. Ich befürchte das Du es nicht auf die Husche und vielleciht auch nicht um diese Uhrzeit hinbekommst.
Du hast wohl recht. Aber danke für deine Mühen. Werd das wohl
erstmal verschieben, bis ich etwas fiter in PHP und MySQL bin.
BTW: Deine Syntax stimmt nicht. Bitte nimm das SQL Handuch zu Hilfe.
Hab vor meinem Posting die Bücher gewälzt, leider ohne Erfolg.
Angenehmen "Abend" noch.
Gruß
Zwerg Alex
Moin zwerg,
Du hast wohl recht. Aber danke für deine Mühen. Werd das wohl
erstmal verschieben, bis ich etwas fiter in PHP und MySQL bin.
habe ich es überlesen, oder hast Du niergendwo geschildert was passiert. Bzw. was nicht passiert?
Deine Original Beschreibung lautet: "klappt net"
Hmmm, "klappt net zu" oder was?
Bitte liefere eine genauere Beschreibung. Was "klappt net" und wie äußert sich das?
regds
Mike©
habe ich es überlesen, oder hast Du niergendwo geschildert was passiert. Bzw. was nicht passiert?
Es passiert garnichts. Ich bekomme weder eine Fehlermeldung,
noch gibt mir
"<?php echo "$motto" ?><br /><i><?php echo "$quelle"; ?>"
irgendetwas aus.
Deine Original Beschreibung lautet: "klappt net"
Hmmm, "klappt net zu" oder was?Bitte liefere eine genauere Beschreibung. Was "klappt net" und wie äußert sich das?
Ich weiß ja nicht, was net klappt; also wo der Fehler liegt.
Ob es an der Zufalls-ID liegt oder ob ich irgendwas vergessen
hab. Normalerweise bekomme ich ja immer eine Fehlermeldung,
dann weiß ich, wo ich nachlesen kann bzw. kann damit
die Suchmaschinen bemühen.
Deswegen habe ich das komplette Skript gepostet, dachte
vlt. liegt da ein (für Gurus) offensichtlicher Fehler drin.
P.S. Wollte net unhöflich klingen, aber ich dachte "wir" finden
heute eh keine Lösung mehr und du hast die Lust daran verloren
dich dessen anzunehmen und wollte deshalb den Thread schließen.
Moin zwerg,
P.S. Wollte net unhöflich klingen, aber ich dachte "wir" finden
heute eh keine Lösung mehr und du hast die Lust daran verloren
dich dessen anzunehmen und wollte deshalb den Thread schließen.
Nö, die Lust stirbt zuletzt :-)
Brachte Dich Rouvens Hinweis weiter?
regds
Mike©
Moin zwerg,
habe ich es überlesen, oder hast Du niergendwo geschildert was passiert. Bzw. was nicht passiert?
ich werde mich jetzt auf die Matraze hauen. Als Tip noch. Bitte lasse Dir die Variablen ausgeben und prüfe ob sie Deinen erwarteten Ergebnissen entsprechen.
(Ich behalte diesen Thread im Auge)
regds
Mike©
echo $begrüßung;
$max = mysql_result ($sql,0);
if (!$max)
{
print mysql_error();
die("Query $query ist ungültiges SQL.");
}
Das geht so nicht, denn wenn in der ersten Spalte der ersten Zeile '0' oder 0 steht ergibt !$max auch true und das ist ja wohl kein Fehler. Hier sollte mit einem typsicheren === auf false geprüft werden, denn false kann von MySQL nicht zurückgegeben werden, weil keinen boolschen Datentyp kennt. (Und nein, BOOL und BOOLEAN sind keine boolschen Datentypen sondern Aliase auf TINYINT(1), also Integer.)
echo "$verabschiedung $name";
echo $begrüßung;
Die Verbindung wird offenbar richtig aufgebaut.
Es besteht kein Grund, hier zu raten. Wenn eine der mysql_*-Funktionen einen Fehler feststellt gibt sie false zurück. Auf diesen Rückgabewert ist unbedingt einzugehen, weil er zum einen kein gültiges Argument für nachfolgende mysql_*-Funktionen darstellt, welche sich mit einer PHP-Fehlermeldung beschweren, und zum anderen ein normales Weiterlaufen nach einem Fehler sinnlos wird.
echo "$verabschiedung $name";